diff options
-rw-r--r-- | ironic/conductor/cleaning.py | 2 | ||||
-rw-r--r-- | ironic/conductor/deployments.py | 2 | ||||
-rw-r--r-- | ironic/conductor/utils.py | 16 | ||||
-rw-r--r-- | releasenotes/notes/spawn-error-2249f94606388fbd.yaml | 5 |
4 files changed, 25 insertions, 0 deletions
diff --git a/ironic/conductor/cleaning.py b/ironic/conductor/cleaning.py index 9a923abf7..8a1b7be5d 100644 --- a/ironic/conductor/cleaning.py +++ b/ironic/conductor/cleaning.py @@ -126,6 +126,8 @@ def do_node_clean(task, clean_steps=None): do_next_clean_step(task, step_index) +@utils.fail_on_error(utils.deploying_error_handler, + _("Unexpected error when processing next clean step")) @task_manager.require_exclusive_lock def do_next_clean_step(task, step_index): """Do cleaning, starting from the specified clean step. diff --git a/ironic/conductor/deployments.py b/ironic/conductor/deployments.py index 780b302c5..54e05a62c 100644 --- a/ironic/conductor/deployments.py +++ b/ironic/conductor/deployments.py @@ -204,6 +204,8 @@ def do_node_deploy(task, conductor_id=None, configdrive=None): do_next_deploy_step(task, 0, conductor_id) +@utils.fail_on_error(utils.deploying_error_handler, + _("Unexpected error when processing next deploy step")) @task_manager.require_exclusive_lock def do_next_deploy_step(task, step_index, conductor_id): """Do deployment, starting from the specified deploy step. diff --git a/ironic/conductor/utils.py b/ironic/conductor/utils.py index 2e97be54d..ae481283c 100644 --- a/ironic/conductor/utils.py +++ b/ironic/conductor/utils.py @@ -16,6 +16,7 @@ import contextlib import crypt import datetime from distutils.version import StrictVersion +import functools import os import secrets import time @@ -563,6 +564,21 @@ def deploying_error_handler(task, logmsg, errmsg=None, traceback=False, task.process_event('fail') +def fail_on_error(error_callback, msg, *error_args, **error_kwargs): + """A decorator for failing operation on failure.""" + def wrapper(func): + @functools.wraps(func) + def wrapped(task, *args, **kwargs): + try: + return func(task, *args, **kwargs) + except Exception as exc: + errmsg = "%s. %s: %s" % (msg, exc.__class__.__name__, exc) + error_callback(task, errmsg, *error_args, **error_kwargs) + + return wrapped + return wrapper + + @task_manager.require_exclusive_lock def abort_on_conductor_take_over(task): """Set node's state when a task was aborted due to conductor take over. diff --git a/releasenotes/notes/spawn-error-2249f94606388fbd.yaml b/releasenotes/notes/spawn-error-2249f94606388fbd.yaml new file mode 100644 index 000000000..51e4d6795 --- /dev/null +++ b/releasenotes/notes/spawn-error-2249f94606388fbd.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + No longer silently ignores exceptions that happen when trying to run the + next clean or deploy step. |