Example #1
0
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)
Example #2
0
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)
Example #3
0
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
    )
Example #4
0
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)
Example #5
0
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
Example #6
0
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"
        )
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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)
Example #14
0
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
Example #15
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
Example #16
0
def test_load_missing_deployer(deployer, config, configfile):
    saved_deployer = load_deployer(config, "test")
    assert saved_deployer is None