From 281436ad7b2945d24d0a04c26adfd9fd7be541a9 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 28 May 2013 10:16:37 +0200 Subject: [PATCH] Create resources in parallel where possible 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 | 31 ++++++++++++++----------------- heat/tests/test_waitcondition.py | 2 ++ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 54e6f137..ebe4614a 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -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) diff --git a/heat/tests/test_waitcondition.py b/heat/tests/test_waitcondition.py index 9e26e067..0415bb41 100644 --- a/heat/tests/test_waitcondition.py +++ b/heat/tests/test_waitcondition.py @@ -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) -- 2.45.2