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