def generate_shares(f):
    logger.info('Starting to generate shares for: {}'.format(f.name))

    manifest = manifest_utils.load(f)
    deployment_map = manifest_utils.build_deployment_map(
        manifest, constants.LAUNCHES)
    import_map = manifest_utils.build_deployment_map(
        manifest, constants.SPOKE_LOCAL_PORTFOLIOS)
    cli_command_helpers.create_share_template(
        deployment_map, import_map,
        cli_command_helpers.get_puppet_account_id())
def deploy_launches(manifest):
    section = constants.LAUNCHES
    deployment_map = manifest_utils.build_deployment_map(manifest, section)
    deployment_map = set_regions_for_deployment_map(deployment_map, section)
    puppet_account_id = get_puppet_account_id()

    all_tasks = deploy_launches_task_builder(deployment_map, manifest, puppet_account_id, section)

    logger.info(f"Deployment plan: {json.dumps(all_tasks)}")
    return all_tasks
def list_launches(f, format):
    manifest = manifest_utils.load(f)
    if format == "table":
        click.echo("Getting details from your account...")
    ALL_REGIONS = cli_command_helpers.get_regions(
        os.environ.get("AWS_DEFAULT_REGION"))
    deployment_map = manifest_utils.build_deployment_map(
        manifest, constants.LAUNCHES)
    account_ids = [a.get('account_id') for a in manifest.get('accounts')]
    deployments = {}
    for account_id in account_ids:
        for region_name in ALL_REGIONS:
            role = "arn:aws:iam::{}:role/{}".format(
                account_id, 'servicecatalog-puppet/PuppetRole')
            logger.info("Looking at region: {} in account: {}".format(
                region_name, account_id))
            with betterboto_client.CrossAccountClientContextManager(
                    'servicecatalog',
                    role,
                    'sc-{}-{}'.format(account_id, region_name),
                    region_name=region_name) as spoke_service_catalog:

                response = spoke_service_catalog.list_accepted_portfolio_shares(
                )
                portfolios = response.get('PortfolioDetails', [])

                response = spoke_service_catalog.list_portfolios()
                portfolios += response.get('PortfolioDetails', [])

                for portfolio in portfolios:
                    portfolio_id = portfolio.get('Id')
                    response = spoke_service_catalog.search_products_as_admin(
                        PortfolioId=portfolio_id)
                    for product_view_detail in response.get(
                            'ProductViewDetails', []):
                        product_view_summary = product_view_detail.get(
                            'ProductViewSummary')
                        product_id = product_view_summary.get('ProductId')
                        response = spoke_service_catalog.search_provisioned_products(
                            Filters={
                                'SearchQuery':
                                ["productId:{}".format(product_id)]
                            })
                        for provisioned_product in response.get(
                                'ProvisionedProducts', []):
                            launch_name = provisioned_product.get('Name')
                            status = provisioned_product.get('Status')

                            provisioning_artifact_response = spoke_service_catalog.describe_provisioning_artifact(
                                ProvisioningArtifactId=provisioned_product.get(
                                    'ProvisioningArtifactId'),
                                ProductId=provisioned_product.get('ProductId'),
                            ).get('ProvisioningArtifactDetail')

                            if deployments.get(account_id) is None:
                                deployments[account_id] = {
                                    'account_id': account_id,
                                    constants.LAUNCHES: {}
                                }

                            if deployments[account_id][constants.LAUNCHES].get(
                                    launch_name) is None:
                                deployments[account_id][
                                    constants.LAUNCHES][launch_name] = {}

                            deployments[account_id][constants.LAUNCHES][
                                launch_name][region_name] = {
                                    'launch_name':
                                    launch_name,
                                    'portfolio':
                                    portfolio.get('DisplayName'),
                                    'product':
                                    manifest.get(constants.LAUNCHES,
                                                 {}).get(launch_name,
                                                         {}).get('product'),
                                    'version':
                                    provisioning_artifact_response.get('Name'),
                                    'active':
                                    provisioning_artifact_response.get(
                                        'Active'),
                                    'region':
                                    region_name,
                                    'status':
                                    status,
                                }
                            output_path = os.path.sep.join([
                                constants.LAUNCHES_PATH,
                                account_id,
                                region_name,
                            ])
                            if not os.path.exists(output_path):
                                os.makedirs(output_path)

                            output = os.path.sep.join([
                                output_path,
                                "{}.json".format(provisioned_product.get('Id'))
                            ])
                            with open(output, 'w') as f:
                                f.write(
                                    json.dumps(provisioned_product,
                                               indent=4,
                                               default=str))

    results = {}
    for account_id, details in deployment_map.items():
        for launch_name, launch in details.get(constants.LAUNCHES, {}).items():
            if deployments.get(account_id, {}).get(
                    constants.LAUNCHES, {}).get(launch_name) is None:
                pass
            else:
                for region, regional_details in deployments[account_id][
                        constants.LAUNCHES][launch_name].items():
                    results[f"{account_id}_{region}_{launch_name}"] = {
                        'account_id': account_id,
                        'region': region,
                        'launch': launch_name,
                        'portfolio': regional_details.get('portfolio'),
                        'product': regional_details.get('product'),
                        'expected_version': launch.get('version'),
                        'actual_version': regional_details.get('version'),
                        'active': regional_details.get('active'),
                        'status': regional_details.get('status'),
                    }

    if format == "table":
        table = [[
            'account_id',
            'region',
            'launch',
            'portfolio',
            'product',
            'expected_version',
            'actual_version',
            'active',
            'status',
        ]]

        for result in results.values():
            table.append([
                result.get('account_id'),
                result.get('region'),
                result.get('launch'),
                result.get('portfolio'),
                result.get('product'),
                result.get('expected_version'),
                Color("{green}" + result.get('actual_version') + "{/green}") if
                result.get('actual_version') == result.get('expected_version')
                else Color("{red}" + result.get('actual_version') + "{/red}"),
                Color("{green}" + str(result.get('active')) +
                      "{/green}") if result.get('active') else
                Color("{red}" + str(result.get('active')) + "{/red}"),
                Color("{green}" + result.get('status') +
                      "{/green}") if result.get('status') == "AVAILABLE" else
                Color("{red}" + result.get('status') + "{/red}")
            ])
        click.echo(terminaltables.AsciiTable(table).table)

    elif format == "json":
        click.echo(json.dumps(
            results,
            indent=4,
            default=str,
        ))

    else:
        raise Exception(f"Unsupported format: {format}")
Ejemplo n.º 4
0
def deploy_spoke_local_portfolios(manifest, launch_tasks):
    section = constants.SPOKE_LOCAL_PORTFOLIOS
    deployment_map = manifest_utils.build_deployment_map(manifest, section)
    deployment_map = set_regions_for_deployment_map(deployment_map, section)

    tasks_to_run = []
    puppet_account_id = get_puppet_account_id()

    for account_id, deployments_for_account in deployment_map.items():
        for launch_name, launch_details in deployments_for_account.get(
                section).items():
            for region_name in launch_details.get('regions'):

                depends_on = launch_details.get('depends_on')
                dependencies = []
                for dependency in depends_on:
                    for task_uid, task in launch_tasks.items():
                        if task.get('launch_name') == dependency:
                            dependencies.append(task)

                hub_portfolio = aws.get_portfolio_for(
                    launch_details.get('portfolio'), puppet_account_id,
                    region_name)

                create_spoke_local_portfolio_task_params = {
                    'account_id': account_id,
                    'region': region_name,
                    'portfolio': launch_details.get('portfolio'),
                    'provider_name': hub_portfolio.get('ProviderName'),
                    'description': hub_portfolio.get('Description'),
                }
                create_spoke_local_portfolio_task = luigi_tasks_and_targets.CreateSpokeLocalPortfolioTask(
                    **create_spoke_local_portfolio_task_params)
                tasks_to_run.append(create_spoke_local_portfolio_task)

                create_spoke_local_portfolio_task_as_dependency_params = {
                    'account_id': account_id,
                    'region': region_name,
                    'portfolio': launch_details.get('portfolio'),
                }

                create_associations_task_params = {
                    'associations': launch_details.get('associations'),
                    'puppet_account_id': puppet_account_id,
                }
                create_associations_for_portfolio_task = luigi_tasks_and_targets.CreateAssociationsForPortfolioTask(
                    **create_spoke_local_portfolio_task_as_dependency_params,
                    **create_associations_task_params,
                    dependencies=dependencies,
                )
                tasks_to_run.append(create_associations_for_portfolio_task)

                import_into_spoke_local_portfolio_task_params = {
                    'hub_portfolio_id': hub_portfolio.get('Id')
                }
                import_into_spoke_local_portfolio_task = luigi_tasks_and_targets.ImportIntoSpokeLocalPortfolioTask(
                    **create_spoke_local_portfolio_task_as_dependency_params,
                    **import_into_spoke_local_portfolio_task_params,
                )
                tasks_to_run.append(import_into_spoke_local_portfolio_task)

                launch_constraints = launch_details.get('constraints',
                                                        {}).get('launch', [])
                if len(launch_constraints) > 0:
                    create_launch_role_constraints_for_portfolio_task_params = {
                        'launch_constraints': launch_constraints,
                        'puppet_account_id': puppet_account_id,
                    }
                    create_launch_role_constraints_for_portfolio = luigi_tasks_and_targets.CreateLaunchRoleConstraintsForPortfolio(
                        **
                        create_spoke_local_portfolio_task_as_dependency_params,
                        **import_into_spoke_local_portfolio_task_params,
                        **
                        create_launch_role_constraints_for_portfolio_task_params,
                        dependencies=dependencies,
                    )
                    tasks_to_run.append(
                        create_launch_role_constraints_for_portfolio)

    return tasks_to_run