def generate_launch_constraints()

in servicecatalog_factory/commands/portfolios.py [0:0]


def generate_launch_constraints(p):
    logger.info("generating launch contraints")
    account_id = os.getenv("CODEBUILD_BUILD_ARN").split(":")[4]
    all_regions = get_regions()
    products_by_portfolio = {}
    logger.info("Building up portfolios list")
    for portfolio_file_name in os.listdir(p):
        if ".yaml" in portfolio_file_name:
            p_name = portfolio_file_name.split(".")[0]
            portfolios_file_path = os.path.sep.join([p, portfolio_file_name])
            portfolios = generate_portfolios(portfolios_file_path)
            for portfolio in portfolios.get("Portfolios", []):
                portfolio_name = f"{p_name}-{portfolio.get('DisplayName')}"
                products_by_portfolio[portfolio_name] = []
                products = portfolio.get("Products", []) + portfolio.get(
                    "Components", []
                )
                for product in products:
                    if (
                        product.get("Constraints", {})
                        .get("Launch", {})
                        .get("LocalRoleName")
                        is not None
                    ):
                        products_by_portfolio[portfolio_name].append(
                            {
                                "product_name": product.get("Name"),
                                "local_role_name": product.get("Constraints", {})
                                .get("Launch", {})
                                .get("LocalRoleName"),
                            }
                        )

            products = portfolios.get("Products", []) + portfolios.get("Components", [])
            for product in products:
                if (
                    product.get("Constraints", {})
                    .get("Launch", {})
                    .get("LocalRoleName")
                    is not None
                ):
                    for portfolio_name in product.get("Portfolios"):
                        products_by_portfolio[f"{p_name}-{portfolio_name}"].append(
                            {
                                "product_name": product.get("Name"),
                                "local_role_name": product.get("Constraints", {})
                                .get("Launch", {})
                                .get("LocalRoleName"),
                            }
                        )

    logger.info(f"Finished building up portfolio list: {products_by_portfolio}")

    nested_template = read_from_site_packages(
        "templates/constraint-launch-role-nested.template.yaml"
    )
    parent_template = read_from_site_packages(
        "templates/constraint-launch-role-parent.template.yaml"
    )

    logger.info("starting to write the template")
    if not os.path.exists(f"output/constraints/launch-role"):
        os.makedirs(f"output/constraints/launch-role")

    for region in all_regions:
        logger.info(f"looking at region {region}")
        parent_template_context = []
        for portfolios_name, launch_role_constraints in products_by_portfolio.items():
            nested_template_context = []
            with open(
                os.path.sep.join(
                    [
                        "output",
                        "CreatePortfolioTask",
                        f"{region}-{portfolios_name}.json",
                    ]
                ),
                "r",
            ) as portfolio_json_file:
                portfolio_json = json.loads(portfolio_json_file.read())
                portfolio_id = portfolio_json.get("Id")
            for launch_role_constraint in launch_role_constraints:
                with open(
                    os.path.sep.join(
                        [
                            "output",
                            "CreateProductTask",
                            f'{region}-{launch_role_constraint.get("product_name")}.json',
                        ]
                    ),
                    "r",
                ) as product_json_file:
                    product_json = json.loads(product_json_file.read())
                    product_id = product_json.get("ProductId")
                nested_template_context.append(
                    {
                        "uid": f"{portfolio_id}{product_id}".replace("-", ""),
                        "product_id": product_id,
                        "portfolio_id": portfolio_id,
                        "local_role_name": launch_role_constraint.get(
                            "local_role_name"
                        ),
                    }
                )

            if len(nested_template_context) > 0:
                nested_template_name = f"{region}-{portfolio_id}.template.yaml"
                logger.info(
                    f"About to write a template: output/constraints/launch-role/{nested_template_name}"
                )
                hash_suffix = datetime.now().strftime("%Y-%d-%m--%H:%M:%S-%f")
                nested_content_file = f"output/constraints/launch-role/{nested_template_name}-{hash_suffix}.template.yaml"
                bucket_name = f"sc-factory-pipeline-artifacts-{account_id}-{region}"
                object_key = f"templates/constraints/launch-role/{nested_template_name}-{hash_suffix}.template.yaml"

                nested_content = Template(nested_template).render(
                    VERSION=constants.VERSION,
                    ALL_REGIONS=all_regions,
                    constraints=nested_template_context,
                )
                with open(nested_content_file, "w") as cfn:
                    cfn.write(nested_content)
                logger.info(f"Wrote nested template to {nested_content_file}")
                s3 = boto3.resource("s3")
                s3.meta.client.upload_file(
                    nested_content_file, bucket_name, object_key,
                )
                logger.info(
                    f"Uploaded nested template to s3://{bucket_name}:{object_key}"
                )
                nested_template_url = (
                    f"https://{bucket_name}.s3.{region}.amazonaws.com/{object_key}"
                )
                parent_template_context.append(
                    {
                        "uid": f"{region}{portfolio_id}".replace("-", ""),
                        "url": nested_template_url,
                    }
                )

        logger.info(
            f"About to write a template: output/constraints/launch-role/{region}.template.yaml"
        )
        if os.path.exists(f"output/constraints/launch-role/{region}.template.yaml"):
            with open(
                f"output/constraints/launch-role/{region}.template.yaml", "w"
            ) as cfn:
                main_template = Template(parent_template).render(
                    VERSION=constants.VERSION,
                    ALL_REGIONS=all_regions,
                    nested_templates=parent_template_context,
                )
                logger.info(main_template)
                cfn.write(main_template)
    logger.info("finished writing the template")