Skip to content

Commit 5ce04b5

Browse files
committed
Display substack failures when pcluster create fails
* Add logic to display detailed substack failure message when pcluster creation fails due to a substack error. Signed-off-by: Rex <[email protected]>
1 parent 1c122d0 commit 5ce04b5

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

cli/pcluster/utils.py

+33-9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import json
1818
import logging
1919
import os
20+
import re
2021
import sys
2122
import time
2223
import urllib.request
@@ -393,19 +394,42 @@ def verify_stack_creation(stack_name, cfn_client):
393394
LOGGER.debug(resource_status)
394395
if status != "CREATE_COMPLETE":
395396
LOGGER.critical("\nCluster creation failed. Failed events:")
396-
events = get_stack_events(stack_name, raise_on_error=True)
397-
for event in events:
398-
if event.get("ResourceStatus") == "CREATE_FAILED":
399-
LOGGER.info(
400-
" - %s %s %s",
401-
event.get("ResourceType"),
402-
event.get("LogicalResourceId"),
403-
event.get("ResourceStatusReason"),
404-
)
397+
_log_stack_failure_recursive(stack_name)
405398
return False
406399
return True
407400

408401

402+
def _log_stack_failure_recursive(stack_name, indent=2):
403+
"""Log stack failures in recursive manner, until there is no substack layer."""
404+
events = get_stack_events(stack_name, raise_on_error=True)
405+
for event in events:
406+
if event.get("ResourceStatus") == "CREATE_FAILED":
407+
_log_failed_cfn_event(event, indent)
408+
if event.get("ResourceType") == "AWS::CloudFormation::Stack":
409+
# Sample substack error:
410+
# "Embedded stack arn:aws:cloudformation:us-east-2:704743599507:stack/
411+
# parallelcluster-fsx-fail-FSXSubstack-65ITLJEZJ0DQ/
412+
# 3a4ecf00-51e7-11ea-8e3e-022fd555c652 was not successfully created:
413+
# The following resource(s) failed to create: [FileSystem]."
414+
substack_error = re.search(
415+
".+/({0}.+)/".format(PCLUSTER_STACK_PREFIX), event.get("ResourceStatusReason")
416+
)
417+
substack_name = substack_error.group(1) if substack_error else None
418+
if substack_name:
419+
_log_stack_failure_recursive(substack_name, indent=indent + 2)
420+
421+
422+
def _log_failed_cfn_event(event, indent):
423+
"""Log failed CFN events."""
424+
LOGGER.info(
425+
"%s- %s %s %s",
426+
" " * indent,
427+
event.get("ResourceType"),
428+
event.get("LogicalResourceId"),
429+
event.get("ResourceStatusReason"),
430+
)
431+
432+
409433
def get_templates_bucket_path():
410434
"""Return a string containing the path of bucket."""
411435
region = get_region()

0 commit comments

Comments
 (0)