diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-09-02 12:17:26 +0200 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-09-02 15:54:45 +0200 |
commit | f6781aadfc38be1787b4cf6960640e253995f738 (patch) | |
tree | 033564f9c77ee3064a48959d8696dc48a423f6b7 | |
parent | c57daacf624af5a9a82746f34e608b510bdac564 (diff) | |
download | ironic-f6781aadfc38be1787b4cf6960640e253995f738.tar.gz |
Improve edge-case debugging for deployment and cleaning
* Log traceback in fail_on_error
This is a last-resort error handler, it needs to log traceback.
* Use an assertion when we expect a present list of steps
* Log the freshly build list of steps.
Change-Id: I8cd4cd330551b7bc9a44957e0d15c8b75c09c299
-rw-r--r-- | ironic/conductor/cleaning.py | 8 | ||||
-rw-r--r-- | ironic/conductor/deployments.py | 6 | ||||
-rw-r--r-- | ironic/conductor/steps.py | 9 |
3 files changed, 19 insertions, 4 deletions
diff --git a/ironic/conductor/cleaning.py b/ironic/conductor/cleaning.py index 4325616ba..1ea35bfcf 100644 --- a/ironic/conductor/cleaning.py +++ b/ironic/conductor/cleaning.py @@ -126,7 +126,8 @@ def do_node_clean(task, clean_steps=None, disable_ramdisk=False): @utils.fail_on_error(utils.cleaning_error_handler, - _("Unexpected error when processing next clean step")) + _("Unexpected error when processing next clean step"), + traceback=True) @task_manager.require_exclusive_lock def do_next_clean_step(task, step_index, disable_ramdisk=None): """Do cleaning, starting from the specified clean step. @@ -145,6 +146,8 @@ def do_next_clean_step(task, step_index, disable_ramdisk=None): if step_index is None: steps = [] else: + assert node.driver_internal_info.get('clean_steps') is not None, \ + f"BUG: No clean steps for {node.uuid}, step index is {step_index}" steps = node.driver_internal_info['clean_steps'][step_index:] if disable_ramdisk is None: @@ -285,7 +288,8 @@ def do_node_clean_abort(task, step_name=None): @utils.fail_on_error(utils.cleaning_error_handler, - _("Unexpected error when processing next clean step")) + _("Unexpected error when processing next clean step"), + traceback=True) @task_manager.require_exclusive_lock def continue_node_clean(task): """Continue cleaning after finishing an async clean step. diff --git a/ironic/conductor/deployments.py b/ironic/conductor/deployments.py index 27685d3b2..daff72826 100644 --- a/ironic/conductor/deployments.py +++ b/ironic/conductor/deployments.py @@ -222,7 +222,8 @@ def do_node_deploy(task, conductor_id=None, configdrive=None, @utils.fail_on_error(utils.deploying_error_handler, - _("Unexpected error when processing next deploy step")) + _("Unexpected error when processing next deploy step"), + traceback=True) @task_manager.require_exclusive_lock def do_next_deploy_step(task, step_index): """Do deployment, starting from the specified deploy step. @@ -363,7 +364,8 @@ def validate_deploy_steps(task): @utils.fail_on_error(utils.deploying_error_handler, - _("Unexpected error when processing next deploy step")) + _("Unexpected error when processing next deploy step"), + traceback=True) @task_manager.require_exclusive_lock def continue_node_deploy(task): """Continue deployment after finishing an async deploy step. diff --git a/ironic/conductor/steps.py b/ironic/conductor/steps.py index 4d7570406..2a6636aca 100644 --- a/ironic/conductor/steps.py +++ b/ironic/conductor/steps.py @@ -228,6 +228,11 @@ def set_node_cleaning_steps(task, disable_ramdisk=False): driver_internal_info['clean_steps'] = _validate_user_clean_steps( task, steps, disable_ramdisk=disable_ramdisk) + LOG.debug('List of the steps for %(type)s cleaning of node %(node)s: ' + '%(steps)s', {'type': 'manual' if manual_clean else 'automated', + 'node': node.uuid, + 'steps': driver_internal_info['clean_steps']}) + node.clean_step = {} driver_internal_info['clean_step_index'] = None node.driver_internal_info = driver_internal_info @@ -365,6 +370,10 @@ def set_node_deployment_steps(task, reset_current=True, skip_missing=False): driver_internal_info = node.driver_internal_info driver_internal_info['deploy_steps'] = _get_all_deployment_steps( task, skip_missing=skip_missing) + + LOG.debug('List of the deploy steps for node %(node)s: ' + '%(steps)s', {'node': node.uuid, + 'steps': driver_internal_info['deploy_steps']}) if reset_current: node.deploy_step = {} driver_internal_info['deploy_step_index'] = None |