|
17 | 17 | import json
|
18 | 18 | import logging
|
19 | 19 | import os
|
| 20 | +import re |
20 | 21 | import sys
|
21 | 22 | import time
|
22 | 23 | import urllib.request
|
@@ -393,19 +394,42 @@ def verify_stack_creation(stack_name, cfn_client):
|
393 | 394 | LOGGER.debug(resource_status)
|
394 | 395 | if status != "CREATE_COMPLETE":
|
395 | 396 | 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) |
405 | 398 | return False
|
406 | 399 | return True
|
407 | 400 |
|
408 | 401 |
|
| 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 | + |
409 | 433 | def get_templates_bucket_path():
|
410 | 434 | """Return a string containing the path of bucket."""
|
411 | 435 | region = get_region()
|
|
0 commit comments