]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Create resources in parallel where possible
authorZane Bitter <zbitter@redhat.com>
Tue, 28 May 2013 08:16:37 +0000 (10:16 +0200)
committerZane Bitter <zbitter@redhat.com>
Tue, 28 May 2013 08:16:37 +0000 (10:16 +0200)
Use the create co-routines with a DependencyTaskGroup to create resources
in parallel where possible, subject to their dependencies.

This implements blueprint concurrent-resource-scheduling with the exception
of nested stacks.

Change-Id: I4789ab11617b408622d8fc083e6b80a797d99e3a

heat/engine/parser.py
heat/tests/test_waitcondition.py

index 54e6f137a7ad222094a0851c4bb0e1a6e6fc81e0..ebe4614a927213b402baa42ca3155024c9afe177 100644 (file)
@@ -277,27 +277,24 @@ class Stack(object):
         reason = 'Stack successfully created'
         res = None
 
+        def resource_create(r):
+            return r.create
+
+        create_task = scheduler.DependencyTaskGroup(self.dependencies,
+                                                    resource_create)
+        create = scheduler.TaskRunner(create_task)
+
         with eventlet.Timeout(self.timeout_mins * 60) as tmo:
             try:
-                for res in self:
-                    if stack_status != self.CREATE_FAILED:
-                        try:
-                            scheduler.TaskRunner(res.create)()
-                        except exception.ResourceFailure as ex:
-                            stack_status = self.CREATE_FAILED
-                            reason = 'Resource %s failed with: %s' % (str(res),
-                                                                      str(ex))
-                    else:
-                        res.state_set(res.CREATE_FAILED,
-                                      'Stack creation aborted')
-
+                create()
+            except exception.ResourceFailure as ex:
+                stack_status = self.CREATE_FAILED
+                reason = 'Resource failed: %s' % str(ex)
             except eventlet.Timeout as t:
-                if t is tmo:
-                    stack_status = self.CREATE_FAILED
-                    reason = 'Timed out waiting for %s' % str(res)
-                else:
-                    # not my timeout
+                if t is not tmo:  # not my timeout
                     raise
+                stack_status = self.CREATE_FAILED
+                reason = 'Timed out'
 
         self.state_set(stack_status, reason)
 
index 9e26e067760eff3660916a6ae557123b04adb7bc..0415bb4104ac8b599238f6b1f8bf851811dc68be 100644 (file)
@@ -109,6 +109,8 @@ class WaitConditionTest(HeatTestCase):
         self.stack_id = stack.store()
 
         if stub:
+            scheduler.TaskRunner._sleep(mox.IsA(int)).AndReturn(None)
+
             self.m.StubOutWithMock(wc.WaitConditionHandle, 'keystone')
             wc.WaitConditionHandle.keystone().MultipleTimes().AndReturn(
                 self.fc)