def create(self):
'''
Create the stack and all of the resources.
+ '''
+ creator = scheduler.TaskRunner(self.create_task)
+ creator(timeout=self.timeout_secs())
- Creation will fail if it exceeds the specified timeout. The default is
- 60 minutes, set in the constructor
+ @scheduler.wrappertask
+ def create_task(self):
+ '''
+ A task to create the stack and all of the resources.
'''
self.state_set(self.CREATE_IN_PROGRESS, 'Stack creation started')
create_task = scheduler.DependencyTaskGroup(self.dependencies,
resource_create)
- create = scheduler.TaskRunner(create_task)
- with eventlet.Timeout(self.timeout_secs()) as tmo:
- try:
- 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 not tmo: # not my timeout
- raise
- stack_status = self.CREATE_FAILED
- reason = 'Timed out'
+ try:
+ yield create_task()
+ except exception.ResourceFailure as ex:
+ stack_status = self.CREATE_FAILED
+ reason = 'Resource failed: %s' % str(ex)
+ except scheduler.Timeout:
+ stack_status = self.CREATE_FAILED
+ reason = 'Timed out'
self.state_set(stack_status, reason)
import mox
+import time
import uuid
from heat.common import context
self.m.VerifyAll()
+ def test_stack_create_timeout(self):
+ self.m.StubOutWithMock(scheduler.DependencyTaskGroup, '__call__')
+ self.m.StubOutWithMock(scheduler, 'wallclock')
+
+ stack = parser.Stack(None, 's', parser.Template({}))
+
+ def dummy_task():
+ while True:
+ yield
+
+ start_time = time.time()
+ scheduler.wallclock().AndReturn(start_time)
+ scheduler.wallclock().AndReturn(start_time + 1)
+ scheduler.DependencyTaskGroup.__call__().AndReturn(dummy_task())
+ scheduler.wallclock().AndReturn(start_time + stack.timeout_secs() + 1)
+
+ self.m.ReplayAll()
+
+ stack.create()
+
+ self.assertEqual(stack.state, stack.CREATE_FAILED)
+ self.assertEqual(stack.state_description, 'Timed out')
+
+ self.m.VerifyAll()
+
def test_stack_name_valid(self):
stack = parser.Stack(None, 's', parser.Template({}))
stack = parser.Stack(None, 'stack123', parser.Template({}))
self.stack = self.create_stack()
+ # Avoid the stack create exercising the timeout code at the same time
+ self.m.StubOutWithMock(self.stack, 'timeout_secs')
+ self.stack.timeout_secs().AndReturn(None)
+
self.m.StubOutWithMock(scheduler, 'wallclock')
scheduler.wallclock().AndReturn(st)