summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2021-09-02 12:17:26 +0200
committerDmitry Tantsur <dtantsur@protonmail.com>2021-09-02 15:54:45 +0200
commitf6781aadfc38be1787b4cf6960640e253995f738 (patch)
tree033564f9c77ee3064a48959d8696dc48a423f6b7
parentc57daacf624af5a9a82746f34e608b510bdac564 (diff)
downloadironic-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.py8
-rw-r--r--ironic/conductor/deployments.py6
-rw-r--r--ironic/conductor/steps.py9
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