Merge "Simplify logic in retrigger_check_resource()"
This commit is contained in:
commit
403ac3def7
|
@ -106,8 +106,7 @@ class CheckResource(object):
|
|||
latest_stack = parser.Stack.load(cnxt, stack_id=stack_id,
|
||||
force_reload=True)
|
||||
if current_traversal != latest_stack.current_traversal:
|
||||
self.retrigger_check_resource(cnxt, is_update, rsrc_id,
|
||||
latest_stack)
|
||||
self.retrigger_check_resource(cnxt, rsrc_id, latest_stack)
|
||||
|
||||
def _handle_stack_timeout(self, cnxt, stack):
|
||||
failure_reason = u'Timed out'
|
||||
|
@ -189,31 +188,25 @@ class CheckResource(object):
|
|||
|
||||
return False
|
||||
|
||||
def retrigger_check_resource(self, cnxt, is_update, resource_id, stack):
|
||||
def retrigger_check_resource(self, cnxt, resource_id, stack):
|
||||
current_traversal = stack.current_traversal
|
||||
graph = stack.convergence_dependencies.graph()
|
||||
key = (resource_id, is_update)
|
||||
if is_update:
|
||||
# When re-trigger received for update in latest traversal, first
|
||||
# check if update key is available in graph.
|
||||
# if No, then latest traversal is waiting for delete.
|
||||
if (resource_id, is_update) not in graph:
|
||||
key = (resource_id, not is_update)
|
||||
else:
|
||||
# When re-trigger received for delete in latest traversal, first
|
||||
# check if update key is available in graph,
|
||||
# if yes, then latest traversal is waiting for update.
|
||||
if (resource_id, True) in graph:
|
||||
# not is_update evaluates to True below, which means update
|
||||
key = (resource_id, not is_update)
|
||||
LOG.info('Re-trigger resource: (%(key1)s, %(key2)s)',
|
||||
{'key1': key[0], 'key2': key[1]})
|
||||
|
||||
# When re-trigger received for latest traversal, first check if update
|
||||
# key is available in graph. If yes, the latest traversal is waiting
|
||||
# for update, otherwise it is waiting for delete. This is the case
|
||||
# regardless of which action (update or cleanup) from the previous
|
||||
# traversal was blocking it.
|
||||
update_key = parser.ConvergenceNode(resource_id, True)
|
||||
key = parser.ConvergenceNode(resource_id, update_key in graph)
|
||||
|
||||
LOG.info('Re-trigger resource: %s', key)
|
||||
predecessors = set(graph[key])
|
||||
|
||||
try:
|
||||
propagate_check_resource(cnxt, self._rpc_client, resource_id,
|
||||
current_traversal, predecessors, key,
|
||||
None, key[1], None)
|
||||
None, key.is_update, None)
|
||||
except exception.EntityNotFound as e:
|
||||
if e.entity != "Sync Point":
|
||||
raise
|
||||
|
@ -285,8 +278,7 @@ class CheckResource(object):
|
|||
current_traversal)
|
||||
return
|
||||
|
||||
self.retrigger_check_resource(cnxt, is_update,
|
||||
resource_id, stack)
|
||||
self.retrigger_check_resource(cnxt, resource_id, stack)
|
||||
else:
|
||||
raise
|
||||
|
||||
|
@ -352,7 +344,7 @@ def check_stack_complete(cnxt, stack, current_traversal, sender_id, deps,
|
|||
def mark_complete(stack_id, data):
|
||||
stack.mark_complete()
|
||||
|
||||
sender_key = (sender_id, is_update)
|
||||
sender_key = parser.ConvergenceNode(sender_id, is_update)
|
||||
sync_point.sync(cnxt, stack.id, current_traversal, True,
|
||||
mark_complete, roots, {sender_key: None})
|
||||
|
||||
|
|
|
@ -157,9 +157,8 @@ class WorkerService(object):
|
|||
db_api.resource_update_and_save(stack.context, rsrc.id, values)
|
||||
# The old resource might be in the graph (a rollback case);
|
||||
# just re-trigger it.
|
||||
key = parser.ConvergenceNode(rsrc.replaces, is_update)
|
||||
check_resource.retrigger_check_resource(stack.context, is_update,
|
||||
key.rsrc_id, stack)
|
||||
check_resource.retrigger_check_resource(stack.context,
|
||||
rsrc.replaces, stack)
|
||||
|
||||
@context.request_context
|
||||
@log_exceptions
|
||||
|
|
|
@ -352,7 +352,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
|||
self.stack.current_traversal,
|
||||
self.is_update, self.resource,
|
||||
self.stack)
|
||||
mock_rcr.assert_called_once_with(self.ctx, self.is_update,
|
||||
mock_rcr.assert_called_once_with(self.ctx,
|
||||
self.resource.id, updated_stack)
|
||||
|
||||
def test_check_stack_complete_is_invoked_for_replaced_resource(
|
||||
|
@ -385,8 +385,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
|||
# A, B are predecessors to C when is_update is True
|
||||
expected_predecessors = {(self.stack['A'].id, True),
|
||||
(self.stack['B'].id, True)}
|
||||
self.cr.retrigger_check_resource(self.ctx, self.is_update,
|
||||
resC.id, self.stack)
|
||||
self.cr.retrigger_check_resource(self.ctx, resC.id, self.stack)
|
||||
mock_pcr.assert_called_once_with(self.ctx, mock.ANY, resC.id,
|
||||
self.stack.current_traversal,
|
||||
mock.ANY, (resC.id, True), None,
|
||||
|
@ -403,7 +402,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
|||
[(1, False), (1, True)], [(2, False), None]])
|
||||
# simulate rsrc 2 completing its update for old traversal
|
||||
# and calling rcr
|
||||
self.cr.retrigger_check_resource(self.ctx, True, 2, self.stack)
|
||||
self.cr.retrigger_check_resource(self.ctx, 2, self.stack)
|
||||
# Ensure that pcr was called with proper delete traversal
|
||||
mock_pcr.assert_called_once_with(self.ctx, mock.ANY, 2,
|
||||
self.stack.current_traversal,
|
||||
|
@ -418,7 +417,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
|
|||
[(1, False), (1, True)], [(2, False), (2, True)]])
|
||||
# simulate rsrc 2 completing its delete for old traversal
|
||||
# and calling rcr
|
||||
self.cr.retrigger_check_resource(self.ctx, False, 2, self.stack)
|
||||
self.cr.retrigger_check_resource(self.ctx, 2, self.stack)
|
||||
# Ensure that pcr was called with proper delete traversal
|
||||
mock_pcr.assert_called_once_with(self.ctx, mock.ANY, 2,
|
||||
self.stack.current_traversal,
|
||||
|
|
Loading…
Reference in New Issue