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}")
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