diff --git a/heat/engine/service.py b/heat/engine/service.py index 2d739a5cc5..afeab5ed94 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -1357,10 +1357,14 @@ class EngineService(service.Service): self.resource_enforcer.enforce_stack(stack) if stack.convergence and cfg.CONF.convergence_engine: - template = templatem.Template.create_empty_template( - from_template=stack.t) - stack.thread_group_mgr = self.thread_group_mgr - stack.converge_stack(template=template, action=stack.DELETE) + def convergence_delete(): + stack.thread_group_mgr = self.thread_group_mgr + self.worker_service.stop_all_workers(stack) + template = templatem.Template.create_empty_template( + from_template=stack.t) + stack.converge_stack(template=template, action=stack.DELETE) + + self.thread_group_mgr.start(stack.id, convergence_delete) return lock = stack_lock.StackLock(cnxt, stack.id, self.engine_id) diff --git a/heat/tests/convergence/framework/engine_wrapper.py b/heat/tests/convergence/framework/engine_wrapper.py index 07f8ed35df..73f0db4ac2 100644 --- a/heat/tests/convergence/framework/engine_wrapper.py +++ b/heat/tests/convergence/framework/engine_wrapper.py @@ -41,8 +41,9 @@ class Engine(message_processor.MessageProcessor): queue = message_queue.MessageQueue('engine') - def __init__(self): + def __init__(self, worker): super(Engine, self).__init__('engine') + self.worker = worker def scenario_template_to_hot(self, scenario_tmpl): """Converts the scenario template into hot template.""" @@ -75,6 +76,7 @@ class Engine(message_processor.MessageProcessor): cnxt = utils.dummy_context() srv = service.EngineService("host", "engine") srv.thread_group_mgr = SynchronousThreadGroupManager() + srv.worker_service = self.worker hot_tmpl = self.scenario_template_to_hot(scenario_tmpl) srv.create_stack(cnxt, stack_name, hot_tmpl, params={}, files={}, environment_files=None, args={}) @@ -85,6 +87,7 @@ class Engine(message_processor.MessageProcessor): db_stack = db_api.stack_get_by_name(cnxt, stack_name) srv = service.EngineService("host", "engine") srv.thread_group_mgr = SynchronousThreadGroupManager() + srv.worker_service = self.worker hot_tmpl = self.scenario_template_to_hot(scenario_tmpl) stack_identity = {'stack_name': stack_name, 'stack_id': db_stack.id, @@ -103,6 +106,7 @@ class Engine(message_processor.MessageProcessor): 'path': ''} srv = service.EngineService("host", "engine") srv.thread_group_mgr = SynchronousThreadGroupManager() + srv.worker_service = self.worker srv.delete_stack(cnxt, stack_identity) @message_processor.asynchronous diff --git a/heat/tests/convergence/framework/processes.py b/heat/tests/convergence/framework/processes.py index b6bca92cbd..5104a62b3f 100644 --- a/heat/tests/convergence/framework/processes.py +++ b/heat/tests/convergence/framework/processes.py @@ -28,8 +28,8 @@ class Processes(object): global worker global event_loop - engine = engine_wrapper.Engine() worker = worker_wrapper.Worker() + engine = engine_wrapper.Engine(worker) event_loop = event_loop_module.EventLoop(engine, worker) diff --git a/heat/tests/convergence/framework/worker_wrapper.py b/heat/tests/convergence/framework/worker_wrapper.py index f4ae612186..14d9061e4f 100644 --- a/heat/tests/convergence/framework/worker_wrapper.py +++ b/heat/tests/convergence/framework/worker_wrapper.py @@ -35,3 +35,6 @@ class Worker(message_processor.MessageProcessor): current_traversal, data, is_update, adopt_stack_data) + + def stop_all_workers(self, current_stack): + pass