def prompt_image_repository(self, stacks: List[Stack]): """ Prompt for the image repository to push the images. For each image function found in build artifacts, it will prompt for an image repository. Parameters ---------- stacks : List[Stack] List of stacks to look for image functions. Returns ------- Dict A dictionary contains image function logical ID as key, image repository as value. """ image_repositories = {} artifacts_format = get_template_artifacts_format( template_file=self.template_file) if IMAGE in artifacts_format: self.function_provider = SamFunctionProvider( stacks, ignore_code_extraction_warnings=True) function_resources = get_template_function_resource_ids( template_file=self.template_file, artifact=IMAGE) for resource_id in function_resources: image_repositories[resource_id] = prompt( f"\t{self.start_bold}Image Repository for {resource_id}{self.end_bold}", default=self.image_repositories.get(resource_id, "") if isinstance(self.image_repositories, dict) else "" or self.image_repository, ) if not is_ecr_url(image_repositories.get(resource_id)): raise GuidedDeployFailedError( f"Invalid Image Repository ECR URI: {image_repositories.get(resource_id)}" ) for resource_id, function_prop in self.function_provider.functions.items( ): if function_prop.packagetype == IMAGE: image = function_prop.imageuri try: tag = tag_translation(image) except NonLocalImageException: pass except NoImageFoundException as ex: raise GuidedDeployFailedError( "No images found to deploy, try running sam build" ) from ex else: click.secho( f"\t {image} to be pushed to {image_repositories.get(resource_id)}:{tag}" ) click.secho(nl=True) return image_repositories
def run(self): try: _parameter_override_keys = get_template_parameters( template_file=self.template_file) except ValueError as ex: LOG.debug("Failed to parse SAM template", exc_info=ex) raise GuidedDeployFailedError(str(ex)) from ex guided_config = GuidedConfig(template_file=self.template_file, section=self.config_section) guided_config.read_config_showcase( self.config_file or DEFAULT_CONFIG_FILE_NAME, ) self.guided_prompts(_parameter_override_keys) if self.save_to_config: guided_config.save_config( self._parameter_overrides, self.config_env or DEFAULT_ENV, self.config_file or DEFAULT_CONFIG_FILE_NAME, stack_name=self.guided_stack_name, s3_bucket=self.guided_s3_bucket, s3_prefix=self.guided_s3_prefix, image_repositories=self.guided_image_repositories, region=self.guided_region, profile=self.guided_profile, confirm_changeset=self.confirm_changeset, capabilities=self._capabilities, signing_profiles=self.signing_profiles, )
def run(self): try: _parameter_override_keys = get_template_parameters( template_file=self.template_file) except ValueError as ex: LOG.debug("Failed to parse SAM template", exc_info=ex) raise GuidedDeployFailedError(str(ex)) guided_config = GuidedConfig(template_file=self.template_file, section=self.config_section) guided_config.read_config_showcase() self.guided_prompts(_parameter_override_keys) if self.save_to_config: guided_config.save_config( self._parameter_overrides, stack_name=self.guided_stack_name, s3_bucket=self.guided_s3_bucket, s3_prefix=self.guided_s3_prefix, region=self.guided_region, profile=self.guided_profile, confirm_changeset=self.confirm_changeset, capabilities=self._capabilities, )
def prompt_image_repository(self, parameter_overrides): image_repositories = {} artifacts_format = get_template_artifacts_format( template_file=self.template_file) if IMAGE in artifacts_format: self.transformed_resources = transform_template( parameter_overrides=parameter_overrides, template_dict=get_template_data( template_file=self.template_file), ) function_resources = get_template_function_resource_ids( template_file=self.template_file, artifact=IMAGE) for resource_id in function_resources: image_repositories[resource_id] = prompt( f"\t{self.start_bold}Image Repository for {resource_id}{self.end_bold}", default=self.image_repositories.get(resource_id, "") if isinstance(self.image_repositories, dict) else "" or self.image_repository, ) if not is_ecr_url(image_repositories.get(resource_id)): raise GuidedDeployFailedError( f"Invalid Image Repository ECR URI: {image_repositories.get(resource_id)}" ) for resource_id, function_prop in self.transformed_resources.functions.items( ): if function_prop.packagetype == IMAGE: image = function_prop.imageuri try: tag = tag_translation(image) except NonLocalImageException: pass except NoImageFoundException as ex: raise GuidedDeployFailedError( "No images found to deploy, try running sam build" ) from ex else: click.secho( f"\t {image} to be pushed to {image_repositories.get(resource_id)}:{tag}" ) click.secho(nl=True) return image_repositories
def prompt_authorization(self, stacks: List[Stack]): auth_required_per_resource = auth_per_resource(stacks) for resource, authorization_required in auth_required_per_resource: if not authorization_required: auth_confirm = confirm( f"\t{self.start_bold}{resource} may not have authorization defined, Is this okay?{self.end_bold}", default=False, ) if not auth_confirm: raise GuidedDeployFailedError( msg="Security Constraints Not Satisfied!")
def prompt_authorization(self, parameter_overrides): auth_required_per_resource = auth_per_resource( parameter_overrides, get_template_data(self.template_file)) for resource, authorization_required in auth_required_per_resource: if not authorization_required: auth_confirm = confirm( f"\t{self.start_bold}{resource} may not have authorization defined, Is this okay?{self.end_bold}", default=False, ) if not auth_confirm: raise GuidedDeployFailedError( msg="Security Constraints Not Satisfied!")
def read_config_showcase(self, config_file=None): _, samconfig = self.get_config_ctx(config_file) status = "Found" if samconfig.exists() else "Not found" msg = ( "Syntax invalid in samconfig.toml; save values " "through sam deploy --guided to overwrite file with a valid set of values." ) config_sanity = samconfig.sanity_check() click.secho("\nConfiguring SAM deploy\n======================", fg="yellow") click.echo(f"\n\tLooking for config file [{config_file}] : {status}") if samconfig.exists(): click.echo("\tReading default arguments : {}".format("Success" if config_sanity else "Failure")) if not config_sanity and samconfig.exists(): raise GuidedDeployFailedError(msg)
def do_cli( template_file, stack_name, s3_bucket, force_upload, s3_prefix, kms_key_id, parameter_overrides, capabilities, no_execute_changeset, role_arn, notification_arns, fail_on_empty_changeset, use_json, tags, metadata, guided, confirm_changeset, region, profile, ): from samcli.commands.package.package_context import PackageContext from samcli.commands.deploy.deploy_context import DeployContext # set capabilities and changeset decision to None, before guided gets input from the user changeset_decision = None _capabilities = None _parameter_overrides = None guided_stack_name = None guided_s3_bucket = None guided_s3_prefix = None guided_region = None if guided: try: _parameter_override_keys = get_template_parameters(template_file=template_file) except ValueError as ex: LOG.debug("Failed to parse SAM template", exc_info=ex) raise GuidedDeployFailedError(str(ex)) read_config_showcase(template_file=template_file) guided_stack_name, guided_s3_bucket, guided_s3_prefix, guided_region, guided_profile, changeset_decision, _capabilities, _parameter_overrides, save_to_config = guided_deploy( stack_name, s3_bucket, region, profile, confirm_changeset, _parameter_override_keys, parameter_overrides ) if save_to_config: save_config( template_file, stack_name=guided_stack_name, s3_bucket=guided_s3_bucket, s3_prefix=guided_s3_prefix, region=guided_region, profile=guided_profile, confirm_changeset=changeset_decision, capabilities=_capabilities, parameter_overrides=_parameter_overrides, ) print_deploy_args( stack_name=guided_stack_name if guided else stack_name, s3_bucket=guided_s3_bucket if guided else s3_bucket, region=guided_region if guided else region, capabilities=_capabilities if guided else capabilities, parameter_overrides=_parameter_overrides if guided else parameter_overrides, confirm_changeset=changeset_decision if guided else confirm_changeset, ) with osutils.tempfile_platform_independent() as output_template_file: with PackageContext( template_file=template_file, s3_bucket=guided_s3_bucket if guided else s3_bucket, s3_prefix=guided_s3_prefix if guided else s3_prefix, output_template_file=output_template_file.name, kms_key_id=kms_key_id, use_json=use_json, force_upload=force_upload, metadata=metadata, on_deploy=True, region=guided_region if guided else region, profile=profile, ) as package_context: package_context.run() with DeployContext( template_file=output_template_file.name, stack_name=guided_stack_name if guided else stack_name, s3_bucket=guided_s3_bucket if guided else s3_bucket, force_upload=force_upload, s3_prefix=guided_s3_prefix if guided else s3_prefix, kms_key_id=kms_key_id, parameter_overrides=sanitize_parameter_overrides(_parameter_overrides) if guided else parameter_overrides, capabilities=_capabilities if guided else capabilities, no_execute_changeset=no_execute_changeset, role_arn=role_arn, notification_arns=notification_arns, fail_on_empty_changeset=fail_on_empty_changeset, tags=tags, region=guided_region if guided else region, profile=profile, confirm_changeset=changeset_decision if guided else confirm_changeset, ) as deploy_context: deploy_context.run()