summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ironic/conductor/cleaning.py2
-rw-r--r--ironic/conductor/deployments.py2
-rw-r--r--ironic/conductor/utils.py16
-rw-r--r--releasenotes/notes/spawn-error-2249f94606388fbd.yaml5
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.