def test_stack_missing_bucket(self, manage_cfn_stack_mock): manage_cfn_stack_mock.return_value = [] with self.assertRaises(UserException): manage_stack("testProfile", "fakeRegion") manage_cfn_stack_mock.return_value = [{ "OutputKey": "NotSourceBucket", "OutputValue": "AnyValue" }] with self.assertRaises(UserException): manage_stack("testProfile", "fakeRegion")
def guided_prompts(self, parameter_override_keys): default_stack_name = self.stack_name or "sam-app" default_region = self.region or "us-east-1" default_capabilities = ("CAPABILITY_IAM", ) input_capabilities = None click.echo( self.color.yellow( "\n\tSetting default arguments for 'sam deploy'\n\t=========================================" )) stack_name = prompt(f"\t{self.start_bold}Stack Name{self.end_bold}", default=default_stack_name, type=click.STRING) region = prompt(f"\t{self.start_bold}AWS Region{self.end_bold}", default=default_region, type=click.STRING) input_parameter_overrides = self.prompt_parameters( parameter_override_keys, self.start_bold, self.end_bold) click.secho( "\t#Shows you resources changes to be deployed and require a 'Y' to initiate deploy" ) confirm_changeset = confirm( f"\t{self.start_bold}Confirm changes before deploy{self.end_bold}", default=self.confirm_changeset) click.secho( "\t#SAM needs permission to be able to create roles to connect to the resources in your template" ) capabilities_confirm = confirm( f"\t{self.start_bold}Allow SAM CLI IAM role creation{self.end_bold}", default=True) if not capabilities_confirm: input_capabilities = prompt( f"\t{self.start_bold}Capabilities{self.end_bold}", default=list(default_capabilities), type=FuncParamType(func=_space_separated_list_func_type), ) self.prompt_authorization(input_parameter_overrides) save_to_config = confirm( f"\t{self.start_bold}Save arguments to samconfig.toml{self.end_bold}", default=True) s3_bucket = manage_stack(profile=self.profile, region=region) click.echo(f"\n\t\tManaged S3 bucket: {s3_bucket}") click.echo( "\t\tA different default S3 bucket can be set in samconfig.toml") self.guided_stack_name = stack_name self.guided_s3_bucket = s3_bucket self.guided_s3_prefix = stack_name self.guided_region = region self.guided_profile = self.profile self._capabilities = input_capabilities if input_capabilities else default_capabilities self._parameter_overrides = input_parameter_overrides if input_parameter_overrides else self.parameter_overrides self.save_to_config = save_to_config self.confirm_changeset = confirm_changeset
def test_manage_stack_happy_case(self, manage_cfn_stack_mock): expected_bucket_name = "BucketName" manage_cfn_stack_mock.return_value = [{ "OutputKey": "SourceBucket", "OutputValue": expected_bucket_name }] actual_bucket_name = manage_stack("testProfile", "fakeRegion") self.assertEqual(actual_bucket_name, expected_bucket_name)
def guided_deploy( stack_name, s3_bucket, region, profile, confirm_changeset, parameter_override_keys, parameter_overrides ): default_stack_name = stack_name or "sam-app" default_region = region or "us-east-1" default_capabilities = ("CAPABILITY_IAM",) input_capabilities = None color = Colored() start_bold = "\033[1m" end_bold = "\033[0m" click.echo( color.yellow("\n\tSetting default arguments for 'sam deploy'\n\t=========================================") ) stack_name = click.prompt(f"\t{start_bold}Stack Name{end_bold}", default=default_stack_name, type=click.STRING) s3_prefix = stack_name region = click.prompt(f"\t{start_bold}AWS Region{end_bold}", default=default_region, type=click.STRING) input_parameter_overrides = prompt_parameters(parameter_override_keys, start_bold, end_bold) click.secho("\t#Shows you resources changes to be deployed and require a 'Y' to initiate deploy") confirm_changeset = click.confirm( f"\t{start_bold}Confirm changes before deploy{end_bold}", default=confirm_changeset ) click.secho("\t#SAM needs permission to be able to create roles to connect to the resources in your template") capabilities_confirm = click.confirm(f"\t{start_bold}Allow SAM CLI IAM role creation{end_bold}", default=True) if not capabilities_confirm: input_capabilities = click.prompt( f"\t{start_bold}Capabilities{end_bold}", default=default_capabilities[0], type=FuncParamType(func=_space_separated_list_func_type), ) save_to_config = click.confirm(f"\t{start_bold}Save arguments to samconfig.toml{end_bold}", default=True) s3_bucket = manage_stack(profile=profile, region=region) click.echo(f"\n\t\tManaged S3 bucket: {s3_bucket}") click.echo("\t\tA different default S3 bucket can be set in samconfig.toml") return ( stack_name, s3_bucket, s3_prefix, region, profile, confirm_changeset, input_capabilities if input_capabilities else default_capabilities, input_parameter_overrides if input_parameter_overrides else parameter_overrides, save_to_config, )
def do_cli( template_file, s3_bucket, image_repository, image_repositories, s3_prefix, kms_key_id, output_template_file, use_json, force_upload, no_progressbar, metadata, signing_profiles, region, profile, resolve_s3, ): """ Implementation of the ``cli`` method """ from samcli.commands.package.package_context import PackageContext if resolve_s3: s3_bucket = manage_stack(profile=profile, region=region) click.echo(f"\n\t\tManaged S3 bucket: {s3_bucket}") click.echo( "\t\tA different default S3 bucket can be set in samconfig.toml") click.echo("\t\tOr by specifying --s3-bucket explicitly.") with PackageContext( template_file=template_file, s3_bucket=s3_bucket, image_repository=image_repository, image_repositories=image_repositories, s3_prefix=s3_prefix, kms_key_id=kms_key_id, output_template_file=output_template_file, use_json=use_json, force_upload=force_upload, no_progressbar=no_progressbar, metadata=metadata, region=region, profile=profile, signing_profiles=signing_profiles, ) as package_context: package_context.run()
def do_cli( template_file, s3_bucket, s3_prefix, kms_key_id, output_template_file, use_json, force_upload, no_progressbar, metadata, signing_profiles, region, profile, resolve_s3, ): from samcli.commands.package.package_context import PackageContext from samcli.commands.package.exceptions import PackageResolveS3AndS3SetError, PackageResolveS3AndS3NotSetError if resolve_s3 and bool(s3_bucket): raise PackageResolveS3AndS3SetError() if not resolve_s3 and not bool(s3_bucket): raise PackageResolveS3AndS3NotSetError() if resolve_s3: s3_bucket = manage_stack(profile=profile, region=region) click.echo(f"\n\t\tManaged S3 bucket: {s3_bucket}") click.echo( "\t\tA different default S3 bucket can be set in samconfig.toml") click.echo("\t\tOr by specifying --s3-bucket explicitly.") with PackageContext( template_file=template_file, s3_bucket=s3_bucket, s3_prefix=s3_prefix, kms_key_id=kms_key_id, output_template_file=output_template_file, use_json=use_json, force_upload=force_upload, no_progressbar=no_progressbar, metadata=metadata, region=region, profile=profile, signing_profiles=signing_profiles, ) as package_context: package_context.run()
def guided_prompts(self, parameter_override_keys): default_stack_name = self.stack_name or "sam-app" default_region = self.region or get_session().get_config_variable( "region") or "us-east-1" default_capabilities = self.capabilities[0] or ("CAPABILITY_IAM", ) default_config_env = self.config_env or DEFAULT_ENV default_config_file = self.config_file or DEFAULT_CONFIG_FILE_NAME input_capabilities = None config_env = None config_file = None click.echo( self.color.yellow( "\n\tSetting default arguments for 'sam deploy'\n\t=========================================" )) stack_name = prompt(f"\t{self.start_bold}Stack Name{self.end_bold}", default=default_stack_name, type=click.STRING) region = prompt(f"\t{self.start_bold}AWS Region{self.end_bold}", default=default_region, type=click.STRING) input_parameter_overrides = self.prompt_parameters( parameter_override_keys, self.parameter_overrides_from_cmdline, self.start_bold, self.end_bold) stacks = SamLocalStackProvider.get_stacks( self.template_file, parameter_overrides=sanitize_parameter_overrides( input_parameter_overrides)) image_repositories = self.prompt_image_repository(stacks) click.secho( "\t#Shows you resources changes to be deployed and require a 'Y' to initiate deploy" ) confirm_changeset = confirm( f"\t{self.start_bold}Confirm changes before deploy{self.end_bold}", default=self.confirm_changeset) click.secho( "\t#SAM needs permission to be able to create roles to connect to the resources in your template" ) capabilities_confirm = confirm( f"\t{self.start_bold}Allow SAM CLI IAM role creation{self.end_bold}", default=True) if not capabilities_confirm: input_capabilities = prompt( f"\t{self.start_bold}Capabilities{self.end_bold}", default=list(default_capabilities), type=FuncParamType(func=_space_separated_list_func_type), ) self.prompt_authorization(stacks) self.prompt_code_signing_settings(stacks) save_to_config = confirm( f"\t{self.start_bold}Save arguments to configuration file{self.end_bold}", default=True) if save_to_config: config_file = prompt( f"\t{self.start_bold}SAM configuration file{self.end_bold}", default=default_config_file, type=click.STRING, ) config_env = prompt( f"\t{self.start_bold}SAM configuration environment{self.end_bold}", default=default_config_env, type=click.STRING, ) s3_bucket = manage_stack(profile=self.profile, region=region) click.echo(f"\n\t\tManaged S3 bucket: {s3_bucket}") click.echo( "\t\tA different default S3 bucket can be set in samconfig.toml") self.guided_stack_name = stack_name self.guided_s3_bucket = s3_bucket self.guided_image_repositories = image_repositories self.guided_s3_prefix = stack_name self.guided_region = region self.guided_profile = self.profile self._capabilities = input_capabilities if input_capabilities else default_capabilities self._parameter_overrides = (input_parameter_overrides if input_parameter_overrides else self.parameter_overrides_from_cmdline) self.save_to_config = save_to_config self.config_env = config_env if config_env else default_config_env self.config_file = config_file if config_file else default_config_file self.confirm_changeset = confirm_changeset
def do_cli( template_file, stack_name, s3_bucket, force_upload, no_progressbar, 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, signing_profiles, resolve_s3, config_file, config_env, ): from samcli.commands.package.package_context import PackageContext from samcli.commands.deploy.deploy_context import DeployContext from samcli.commands.deploy.guided_context import GuidedContext from samcli.commands.deploy.exceptions import DeployResolveS3AndS3SetError if guided: # Allow for a guided deploy to prompt and save those details. guided_context = GuidedContext( template_file=template_file, stack_name=stack_name, s3_bucket=s3_bucket, s3_prefix=s3_prefix, region=region, profile=profile, confirm_changeset=confirm_changeset, capabilities=capabilities, signing_profiles=signing_profiles, parameter_overrides=parameter_overrides, config_section=CONFIG_SECTION, config_env=config_env, config_file=config_file, ) guided_context.run() elif resolve_s3 and bool(s3_bucket): raise DeployResolveS3AndS3SetError() elif resolve_s3: s3_bucket = manage_stack(profile=profile, region=region) click.echo(f"\n\t\tManaged S3 bucket: {s3_bucket}") click.echo( "\t\tA different default S3 bucket can be set in samconfig.toml") click.echo("\t\tOr by specifying --s3-bucket explicitly.") with osutils.tempfile_platform_independent() as output_template_file: with PackageContext( template_file=template_file, s3_bucket=guided_context.guided_s3_bucket if guided else s3_bucket, s3_prefix=guided_context.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, no_progressbar=no_progressbar, metadata=metadata, on_deploy=True, region=guided_context.guided_region if guided else region, profile=profile, signing_profiles=guided_context.signing_profiles if guided else signing_profiles, ) as package_context: package_context.run() with DeployContext( template_file=output_template_file.name, stack_name=guided_context.guided_stack_name if guided else stack_name, s3_bucket=guided_context.guided_s3_bucket if guided else s3_bucket, force_upload=force_upload, no_progressbar=no_progressbar, s3_prefix=guided_context.guided_s3_prefix if guided else s3_prefix, kms_key_id=kms_key_id, parameter_overrides=sanitize_parameter_overrides( guided_context.guided_parameter_overrides) if guided else parameter_overrides, capabilities=guided_context.guided_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_context.guided_region if guided else region, profile=profile, confirm_changeset=guided_context.confirm_changeset if guided else confirm_changeset, signing_profiles=guided_context.signing_profiles if guided else signing_profiles, ) as deploy_context: deploy_context.run()
def do_cli(region, profile): bucket_name = bootstrap.manage_stack(profile=profile, region=region) click.echo("Source Bucket: " + bucket_name)
from samcli.lib.bootstrap.bootstrap import manage_stack import sys bucket_name = manage_stack(sys.argv[1], sys.argv[2]) print(bucket_name)
def test_client_missing_region(self, boto_mock): boto_mock.side_effect = NoRegionError() with self.assertRaises(RegionError): manage_stack("testprofile", "fake-region")
def test_client_missing_credentials(self, boto_mock): boto_mock.side_effect = NoCredentialsError() with self.assertRaises(CredentialsError): manage_stack("testprofile", "fake-region")
def test_client_missing_region(self, boto_mock): session_mock = Mock() session_mock.client.side_effect = NoRegionError() boto_mock.return_value = session_mock with self.assertRaises(RegionError): manage_stack("testprofile", "fake-region")
def setup_deployment_bucket(sam_config, deployment_target) -> str: region = get_sam_param(sam_config, 'default', 'region') # Gets AWS profile from ambient configuration. s3_bucket = bootstrap.manage_stack(profile=None, region=region) return s3_bucket