def explode(f): logger.info("Exploding") puppet_account_id = config.get_puppet_account_id() original_name = f.name expanded_output = f.name.replace(".yaml", "-expanded.yaml") expanded_manifest = manifest_utils.load( open(expanded_output, "r"), puppet_account_id ) expanded_manifest = manifest_utils.Manifest(expanded_manifest) exploded = manifest_utils.explode(expanded_manifest) logger.info(f"found {len(exploded)} graphs") count = 0 for mani in exploded: with open(original_name.replace(".yaml", f"-exploded-{count}.yaml"), "w") as f: f.write(yaml.safe_dump(json.loads(json.dumps(mani)))) count += 1
def expand(f, single_account, subset=None): click.echo("Expanding") puppet_account_id = config.get_puppet_account_id() manifest = manifest_utils.load(f, puppet_account_id) org_iam_role_arn = config.get_org_iam_role_arn(puppet_account_id) if org_iam_role_arn is None: click.echo("No org role set - not expanding") new_manifest = manifest else: click.echo("Expanding using role: {}".format(org_iam_role_arn)) with betterboto_client.CrossAccountClientContextManager( "organizations", org_iam_role_arn, "org-iam-role") as client: new_manifest = manifest_utils.expand_manifest(manifest, client) click.echo("Expanded") if single_account: click.echo(f"Filtering for single account: {single_account}") for account in new_manifest.get("accounts", []): if str(account.get("account_id")) == str(single_account): click.echo(f"Found single account: {single_account}") new_manifest["accounts"] = [account] break click.echo("Filtered") new_manifest = manifest_utils.rewrite_depends_on(new_manifest) if subset: click.echo(f"Filtering for subset: {subset}") new_manifest = manifest_utils.isolate( manifest_utils.Manifest(new_manifest), subset) new_manifest = json.loads(json.dumps(new_manifest)) if new_manifest.get(constants.LAMBDA_INVOCATIONS) is None: new_manifest[constants.LAMBDA_INVOCATIONS] = dict() new_name = f.name.replace(".yaml", "-expanded.yaml") logger.info("Writing new manifest: {}".format(new_name)) with open(new_name, "w") as output: output.write(yaml.safe_dump(new_manifest, default_flow_style=False))
def manifest(self): return manifest_utils.Manifest(self.load_from_input("manifest"))
def expand(f, puppet_account_id, single_account, subset=None): click.echo("Expanding") manifest = manifest_utils.load(f, puppet_account_id) org_iam_role_arn = config.get_org_iam_role_arn(puppet_account_id) if org_iam_role_arn is None: click.echo("No org role set - not expanding") new_manifest = manifest else: click.echo("Expanding using role: {}".format(org_iam_role_arn)) with betterboto_client.CrossAccountClientContextManager( "organizations", org_iam_role_arn, "org-iam-role" ) as client: new_manifest = manifest_utils.expand_manifest(manifest, client) click.echo("Expanded") if single_account: click.echo(f"Filtering for single account: {single_account}") for account in new_manifest.get("accounts", []): if str(account.get("account_id")) == str(single_account): click.echo(f"Found single account: {single_account}") new_manifest["accounts"] = [account] break click.echo("Filtered") new_manifest = manifest_utils.rewrite_depends_on(new_manifest) new_manifest = manifest_utils.rewrite_ssm_parameters(new_manifest) new_manifest = manifest_utils.rewrite_stacks(new_manifest, puppet_account_id) if subset: click.echo(f"Filtering for subset: {subset}") new_manifest = manifest_utils.isolate( manifest_utils.Manifest(new_manifest), subset ) new_manifest = json.loads(json.dumps(new_manifest)) if new_manifest.get(constants.LAMBDA_INVOCATIONS) is None: new_manifest[constants.LAMBDA_INVOCATIONS] = dict() home_region = config.get_home_region(puppet_account_id) with betterboto_client.ClientContextManager("ssm") as ssm: response = ssm.get_parameter(Name="service-catalog-puppet-version") version = response.get("Parameter").get("Value") new_manifest["config_cache"] = dict( home_region=home_region, regions=config.get_regions(puppet_account_id, home_region), should_collect_cloudformation_events=config.get_should_use_sns( puppet_account_id, home_region ), should_forward_events_to_eventbridge=config.get_should_use_eventbridge( puppet_account_id, home_region ), should_forward_failures_to_opscenter=config.get_should_forward_failures_to_opscenter( puppet_account_id, home_region ), puppet_version=version, ) new_name = f.name.replace(".yaml", "-expanded.yaml") logger.info("Writing new manifest: {}".format(new_name)) with open(new_name, "w") as output: output.write(yaml.safe_dump(new_manifest, default_flow_style=False))
def manifest(self): content = open(self.manifest_file_path, "r").read() return manifest_utils.Manifest(yaml.safe_load(content))
def run(self): manifest = manifest_utils.Manifest(self.load_from_input("manifest")) lambda_invocation = manifest.get("lambda-invocations").get(self.lambda_invocation_name) dependencies = list() for dependency in lambda_invocation.get('depends_on', []): if isinstance(dependency, str): dependencies.append( LaunchTask( launch_name=dependency, manifest_file_path=self.manifest_file_path, puppet_account_id=self.puppet_account_id, should_use_sns=self.should_use_sns, should_use_product_plans=self.should_use_product_plans, include_expanded_from=self.include_expanded_from, single_account=self.single_account, is_dry_run=self.is_dry_run, execution_mode="hub", ) ) else: dependency_type = dependency.get('type', 'launch') if dependency_type == "launch": dependencies.append( LaunchTask( launch_name=dependency.get('name'), manifest_file_path=self.manifest_file_path, puppet_account_id=self.puppet_account_id, should_use_sns=self.should_use_sns, should_use_product_plans=self.should_use_product_plans, include_expanded_from=self.include_expanded_from, single_account=self.single_account, is_dry_run=self.is_dry_run, execution_mode="hub", ) ) elif dependency_type == "lambda-invocation": dependencies.append( self.__class__( lambda_invocation_name=dependency.get('name'), manifest_file_path=self.manifest_file_path, puppet_account_id=self.puppet_account_id, should_use_sns=self.should_use_sns, should_use_product_plans=self.should_use_product_plans, include_expanded_from=self.include_expanded_from, single_account=self.single_account, is_dry_run=self.is_dry_run, ) ) yield dependencies task_defs = manifest.get_task_defs_from_details( self.puppet_account_id, True, self.lambda_invocation_name, {}, "lambda-invocations", ) common_params = { "lambda_invocation_name": self.lambda_invocation_name, "function_name": lambda_invocation.get("function_name"), "qualifier": lambda_invocation.get("qualifier", "$LATEST"), "invocation_type": lambda_invocation.get("invocation_type"), "puppet_account_id": self.puppet_account_id, "parameters": lambda_invocation.get("parameters", {}), "launch_parameters": lambda_invocation.get('parameters', {}), "manifest_parameters": manifest.get('parameters', {}), } for task_def in task_defs: task_def_parameters = { "account_id": task_def.get('account_id'), "region": task_def.get('region'), "account_parameters": task_def.get('account_parameters'), } task_def_parameters.update(common_params) yield InvokeLambdaTask(**task_def_parameters) self.write_output(self.params_for_results_display())