From f1e1a73b835813010b2c7d411cecbb67e18bfc8c Mon Sep 17 00:00:00 2001 From: Anant Patil Date: Fri, 17 Jul 2015 14:32:10 +0530 Subject: [PATCH] Convergence: Re-trigger stack operation Ensure stack operation is re-triggered when SynPointNotFound is encountered and stack is updated (have new traversal ID). Change-Id: Ia1b670aa5766c57dafdcc84d642c42007371a087 --- heat/engine/worker.py | 4 ++-- heat/tests/engine/test_engine_worker.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/heat/engine/worker.py b/heat/engine/worker.py index e92b4bf196..facc99c8f2 100644 --- a/heat/engine/worker.py +++ b/heat/engine/worker.py @@ -174,7 +174,7 @@ class WorkerService(service.Service): def _retrigger_check_resource(self, cnxt, is_update, resource_id, stack): current_traversal = stack.current_traversal graph = self._compute_dependencies(stack).graph() - key = sync_point.make_key(resource_id, current_traversal, is_update) + key = (resource_id, is_update) predecessors = graph[key] def do_check(target_key, data): @@ -184,7 +184,7 @@ class WorkerService(service.Service): try: sync_point.sync(cnxt, resource_id, current_traversal, is_update, do_check, predecessors, {key: None}) - except sync_point.sync_points.NotFound: + except sync_point.SyncPointNotFound: pass def _initiate_propagate_resource(self, cnxt, resource_id, diff --git a/heat/tests/engine/test_engine_worker.py b/heat/tests/engine/test_engine_worker.py index e67e875b5f..9bdf8d2ab3 100644 --- a/heat/tests/engine/test_engine_worker.py +++ b/heat/tests/engine/test_engine_worker.py @@ -380,6 +380,26 @@ class CheckWorkflowUpdateTest(common.HeatTestCase): mock_rcr.assert_called_once_with(self.ctx, self.is_update, self.resource.id, updated_stack) + @mock.patch.object(sync_point, 'sync') + def test_retrigger_check_resource(self, mock_sync, mock_cru, mock_crc, + mock_pcr, mock_csc, mock_cid): + self.is_update = True + resC = self.stack['C'] + expected_graph_key = (resC.id, self.is_update) + # A, B are predecessors to C when is_update is True + expected_predecessors = {(self.stack['A'].id, True), + (self.stack['B'].id, True)} + self.worker._retrigger_check_resource(self.ctx, self.is_update, + resC.id, self.stack) + mock_sync.assert_called_once_with(self.ctx, resC.id, + self.stack.current_traversal, + self.is_update, mock.ANY, + mock.ANY, + {expected_graph_key: None}) + call_args, call_kwargs = mock_sync.call_args + actual_predecessors = call_args[5] + self.assertItemsEqual(expected_predecessors, actual_predecessors) + @mock.patch.object(worker, 'construct_input_data') @mock.patch.object(worker, 'check_stack_complete')