summaryrefslogtreecommitdiff
path: root/heat/engine/stack.py
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-08-05 10:03:30 +0000
committerGerrit Code Review <review@openstack.org>2018-08-05 10:03:30 +0000
commit99cbff3803096741bae5b790744a2eb52057cc0c (patch)
treebb52096b0816691f99e893177408e26f59ebaf53 /heat/engine/stack.py
parent950795a65fa194163a0e34810fffc59096c0ac8d (diff)
parent07f1dd016c1f1b6ebf11778852263874af3a1bf0 (diff)
downloadheat-99cbff3803096741bae5b790744a2eb52057cc0c.tar.gz
Merge "Handle exceptions in initial convergence traversal setup"
Diffstat (limited to 'heat/engine/stack.py')
-rw-r--r--heat/engine/stack.py38
1 files changed, 29 insertions, 9 deletions
diff --git a/heat/engine/stack.py b/heat/engine/stack.py
index 66eba3cbe..068f5d791 100644
--- a/heat/engine/stack.py
+++ b/heat/engine/stack.py
@@ -90,10 +90,10 @@ def reset_state_on_error(func):
LOG.info('Stopped due to %(msg)s in %(func)s',
{'func': func.__name__, 'msg': errmsg})
finally:
- if stack.status == stack.IN_PROGRESS:
+ if ((not stack.convergence or errmsg is not None) and
+ stack.status == stack.IN_PROGRESS):
rtnmsg = _("Unexpected exit while IN_PROGRESS.")
- stack.state_set(stack.action, stack.FAILED,
- errmsg if errmsg is not None else rtnmsg)
+ stack.mark_failed(errmsg if errmsg is not None else rtnmsg)
assert errmsg is not None, "Returned while IN_PROGRESS."
return handle_exceptions
@@ -1306,6 +1306,7 @@ class Stack(collections.Mapping):
updater()
@profiler.trace('Stack.converge_stack', hide_args=False)
+ @reset_state_on_error
def converge_stack(self, template, action=UPDATE, new_stack=None,
pre_converge=None):
"""Update the stack template and trigger convergence for resources."""
@@ -1364,6 +1365,7 @@ class Stack(collections.Mapping):
self.thread_group_mgr.start(self.id, self._converge_create_or_update,
pre_converge=pre_converge)
+ @reset_state_on_error
def _converge_create_or_update(self, pre_converge=None):
current_resources = self._update_or_store_resources()
self._compute_convg_dependencies(self.ext_rsrcs_db, self.dependencies,
@@ -2107,13 +2109,31 @@ class Stack(collections.Mapping):
'tags': self.tags,
}
- def mark_complete(self):
- """Mark the update as complete.
+ def mark_failed(self, failure_reason):
+ """Mark the convergence update as failed."""
+ updated = self.state_set(self.action, self.FAILED, failure_reason)
+ if not updated:
+ return False
- This currently occurs when all resources have been updated; there may
- still be resources being cleaned up, but the Stack should now be in
- service.
- """
+ if not self.convergence:
+ # This function is not generally used in the legacy path, but to
+ # allow it to be used by any kind of stack in the
+ # reset_state_on_error decorator, bail out before the
+ # convergence-specific part in legacy stacks.
+ return
+
+ if (not self.disable_rollback and
+ self.action in (self.CREATE, self.ADOPT, self.UPDATE,
+ self.RESTORE)):
+ LOG.info("Triggering rollback of %(stack_name)s %(action)s ",
+ {'action': self.action, 'stack_name': self.name})
+ self.rollback()
+ else:
+ self.purge_db()
+ return True
+
+ def mark_complete(self):
+ """Mark the convergence update as complete."""
LOG.info('[%(name)s(%(id)s)] update traversal %(tid)s complete',
{'name': self.name, 'id': self.id,