Merge "Revert "Convert WaitConditionHandle to use handle_signal""
This commit is contained in:
commit
dd59d501bb
@ -12,7 +12,6 @@
|
||||
# under the License.
|
||||
|
||||
import json
|
||||
import warnings
|
||||
|
||||
from heat.common import exception
|
||||
from heat.common import identifier
|
||||
@ -67,28 +66,21 @@ class WaitConditionHandle(signal_responder.SignalResponder):
|
||||
return metadata['Status'] in WAIT_STATUSES
|
||||
|
||||
def metadata_update(self, new_metadata=None):
|
||||
"""DEPRECATED. Should use handle_signal instead."""
|
||||
warnings.warn('metadata_update is deprecated. '
|
||||
'You may need to update your heat-api-cfn service.',
|
||||
DeprecationWarning)
|
||||
self.handle_signal(details=new_metadata)
|
||||
|
||||
def handle_signal(self, details=None):
|
||||
'''
|
||||
Validate and update the resource metadata
|
||||
'''
|
||||
if details is None:
|
||||
if new_metadata is None:
|
||||
return
|
||||
|
||||
if self._metadata_format_ok(details):
|
||||
if self._metadata_format_ok(new_metadata):
|
||||
rsrc_metadata = self.metadata_get(refresh=True)
|
||||
if details['UniqueId'] in rsrc_metadata:
|
||||
if new_metadata['UniqueId'] in rsrc_metadata:
|
||||
LOG.warning(_("Overwriting Metadata item for UniqueId %s!")
|
||||
% details['UniqueId'])
|
||||
% new_metadata['UniqueId'])
|
||||
safe_metadata = {}
|
||||
for k in ('Data', 'Reason', 'Status'):
|
||||
safe_metadata[k] = details[k]
|
||||
rsrc_metadata.update({details['UniqueId']: safe_metadata})
|
||||
safe_metadata[k] = new_metadata[k]
|
||||
rsrc_metadata.update({new_metadata['UniqueId']: safe_metadata})
|
||||
self.metadata_set(rsrc_metadata)
|
||||
else:
|
||||
LOG.error(_("Metadata failed validation for %s") % self.name)
|
||||
|
@ -928,14 +928,6 @@ class EngineService(service.Service):
|
||||
if callable(stack[resource_name].signal):
|
||||
stack[resource_name].signal(details)
|
||||
|
||||
# Refresh the metadata for all other resources, since signals can
|
||||
# update metadata which is used by other resources, e.g
|
||||
# when signalling a WaitConditionHandle resource, and other
|
||||
# resources may refer to WaitCondition Fn::GetAtt Data
|
||||
for res in stack.dependencies:
|
||||
if res.name != resource_name and res.id is not None:
|
||||
res.metadata_update()
|
||||
|
||||
@request_context
|
||||
def find_physical_resource(self, cnxt, physical_resource_id):
|
||||
"""
|
||||
|
@ -243,10 +243,11 @@ class WaitCondMetadataUpdateTest(HeatTestCase):
|
||||
'''
|
||||
1 create stack
|
||||
2 assert empty instance metadata
|
||||
3 service.resource_signal()
|
||||
3 service.metadata_update()
|
||||
4 assert valid waitcond metadata
|
||||
5 assert valid instance metadata
|
||||
'''
|
||||
|
||||
self.stack = self.create_stack()
|
||||
|
||||
watch = self.stack['WC']
|
||||
@ -257,7 +258,7 @@ class WaitCondMetadataUpdateTest(HeatTestCase):
|
||||
self.assertIsNone(inst.metadata_get()['test'])
|
||||
|
||||
def update_metadata(id, data, reason):
|
||||
self.man.resource_signal(utils.dummy_context(),
|
||||
self.man.metadata_update(utils.dummy_context(),
|
||||
dict(self.stack.identifier()),
|
||||
'WH',
|
||||
{'Data': data, 'Reason': reason,
|
||||
|
@ -264,13 +264,13 @@ class WaitConditionTest(HeatTestCase):
|
||||
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '123'}
|
||||
handle.handle_signal(test_metadata)
|
||||
handle.metadata_update(new_metadata=test_metadata)
|
||||
wc_att = rsrc.FnGetAtt('Data')
|
||||
self.assertEqual('{"123": "foo"}', wc_att)
|
||||
|
||||
test_metadata = {'Data': 'dog', 'Reason': 'cat',
|
||||
'Status': 'SUCCESS', 'UniqueId': '456'}
|
||||
handle.handle_signal(test_metadata)
|
||||
handle.metadata_update(new_metadata=test_metadata)
|
||||
wc_att = rsrc.FnGetAtt('Data')
|
||||
self.assertEqual(u'{"123": "foo", "456": "dog"}', wc_att)
|
||||
self.m.VerifyAll()
|
||||
@ -433,61 +433,61 @@ class WaitConditionHandleTest(HeatTestCase):
|
||||
self.assertEqual(unicode(expected_url), rsrc.FnGetRefId())
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_handle_signal(self):
|
||||
def test_metadata_update(self):
|
||||
self.stack = self.create_stack()
|
||||
rsrc = self.stack['WaitHandle']
|
||||
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
|
||||
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '123'}
|
||||
rsrc.handle_signal(test_metadata)
|
||||
rsrc.metadata_update(new_metadata=test_metadata)
|
||||
handle_metadata = {u'123': {u'Data': u'foo',
|
||||
u'Reason': u'bar',
|
||||
u'Status': u'SUCCESS'}}
|
||||
self.assertEqual(handle_metadata, rsrc.metadata_get())
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_handle_signal_invalid(self):
|
||||
def test_metadata_update_invalid(self):
|
||||
self.stack = self.create_stack()
|
||||
rsrc = self.stack['WaitHandle']
|
||||
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
|
||||
|
||||
# handle_signal should raise a ValueError if the metadata
|
||||
# metadata_update should raise a ValueError if the metadata
|
||||
# is missing any of the expected keys
|
||||
err_metadata = {'Data': 'foo', 'Status': 'SUCCESS', 'UniqueId': '123'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
|
||||
err_metadata = {'Data': 'foo', 'Reason': 'bar', 'UniqueId': '1234'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
|
||||
err_metadata = {'Data': 'foo', 'Reason': 'bar', 'UniqueId': '1234'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
|
||||
err_metadata = {'data': 'foo', 'reason': 'bar',
|
||||
'status': 'SUCCESS', 'uniqueid': '1234'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
|
||||
# Also any Status other than SUCCESS or FAILURE should be rejected
|
||||
err_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'UCCESS', 'UniqueId': '123'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
err_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'wibble', 'UniqueId': '123'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
err_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'success', 'UniqueId': '123'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
err_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'FAIL', 'UniqueId': '123'}
|
||||
self.assertRaises(ValueError, rsrc.handle_signal,
|
||||
err_metadata)
|
||||
self.assertRaises(ValueError, rsrc.metadata_update,
|
||||
new_metadata=err_metadata)
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_get_status(self):
|
||||
@ -503,12 +503,12 @@ class WaitConditionHandleTest(HeatTestCase):
|
||||
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '123'}
|
||||
rsrc.handle_signal(test_metadata)
|
||||
rsrc.metadata_update(new_metadata=test_metadata)
|
||||
self.assertEqual(['SUCCESS'], rsrc.get_status())
|
||||
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '456'}
|
||||
rsrc.handle_signal(test_metadata)
|
||||
rsrc.metadata_update(new_metadata=test_metadata)
|
||||
self.assertEqual(['SUCCESS', 'SUCCESS'], rsrc.get_status())
|
||||
|
||||
def test_get_status_reason(self):
|
||||
@ -518,17 +518,17 @@ class WaitConditionHandleTest(HeatTestCase):
|
||||
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '123'}
|
||||
rsrc.handle_signal(test_metadata)
|
||||
rsrc.metadata_update(new_metadata=test_metadata)
|
||||
self.assertEqual(['bar'], rsrc.get_status_reason('SUCCESS'))
|
||||
|
||||
test_metadata = {'Data': 'dog', 'Reason': 'cat',
|
||||
'Status': 'SUCCESS', 'UniqueId': '456'}
|
||||
rsrc.handle_signal(test_metadata)
|
||||
rsrc.metadata_update(new_metadata=test_metadata)
|
||||
self.assertEqual(['bar', 'cat'], rsrc.get_status_reason('SUCCESS'))
|
||||
|
||||
test_metadata = {'Data': 'boo', 'Reason': 'hoo',
|
||||
'Status': 'FAILURE', 'UniqueId': '789'}
|
||||
rsrc.handle_signal(test_metadata)
|
||||
rsrc.metadata_update(new_metadata=test_metadata)
|
||||
self.assertEqual(['hoo'], rsrc.get_status_reason('FAILURE'))
|
||||
self.m.VerifyAll()
|
||||
|
||||
@ -591,7 +591,7 @@ class WaitConditionUpdateTest(HeatTestCase):
|
||||
wait_condition_handle = self.stack['WaitHandle']
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '1'}
|
||||
self._handle_signal(wait_condition_handle, test_metadata, 5)
|
||||
self._metadata_update(wait_condition_handle, test_metadata, 5)
|
||||
|
||||
uprops = copy.copy(rsrc.properties.data)
|
||||
uprops['Count'] = '5'
|
||||
@ -618,7 +618,7 @@ class WaitConditionUpdateTest(HeatTestCase):
|
||||
wait_condition_handle = self.stack['WaitHandle']
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '1'}
|
||||
self._handle_signal(wait_condition_handle, test_metadata, 5)
|
||||
self._metadata_update(wait_condition_handle, test_metadata, 5)
|
||||
|
||||
prop_diff = {"Count": 5}
|
||||
props = copy.copy(rsrc.properties.data)
|
||||
@ -645,13 +645,13 @@ class WaitConditionUpdateTest(HeatTestCase):
|
||||
wait_condition_handle = self.stack['WaitHandle']
|
||||
test_metadata = {'Data': 'foo', 'Reason': 'bar',
|
||||
'Status': 'SUCCESS', 'UniqueId': '1'}
|
||||
self._handle_signal(wait_condition_handle, test_metadata, 2)
|
||||
self._metadata_update(wait_condition_handle, test_metadata, 2)
|
||||
|
||||
self.stack.store()
|
||||
self.stack = self.get_stack(self.stack_id)
|
||||
rsrc = self.stack['WaitForTheHandle']
|
||||
|
||||
self._handle_signal(wait_condition_handle, test_metadata, 3)
|
||||
self._metadata_update(wait_condition_handle, test_metadata, 3)
|
||||
prop_diff = {"Count": 5}
|
||||
props = copy.copy(rsrc.properties.data)
|
||||
props.update(prop_diff)
|
||||
@ -663,10 +663,10 @@ class WaitConditionUpdateTest(HeatTestCase):
|
||||
self.assertEqual(5, rsrc.properties['Count'])
|
||||
self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state)
|
||||
|
||||
def _handle_signal(self, rsrc, metadata, times=1):
|
||||
def _metadata_update(self, rsrc, metadata, times=1):
|
||||
for time in range(times):
|
||||
metadata['UniqueId'] = metadata['UniqueId'] * 2
|
||||
rsrc.handle_signal(metadata)
|
||||
rsrc.metadata_update(new_metadata=metadata)
|
||||
|
||||
def test_handle_update_timeout(self):
|
||||
self.stack = self.create_stack()
|
||||
|
Loading…
Reference in New Issue
Block a user