Skip to content

Commit 6f3485f

Browse files
Merge pull request #687 from GarisonLotus/display_rollback_error
UX improvement: Displaying the rollback reason after stack goes into failed state
2 parents d6c5222 + 5728f0a commit 6f3485f

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

stacker/actions/build.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,11 @@ def _launch_stack(self, stack, **kwargs):
310310
reason = old_status.reason
311311
if 'rolling' in reason:
312312
reason = reason.replace('rolling', 'rolled')
313-
313+
status_reason = provider.get_rollback_status_reason(stack.fqn)
314+
logger.info(
315+
"%s Stack Roll Back Reason: " + status_reason, stack.fqn)
314316
return FailedStatus(reason)
317+
315318
elif provider.is_stack_completed(provider_stack):
316319
stack.set_outputs(
317320
provider.get_output_dict(provider_stack))

stacker/providers/aws/default.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ def _tail_print(e):
624624
e['ResourceType'],
625625
e['EventId']))
626626

627-
def get_events(self, stack_name):
627+
def get_events(self, stack_name, chronological=True):
628628
"""Get the events in batches and return in chronological order"""
629629
next_token = None
630630
event_list = []
@@ -642,7 +642,25 @@ def get_events(self, stack_name):
642642
if next_token is None:
643643
break
644644
time.sleep(GET_EVENTS_SLEEP)
645-
return reversed(sum(event_list, []))
645+
if chronological:
646+
return reversed(sum(event_list, []))
647+
else:
648+
return sum(event_list, [])
649+
650+
def get_rollback_status_reason(self, stack_name):
651+
"""Process events and returns latest roll back reason"""
652+
event = next((item for item in self.get_events(stack_name,
653+
False) if item["ResourceStatus"] ==
654+
"UPDATE_ROLLBACK_IN_PROGRESS"), None)
655+
if event:
656+
reason = event["ResourceStatusReason"]
657+
return reason
658+
else:
659+
event = next((item for item in self.get_events(stack_name)
660+
if item["ResourceStatus"] ==
661+
"ROLLBACK_IN_PROGRESS"), None)
662+
reason = event["ResourceStatusReason"]
663+
return reason
646664

647665
def tail(self, stack_name, cancel, log_func=_tail_print, sleep_time=5,
648666
include_initial=True):

stacker/tests/actions/test_build.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,15 @@ def get_stack(name, *args, **kwargs):
244244
'Outputs': [],
245245
'Tags': []}
246246

247+
def get_events(name, *args, **kwargs):
248+
return [{'ResourceStatus': 'ROLLBACK_IN_PROGRESS',
249+
'ResourceStatusReason': 'CFN fail'}]
250+
247251
patch_object(self.provider, 'get_stack', side_effect=get_stack)
248252
patch_object(self.provider, 'update_stack')
249253
patch_object(self.provider, 'create_stack')
250254
patch_object(self.provider, 'destroy_stack')
255+
patch_object(self.provider, 'get_events', side_effect=get_events)
251256

252257
patch_object(self.build_action, "s3_stack_push")
253258

0 commit comments

Comments
 (0)