Skip to content

Commit 5705a7b

Browse files
author
ChadKluck
committed
updated delete.py
1 parent 7db9800 commit 5705a7b

File tree

2 files changed

+43
-18
lines changed

2 files changed

+43
-18
lines changed

TODO.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
### Delete
2828

2929
- [ ] Apply DeleteOnOrAfter tag to retained resources in PROD (use setting to set days)
30+
- [ ] Allow Clean-up without stack (stack deleted, resources retained or failed/interrupted deletes)
3031
- [ ] Test
3132

3233
## Lib

cli/delete.py

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,12 @@ def validate_stack_arn(self, stack_name: str, expected_name: str) -> bool:
105105
"""Validate that the provided ARN matches the expected stack name"""
106106

107107
try:
108-
arn = Colorize.prompt(f"Enter the ARN of the {stack_name} stack", "", str)
109-
if not arn:
110-
click.echo(Colorize.error("ARN cannot be empty"))
111-
return False
108+
arn = ""
109+
while arn == "":
110+
arn = Colorize.prompt(f"Enter the ARN of the {stack_name} stack", "", str)
111+
arn = arn.strip()
112+
if arn == "":
113+
click.echo(Colorize.error("ARN cannot be empty"))
112114

113115
# Extract stack name from ARN
114116
try:
@@ -119,13 +121,19 @@ def validate_stack_arn(self, stack_name: str, expected_name: str) -> bool:
119121
if actual_stack_name == expected_name:
120122
return True
121123
else:
122-
click.echo(Colorize.error(f"Stack name mismatch. Expected: {expected_name}, Got: {actual_stack_name}"))
124+
message = f"Stack name mismatch. Expected: {expected_name}, Got: {actual_stack_name}"
125+
click.echo(Colorize.error(message))
126+
Log.error(message)
123127
return False
124128
else:
125-
click.echo(Colorize.error("Invalid ARN format"))
129+
message = "Invalid ARN format"
130+
click.echo(Colorize.error(message))
131+
Log.error(f"{message}: {arn}")
126132
return False
127133
except Exception as e:
128-
click.echo(Colorize.error(f"Error parsing ARN: {str(e)}"))
134+
message = f"Error parsing ARN: {str(e)}"
135+
click.echo(Colorize.error(message))
136+
Log.error(f"{message} {arn}")
129137
return False
130138

131139
except KeyboardInterrupt:
@@ -155,17 +163,25 @@ def check_delete_tag(self, stack_name: str) -> bool:
155163
current_date = datetime.now().date()
156164

157165
if current_date >= delete_date:
158-
click.echo(Colorize.success(f"DeleteOnOrAfter tag validation passed: {delete_date_str}"))
166+
message = f"DeleteOnOrAfter tag validation passed: {delete_date_str}"
167+
click.echo(Colorize.success(message))
168+
Log.info(message)
159169
return True
160170
else:
161-
click.echo(Colorize.error(f"Current date ({current_date}) is before DeleteOnOrAfter date ({delete_date})"))
171+
message = f"Current date ({current_date}) is before DeleteOnOrAfter date ({delete_date})"
172+
click.echo(Colorize.error(message))
173+
Log.error(message)
162174
return False
163175
except ValueError as e:
164-
click.echo(Colorize.error(f"Invalid date format in DeleteOnOrAfter tag: {delete_date_str}"))
176+
message = f"Invalid date format in DeleteOnOrAfter tag: {delete_date_str}"
177+
click.echo(Colorize.error(message))
178+
Log.error(message)
165179
return False
166180

167181
except Exception as e:
168-
click.echo(Colorize.error(f"Error checking DeleteOnOrAfter tag: {str(e)}"))
182+
message = f"Error checking DeleteOnOrAfter tag: {str(e)}"
183+
click.echo(Colorize.error(message))
184+
Log.error(message)
169185
return False
170186

171187
def check_stack_termination_protection(self, stack_name: str) -> bool:
@@ -177,14 +193,20 @@ def check_stack_termination_protection(self, stack_name: str) -> bool:
177193
termination_protection = stack.get('EnableTerminationProtection', False)
178194

179195
if not termination_protection:
180-
click.echo(Colorize.success(f"Stack termination protection validation passed: disabled"))
196+
message = f"Stack termination protection validation passed: Stack {stack_name} has termination protection disabled"
197+
click.echo(Colorize.success(message))
198+
Log.info(message)
181199
return True
182200
else:
183-
click.echo(Colorize.error(f"Stack {stack_name} has termination protection enabled"))
201+
message = f"Stack termination protection validation failed: Stack {stack_name} has termination protection enabled"
202+
click.echo(Colorize.error(message))
203+
Log.error(message)
184204
return False
185205

186206
except Exception as e:
187-
click.echo(Colorize.error(f"Error checking stack termination protection: {str(e)}"))
207+
message = f"Error checking stack termination protection for {stack_name}: {str(e)}"
208+
click.echo(Colorize.error(message))
209+
Log.error(message)
188210
return False
189211

190212
def final_confirmation(self) -> bool:
@@ -201,6 +223,7 @@ def final_confirmation(self) -> bool:
201223
return True
202224
else:
203225
click.echo(Colorize.error("Confirmation failed. Values do not match."))
226+
Log.error("Confirmation failed. Values from user do not match.")
204227
return False
205228

206229
def delete_stack(self, stack_name: str) -> bool:
@@ -298,6 +321,7 @@ def delete_ssm_parameters(self) -> None:
298321
click.echo(Colorize.output(f" - {param}"))
299322

300323
# confirm deletion of parameters
324+
print()
301325
if not click.confirm(Colorize.question("Proceed with deletion of these SSM parameters?"), default=True):
302326
click.echo(Colorize.error("SSM parameter deletion cancelled by user"))
303327
Log.info("SSM parameter deletion cancelled by user")
@@ -533,15 +557,15 @@ def destroy_pipeline(self) -> None:
533557
# 2. Validate pipeline stack ARN
534558
print()
535559
pipeline_stack_name = self.get_pipeline_stack_name()
536-
click.echo(Colorize.output_bold("Step 1: Validate Pipeline Stack"))
560+
click.echo(Colorize.output_bold("Step 1: Validate Pipeline Stack ARN"))
537561
if not self.validate_stack_arn("pipeline", pipeline_stack_name):
538562
click.echo(Colorize.error("Pipeline stack validation failed"))
539563
sys.exit(1)
540564

541565
# 3. Validate application stack ARN
542566
print()
543567
application_stack_name = self.get_application_stack_name()
544-
click.echo(Colorize.output_bold("Step 2: Validate Application Stack"))
568+
click.echo(Colorize.output_bold("Step 2: Validate Application Stack ARN"))
545569
if not self.validate_stack_arn("application", application_stack_name):
546570
click.echo(Colorize.error("Application stack validation failed"))
547571
sys.exit(1)
@@ -557,14 +581,14 @@ def destroy_pipeline(self) -> None:
557581
print()
558582
click.echo(Colorize.output_bold("Step 3b: Validate Stack Termination Protection is Disabled for Pipeline"))
559583
if not self.check_stack_termination_protection(pipeline_stack_name):
560-
click.echo(Colorize.error("Stack Termination Protection validation failed"))
584+
click.echo(Colorize.error("Stack Termination Protection must be disabled first."))
561585
sys.exit(1)
562586

563587
# 6. Check Stack Termination Protection tag for Application
564588
print()
565589
click.echo(Colorize.output_bold("Step 3c: Validate Stack Termination Protection is Disabled for Application"))
566590
if not self.check_stack_termination_protection(application_stack_name):
567-
click.echo(Colorize.error("Stack Termination Protection validation failed"))
591+
click.echo(Colorize.error("Stack Termination Protection must be disabled first."))
568592
sys.exit(1)
569593

570594
# 7. Final confirmation

0 commit comments

Comments
 (0)