From d4087af8309e2332ff3b9863cbf83832ae475680 Mon Sep 17 00:00:00 2001 From: Sirushti Murugesan Date: Tue, 14 Jul 2015 19:13:49 +0530 Subject: [PATCH] Convergence: Allow creating stacks of empty templates Change-Id: I25449a69a4565c2433832845b70cf32bc1cf53a9 --- heat/engine/stack.py | 22 +++++++++++++--------- heat/tests/test_engine_service.py | 10 ++++++++++ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 118b903f30..e9817855cc 100755 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -991,15 +991,19 @@ class Stack(collections.Mapping): self.convergence_dependencies.graph().edges()]} self.store() - for rsrc_id, is_update in self.convergence_dependencies.leaves(): - LOG.info(_LI("Triggering resource %(rsrc_id)s " - "for %(is_update)s update"), - {'rsrc_id': rsrc_id, 'is_update': is_update}) - input_data = {'input_data': {}, - 'adopt_stack_data': self.adopt_stack_data} - self.worker_client.check_resource(self.context, rsrc_id, - self.current_traversal, - input_data, is_update) + leaves = set(self.convergence_dependencies.leaves()) + if not any(leaves): + self.mark_complete(self.current_traversal) + else: + for rsrc_id, is_update in self.convergence_dependencies.leaves(): + LOG.info(_LI("Triggering resource %(rsrc_id)s " + "for %(is_update)s update"), + {'rsrc_id': rsrc_id, 'is_update': is_update}) + input_data = {'input_data': {}, + 'adopt_stack_data': self.adopt_stack_data} + self.worker_client.check_resource(self.context, rsrc_id, + self.current_traversal, + input_data, is_update) def _get_best_existing_rsrc_db(self, rsrc_name): candidate = None diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py index 207e306a7a..0b7b2f62fa 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -189,6 +189,16 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase): super(StackConvergenceCreateUpdateDeleteTest, self).setUp() cfg.CONF.set_override('convergence_engine', True) + @mock.patch.object(parser.Stack, 'mark_complete') + def test_converge_empty_template(self, mock_mc, mock_cr): + empty_tmpl = templatem.Template.create_empty_template() + stack = parser.Stack(utils.dummy_context(), 'empty_tmpl_stack', + empty_tmpl, convergence=True) + stack.store() + stack.converge_stack(template=stack.t, action=stack.CREATE) + self.assertFalse(mock_cr.called) + mock_mc.assert_called_once_with(stack.current_traversal) + def test_conv_wordpress_single_instance_stack_create(self, mock_cr): stack = tools.get_stack('test_stack', utils.dummy_context(), convergence=True)