def project(ctx, name, deployer, branches, wait, dryrun, output_location): """Create a new repository with CI/CD using a deployer""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") name = validate_name(name) branches = branches.strip() if "service-trigger" not in deployer or "service-role" not in deployer: raise click.UsageError( "Create a deployer service to be able to create project") Compiler.build_template( deployer, ProjectTemplate.get(name, branches, deployer, config), wait=wait, dryrun=dryrun, output_folder=output_location, ) if "projects" not in deployer: deployer["projects"] = [] deployer["projects"].append(name) save_deployer(deployer, config)
def subscription(ctx, name, deployer, emails, wait, dryrun, output_location): """Create a subscription and subscribe email addresses to it""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") if deployer.get("cloud", "").upper() == "GCP": raise RuntimeError("Subscriptions are not available for GCP") name = validate_name(name) emails = validate_emails(emails) if len(emails) == 0: raise click.BadParameter("There is no valid email address") Compiler.build_template( deployer, SubscriptionDeployerTemplate.get(name, emails, deployer, config), wait=wait, dryrun=dryrun, output_folder=output_location, ) if "subscriptions" not in deployer: deployer["subscriptions"] = [] deployer["subscriptions"].append(f"{deployer['name']}-deployer-{name}") save_deployer(deployer, config)
def project( ctx, deployer, project, stack_file, package_script, dryrun, output_location ): """Deploy a project build""" ctx.obj.require_cloud_access() config = ctx.obj.config if not CodebuildHelper.is_codebuild(): if deployer is None: raise click.UsageError("You must specify a deployer") deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") if "deployment-workflow" not in deployer: raise click.UsageError("Your deployer doesn't have a deployment workflow") deployer["deployment-workflow-id"] = get_workflow_id( deployer["deployment-workflow"], config ) deployer["project"] = project else: deployer = { "artifact": os.environ["ARTIFACTS_BUCKET"], "deployment-workflow-id": os.environ["DEPLOYER_STATE_MACHINE_ARN"], "project": CodebuildHelper.get_project(), } deploy_project( deployer, project, stack_file, package_script, dryrun, output_location )
def project(ctx, name, deployer, wait, dryrun): """Remove the CICD integration from existing project. Does not delete the repository.""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") template = ProjectTemplate.get(name, "", deployer, config) template[0]["template"]["parameters"]["cleanup"] = "true" Compiler.cleanup(deployer, template, wait=wait, dryrun=dryrun)
def test_load_deployer(deployer, config, configfile): home_folder = configfile["cli"].get("home_folder") test_deployer = home_folder + "/test.json" assert file_exists(test_deployer) is False save_deployer(deployer, config) assert file_exists(test_deployer) is True saved_deployer = load_deployer(config, "test") for key in saved_deployer: assert saved_deployer[key] == deployer[key] delete_deployer(config, "test") assert file_exists(test_deployer) is False
def deployer(ctx, name, confirm): """Delete deployer configuration. Does not delete the repository""" config = ctx.obj.config deployer = load_deployer(config, name) if deployer is None: raise click.BadParameter(f"Deployer {name} does not exist") if confirm: delete_deployer(config, name) else: raise click.UsageError( "Add the flag --confirm to confirm you want to delete your deployer" )
def repository(ctx, deployer, wait, dryrun): """Remove the CICD integration of your deployer repository. Does not delete the repository""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") template = DeployerRepositoryTemplate.get(deployer, config) template[0]["template"]["parameters"]["cleanup"] = "true" Compiler.cleanup(deployer, template, wait=wait, dryrun=dryrun) del deployer["repository"] save_deployer(deployer, config)
def core(ctx, deployer, wait, dryrun): """Deploy core step function""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") Compiler.cleanup(deployer, CoreDeployerTemplate.get(deployer, config), wait=wait, dryrun=dryrun) del deployer["deployment-workflow"] save_deployer(deployer, config)
def core(ctx, deployer, wait, dryrun, output_location): """Deploy core step function""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") Compiler.build_template( deployer, CoreDeployerTemplate.get(deployer, config), wait=wait, dryrun=dryrun, output_folder=output_location, ) deployer["deployment-workflow"] = f"{deployer['name']}-deployer-core" deployer["account"] = config.get("aws", "account", None) save_deployer(deployer, config)
def service(ctx, deployer, wait, dryrun): """Deploy core step function""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") Compiler.cleanup( deployer, ServiceDeployerTemplate.get(deployer, config), wait=wait, dryrun=dryrun, ) del deployer["codebuild-service"] del deployer["service-trigger"] del deployer["service-role"] save_deployer(deployer, config)
def service(ctx, deployer, wait, dryrun, output_location): """Create a service for other codecommit repositories""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") Compiler.build_template( deployer, ServiceDeployerTemplate.get(deployer, config), wait=wait, dryrun=dryrun, output_folder=output_location, ) deployer["codebuild-service"] = f"{deployer['name']}-deployer-service" deployer["service-trigger"] = f"{deployer['name']}-deployer-service-trigger" deployer["service-role"] = f"{deployer['name']}-deployer-service-role" save_deployer(deployer, config)
def subscription(ctx, name, deployer, wait, dryrun): """Deploy core step function""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") if "subscriptions" not in deployer or name not in deployer["subscriptions"]: raise click.BadParameter(f"Subscription {name} does not exists") Compiler.cleanup( deployer, SubscriptionDeployerTemplate.get(name, [], deployer, config), wait=wait, dryrun=dryrun, ) deployer["subscriptions"] = [ x for x in deployer["subscriptions"] if x != name ] save_deployer(deployer, config)
def repository(ctx, deployer, wait, dryrun, output_location): """Create a repository with CI/CD to update core functionalities of your deployer""" ctx.obj.require_cloud_access() config = ctx.obj.config deployer = load_deployer(config, deployer) if deployer is None: raise click.BadParameter(f"Deployer {deployer} does not exist") Compiler.build_template( deployer, DeployerRepositoryTemplate.get(deployer, config), wait=wait, dryrun=dryrun, output_folder=output_location, ) deployer["repository"] = f"{deployer['name']}-deployer" save_deployer(deployer, config)
def test_cleanup_others(deployer, config): os.environ["FREELDEP_CONFIG"] = CONFIG_SAMPLE os.environ["AWS_PROFILE"] = "pytest" os.environ["AWS_DEFAULT_REGION"] = "ap-southeast-1" os.environ["PYTEST"] = "true" runner = CliRunner() result = runner.invoke( cli, [ "cleanup", "subscription", "testt-deployer-test", "--deployer", "testt", "--dryrun", ], ) assert result.exit_code == 0 depl = load_deployer(config, "testt") assert "testt-deployer-test" not in depl["subscriptions"] os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, [ "cleanup", "subscription", "asdasdsda", "--deployer", "testt", "--dryrun" ], ) assert result.exit_code != 0 os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, [ "cleanup", "subscription", "asdasdsda", "--deployer", "asdasdasd", "--dryrun" ], ) assert result.exit_code != 0 os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, ["cleanup", "project", "testproj", "--deployer", "testt", "--dryrun"], ) assert result.exit_code == 0 depl = load_deployer(config, "testt") assert "project" not in depl or "testproj" not in depl["project"] os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, [ "cleanup", "project", "asdasdasd", "--deployer", "jhghgjghj", "--dryrun" ], ) assert result.exit_code != 0 os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, ["cleanup", "repository", "--deployer", "testt", "--dryrun"], ) assert result.exit_code == 0 depl = load_deployer(config, "testt") print(depl) assert "repository" not in depl os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, ["cleanup", "repository", "--deployer", "asdasdasd", "--dryrun"], ) assert result.exit_code != 0
def test_create_others(deployer, config, aws_credentials): os.environ["FREELDEP_CONFIG"] = CONFIG_SAMPLE os.environ["AWS_PROFILE"] = "pytest" os.environ["AWS_DEFAULT_REGION"] = "ap-southeast-1" os.environ["PYTEST"] = "true" runner = CliRunner() result = runner.invoke( cli, [ "create", "subscription", "test", "--emails", "*****@*****.**", "--deployer", "testt", "--dryrun", "--output-location", "out/", ], ) assert result.exit_code == 0 assert os.path.isfile("out/testt-deployer-test-subscription.config.yaml") assert os.path.isfile("out/testt-deployer-test-subscription.yaml") returncall = call("cfn-lint out/testt-deployer-test-subscription.yaml", shell=True) assert returncall == 0 depl = load_deployer(config, "testt") assert "testt-deployer-test" in depl["subscriptions"] os.environ["AWS_PROFILE"] = "pytest" runner = CliRunner() result = runner.invoke( cli, [ "create", "project", "testproj", "--deployer", "testt", "--dryrun", "--output-location", "out/", ], ) assert returncall == 0 assert result.exit_code == 0 assert os.path.isfile("out/testt-deployer-project-testproj.config.yaml") assert os.path.isfile("out/testt-deployer-project-testproj.yaml") returncall = call("cfn-lint out/testt-deployer-project-testproj.yaml", shell=True) assert returncall == 0 os.environ["AWS_PROFILE"] = "pytest" result = runner.invoke( cli, [ "create", "repository", "--deployer", "testt", "--dryrun", "--output-location", "out/", ], ) assert result.exit_code == 0 assert os.path.isfile("out/testt-deployer-repository-stack.config.yaml") assert os.path.isfile("out/testt-deployer-repository-stack.yaml") returncall = call("cfn-lint out/testt-deployer-repository-stack.yaml", shell=True) assert returncall == 0
def test_load_missing_deployer(deployer, config, configfile): saved_deployer = load_deployer(config, "test") assert saved_deployer is None