From 8843e7490b4ca4da6e5155c730600f44628b3abf Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Fri, 31 May 2013 12:39:08 +0200 Subject: [PATCH] Create nested stacks in parallel Use check_create_complete() to advance the nested stack creation, so that it can occur in parallel with other resources in the parent stack. Implements blueprint concurrent-resource-scheduling Change-Id: I841b4c93b257409eecd0d2a43b35d9bee114ab87 --- heat/engine/resources/dbinstance.py | 2 +- heat/engine/resources/loadbalancer.py | 2 +- heat/engine/resources/stack.py | 6 +++--- heat/engine/stack_resource.py | 16 +++++++++++++--- heat/tests/test_dbinstance.py | 2 ++ heat/tests/test_nested_stack.py | 3 ++- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/heat/engine/resources/dbinstance.py b/heat/engine/resources/dbinstance.py index 567bc1e0..0bfd4d88 100644 --- a/heat/engine/resources/dbinstance.py +++ b/heat/engine/resources/dbinstance.py @@ -214,7 +214,7 @@ class DBInstance(stack_resource.StackResource): def handle_create(self): templ = template_format.parse(mysql_template) - self.create_with_template(templ, self._params()) + return self.create_with_template(templ, self._params()) def handle_delete(self): self.delete_nested() diff --git a/heat/engine/resources/loadbalancer.py b/heat/engine/resources/loadbalancer.py index 9c93224c..4e8fd180 100644 --- a/heat/engine/resources/loadbalancer.py +++ b/heat/engine/resources/loadbalancer.py @@ -331,7 +331,7 @@ class LoadBalancer(stack_resource.StackResource): # total hack - probably need an admin key here. param = self.stack.resolve_static_data({'KeyName': {'Ref': 'KeyName'}}) - self.create_with_template(templ, param) + return self.create_with_template(templ, param) def handle_delete(self): self.delete_nested() diff --git a/heat/engine/resources/stack.py b/heat/engine/resources/stack.py index f4456575..c745c1f4 100644 --- a/heat/engine/resources/stack.py +++ b/heat/engine/resources/stack.py @@ -42,9 +42,9 @@ class NestedStack(stack_resource.StackResource): template_data = urlfetch.get(self.properties[PROP_TEMPLATE_URL]) template = template_format.parse(template_data) - self.create_with_template(template, - self.properties[PROP_PARAMETERS], - self.properties[PROP_TIMEOUT_MINS]) + return self.create_with_template(template, + self.properties[PROP_PARAMETERS], + self.properties[PROP_TIMEOUT_MINS]) def handle_delete(self): self.delete_nested() diff --git a/heat/engine/stack_resource.py b/heat/engine/stack_resource.py index 2040e73f..507c0fd7 100644 --- a/heat/engine/stack_resource.py +++ b/heat/engine/stack_resource.py @@ -16,6 +16,7 @@ from heat.common import exception from heat.engine import resource from heat.engine import parser +from heat.engine import scheduler from heat.openstack.common import log as logging @@ -65,9 +66,18 @@ class StackResource(resource.Resource): nested_id = self._nested.store(self.stack) self.resource_id_set(nested_id) - self._nested.create() - if self._nested.state != self._nested.CREATE_COMPLETE: - raise exception.Error(self._nested.state_description) + + stack_creator = scheduler.TaskRunner(self._nested.create_task) + stack_creator.start(timeout=self._nested.timeout_secs()) + return stack_creator + + def check_create_complete(self, stack_creator): + done = stack_creator.step() + if done: + if self._nested.state != self._nested.CREATE_COMPLETE: + raise exception.Error(self._nested.state_description) + + return done def delete_nested(self): ''' diff --git a/heat/tests/test_dbinstance.py b/heat/tests/test_dbinstance.py index 0a5728d9..1b516673 100644 --- a/heat/tests/test_dbinstance.py +++ b/heat/tests/test_dbinstance.py @@ -58,6 +58,7 @@ class DBInstanceTest(HeatTestCase): super(DBInstanceTest, self).setUp() setup_dummy_db() self.m.StubOutWithMock(dbi.DBInstance, 'create_with_template') + self.m.StubOutWithMock(dbi.DBInstance, 'check_create_complete') self.m.StubOutWithMock(dbi.DBInstance, 'nested') def create_dbinstance(self, t, stack, resource_name): @@ -89,6 +90,7 @@ class DBInstanceTest(HeatTestCase): dbi.DBInstance.create_with_template(mox.IgnoreArg(), params).AndReturn(None) + dbi.DBInstance.check_create_complete(mox.IgnoreArg()).AndReturn(True) fn = FakeNested() diff --git a/heat/tests/test_nested_stack.py b/heat/tests/test_nested_stack.py index 753b214a..83f46de8 100644 --- a/heat/tests/test_nested_stack.py +++ b/heat/tests/test_nested_stack.py @@ -50,7 +50,8 @@ Outputs: def create_stack(self, template): t = template_format.parse(template) stack = self.parse_stack(t) - self.assertEqual(None, stack.create()) + stack.create() + self.assertEqual(stack.state, stack.CREATE_COMPLETE) return stack def parse_stack(self, t): -- 2.45.2