Merge "Add a new "UpdateWaitConditionHandle" resource"

This commit is contained in:
Jenkins 2014-01-24 09:27:34 +00:00 committed by Gerrit Code Review
commit f6e34a7aaa
2 changed files with 55 additions and 2 deletions

View File

@ -117,6 +117,19 @@ WAIT_STATUSES = (
)
class UpdateWaitConditionHandle(WaitConditionHandle):
'''
This works identically to a regular WaitConditionHandle, except that
on update it clears all signals received and changes the handle. Using
this handle means that you must setup the signal senders to send their
signals again any time the update handle changes. This allows us to roll
out new configurations and be confident that they are rolled out once
UPDATE COMPLETE is reached.
'''
def update(self, after, before=None, prev_resource=None):
raise resource.UpdateReplace(self.name)
class WaitConditionFailure(Exception):
def __init__(self, wait_condition, handle):
reasons = handle.get_status_reason(STATUS_FAILURE)
@ -278,4 +291,5 @@ def resource_mapping():
return {
'AWS::CloudFormation::WaitCondition': WaitCondition,
'AWS::CloudFormation::WaitConditionHandle': WaitConditionHandle,
'OS::Heat::UpdateWaitConditionHandle': UpdateWaitConditionHandle,
}

View File

@ -74,6 +74,27 @@ test_template_wc_count = '''
}
'''
test_template_update_waitcondition = '''
{
"HeatTemplateFormatVersion" : "2012-12-12",
"Description" : "Updatable Wait Condition",
"Parameters" : {},
"Resources" : {
"WaitHandle" : {
"Type" : "OS::Heat::UpdateWaitConditionHandle"
},
"WaitForTheHandle" : {
"Type" : "AWS::CloudFormation::WaitCondition",
"Properties" : {
"Handle" : {"Ref" : "WaitHandle"},
"Timeout" : "5",
"Count" : "3"
}
}
}
}
'''
class WaitConditionTest(HeatTestCase):
@ -573,8 +594,10 @@ class WaitConditionUpdateTest(HeatTestCase):
# Note tests creating a stack should be decorated with @stack_delete_after
# to ensure the stack is properly cleaned up
def create_stack(self):
temp = template_format.parse(test_template_wc_count)
def create_stack(self, tmpl=None):
if tmpl is None:
tmpl = test_template_wc_count
temp = template_format.parse(tmpl)
template = parser.Template(temp)
ctx = utils.dummy_context(tenant_id='test_tenant')
stack = parser.Stack(ctx, 'test_stack', template,
@ -738,3 +761,19 @@ class WaitConditionUpdateTest(HeatTestCase):
self.m.VerifyAll()
self.m.UnsetStubs()
@utils.stack_delete_after
def test_update_updatehandle(self):
self.stack = self.create_stack(test_template_update_waitcondition)
self.m.ReplayAll()
self.stack.create()
rsrc = self.stack['WaitForTheHandle']
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
self.m.VerifyAll()
self.m.UnsetStubs()
wait_condition_handle = self.stack['WaitHandle']
self.assertRaises(
resource.UpdateReplace, wait_condition_handle.update, None, None)