@@ -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