]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Create nested stacks in parallel
authorZane Bitter <zbitter@redhat.com>
Fri, 31 May 2013 10:39:08 +0000 (12:39 +0200)
committerZane Bitter <zbitter@redhat.com>
Fri, 31 May 2013 10:40:08 +0000 (12:40 +0200)
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
heat/engine/resources/loadbalancer.py
heat/engine/resources/stack.py
heat/engine/stack_resource.py
heat/tests/test_dbinstance.py
heat/tests/test_nested_stack.py

index 567bc1e069615f275c1f8143ae39073541a8f579..0bfd4d8876af45c6a9558028caecb30052c5482f 100644 (file)
@@ -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()
index 9c93224cec64b1010449425cc25d8d865f9ae021..4e8fd180f06dbfaa5ac2ef563653fe1643948f88 100644 (file)
@@ -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()
index f44565758e7b040b190cb7d4c6be9b1e7305d001..c745c1f405745a3f6f8f58f5b37d8817c57ee169 100644 (file)
@@ -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()
index 2040e73f66fa394fe4c04a39ff24bf26ffe560dd..507c0fd7b93e32470beb025fcc4d1b5b3de44562 100644 (file)
@@ -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):
         '''
index 0a5728d9855466fb846e08741aa5b38fc2caf0c3..1b516673628ac151f2795d9f0bf30bee03eb4fe9 100644 (file)
@@ -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()
 
index 753b214a01401ad42c66fb1a8738b57dbd0ce109..83f46de88fa0bf8348ca6ed5d50709273c89984a 100644 (file)
@@ -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):