in samcli/commands/delete/delete_context.py [0:0]
def delete(self):
"""
Delete method calls for Cloudformation stacks and S3 and ECR artifacts
"""
# Fetch the template using the stack-name
cf_template = self.cf_utils.get_stack_template(self.stack_name, TEMPLATE_STAGE)
template_str = cf_template.get("TemplateBody", None)
if isinstance(template_str, dict):
template_str = json.dumps(template_str, indent=4, ensure_ascii=False)
# Get the cloudformation template name using template_str
self.cf_template_file_name = get_uploaded_s3_object_name(file_content=template_str, extension="template")
template = Template(
template_path=None,
parent_dir=None,
uploaders=self.uploaders,
code_signer=None,
template_str=template_str,
)
# If s3 info is not available, try to obtain it from CF
# template resources.
if not self.s3_bucket:
s3_info = template.get_s3_info()
self.s3_bucket = s3_info["s3_bucket"]
self.s3_uploader.bucket_name = self.s3_bucket
self.s3_prefix = s3_info["s3_prefix"]
self.s3_uploader.prefix = self.s3_prefix
self.s3_prompts()
retain_resources = self.ecr_repos_prompts(template)
# ECR companion stack delete prompts, if it exists
companion_stack = CompanionStack(self.stack_name)
ecr_companion_stack_exists = self.cf_utils.has_stack(stack_name=companion_stack.stack_name)
if ecr_companion_stack_exists:
LOG.debug("ECR Companion stack found for the input stack")
self.companion_stack_name = companion_stack.stack_name
self.delete_ecr_companion_stack()
# Delete the artifacts and retain resources user selected not to delete
template.delete(retain_resources=retain_resources)
# Delete the CF template file in S3
if self.delete_cf_template_file:
self.s3_uploader.delete_artifact(remote_path=self.cf_template_file_name)
# Delete the folder of artifacts if s3_bucket and s3_prefix provided
elif self.delete_artifacts_folder:
self.s3_uploader.delete_prefix_artifacts()
# Delete the primary input stack
try:
click.echo(f"\t- Deleting Cloudformation stack {self.stack_name}")
self.cf_utils.delete_stack(stack_name=self.stack_name)
self.cf_utils.wait_for_delete(self.stack_name)
LOG.debug("Deleted Cloudformation stack: %s", self.stack_name)
except CfDeleteFailedStatusError:
LOG.debug("delete_stack resulted failed and so re-try with retain_resources")
self.cf_utils.delete_stack(stack_name=self.stack_name, retain_resources=retain_resources)
self.cf_utils.wait_for_delete(self.stack_name)
# If s3_bucket information is not available, warn the user
if not self.s3_bucket:
LOG.debug("Cannot delete s3 files as no s3_bucket found")
click.secho(
"\nWarning: s3_bucket and s3_prefix information could not be obtained from local config file"
" or cloudformation template, delete the s3 files manually if required",
fg="yellow",
)