Пример #1
0
    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
Пример #2
0
    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,
            )
Пример #3
0
    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,
            )
Пример #4
0
    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
Пример #5
0
    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!")
Пример #6
0
    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!")
Пример #7
0
    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)
Пример #8
0
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()