Implements sending notification on metadata change
It would be good to have a notification sent every time there is change in the metadata. This merge prop implements sending a compute.instance.update event for the above change. fixes bug 1034547 Change-Id: I451796b6a83c4782df6f72f083755527ebd62a52
This commit is contained in:
parent
0272c063bb
commit
ff8d3d95d4
|
@ -1742,6 +1742,8 @@ class API(base.Base):
|
|||
def delete_instance_metadata(self, context, instance, key):
|
||||
"""Delete the given metadata item from an instance."""
|
||||
self.db.instance_metadata_delete(context, instance['uuid'], key)
|
||||
instance['metadata'] = {}
|
||||
notifications.send_update(context, instance, instance)
|
||||
self.compute_rpcapi.change_instance_metadata(context,
|
||||
instance=instance,
|
||||
diff={key: ['-']})
|
||||
|
@ -1764,8 +1766,10 @@ class API(base.Base):
|
|||
_metadata.update(metadata)
|
||||
|
||||
self._check_metadata_properties_quota(context, _metadata)
|
||||
self.db.instance_metadata_update(context, instance['uuid'],
|
||||
metadata = self.db.instance_metadata_update(context, instance['uuid'],
|
||||
_metadata, True)
|
||||
instance['metadata'] = metadata
|
||||
notifications.send_update(context, instance, instance)
|
||||
diff = utils.diff_dict(orig, _metadata)
|
||||
self.compute_rpcapi.change_instance_metadata(context,
|
||||
instance=instance,
|
||||
|
|
|
@ -1478,7 +1478,8 @@ def instance_metadata_delete(context, instance_uuid, key):
|
|||
|
||||
def instance_metadata_update(context, instance_uuid, metadata, delete):
|
||||
"""Update metadata if it exists, otherwise create it."""
|
||||
IMPL.instance_metadata_update(context, instance_uuid, metadata, delete)
|
||||
return IMPL.instance_metadata_update(context, instance_uuid,
|
||||
metadata, delete)
|
||||
|
||||
|
||||
####################
|
||||
|
|
|
@ -334,5 +334,8 @@ def info_from_instance(context, instance_ref, network_info,
|
|||
image_meta_props = image_meta(system_metadata)
|
||||
instance_info["image_meta"] = image_meta_props
|
||||
|
||||
# add instance metadata
|
||||
instance_info['metadata'] = instance_ref['metadata']
|
||||
|
||||
instance_info.update(kw)
|
||||
return instance_info
|
||||
|
|
|
@ -3576,6 +3576,7 @@ class ComputeAPITestCase(BaseTestCase):
|
|||
|
||||
def test_instance_metadata(self):
|
||||
meta_changes = [None]
|
||||
self.flags(notify_on_any_change=True)
|
||||
|
||||
def fake_change_instance_metadata(inst, ctxt, diff, instance=None,
|
||||
instance_uuid=None):
|
||||
|
@ -3585,6 +3586,7 @@ class ComputeAPITestCase(BaseTestCase):
|
|||
|
||||
_context = context.get_admin_context()
|
||||
instance = self._create_fake_instance({'metadata': {'key1': 'value1'}})
|
||||
instance = dict(instance)
|
||||
|
||||
metadata = self.compute_api.get_instance_metadata(_context, instance)
|
||||
self.assertEqual(metadata, {'key1': 'value1'})
|
||||
|
@ -3595,6 +3597,12 @@ class ComputeAPITestCase(BaseTestCase):
|
|||
self.assertEqual(metadata, {'key1': 'value1', 'key2': 'value2'})
|
||||
self.assertEqual(meta_changes, [{'key2': ['+', 'value2']}])
|
||||
|
||||
self.assertEquals(len(test_notifier.NOTIFICATIONS), 1)
|
||||
msg = test_notifier.NOTIFICATIONS[0]
|
||||
payload = msg['payload']
|
||||
self.assertTrue('metadata' in payload)
|
||||
self.assertEquals(payload['metadata'], metadata)
|
||||
|
||||
new_metadata = {'key2': 'bah', 'key3': 'value3'}
|
||||
self.compute_api.update_instance_metadata(_context, instance,
|
||||
new_metadata, delete=True)
|
||||
|
@ -3606,11 +3614,23 @@ class ComputeAPITestCase(BaseTestCase):
|
|||
'key3': ['+', 'value3'],
|
||||
}])
|
||||
|
||||
self.assertEquals(len(test_notifier.NOTIFICATIONS), 2)
|
||||
msg = test_notifier.NOTIFICATIONS[1]
|
||||
payload = msg['payload']
|
||||
self.assertTrue('metadata' in payload)
|
||||
self.assertEquals(payload['metadata'], metadata)
|
||||
|
||||
self.compute_api.delete_instance_metadata(_context, instance, 'key2')
|
||||
metadata = self.compute_api.get_instance_metadata(_context, instance)
|
||||
self.assertEqual(metadata, {'key3': 'value3'})
|
||||
self.assertEqual(meta_changes, [{'key2': ['-']}])
|
||||
|
||||
self.assertEquals(len(test_notifier.NOTIFICATIONS), 3)
|
||||
msg = test_notifier.NOTIFICATIONS[2]
|
||||
payload = msg['payload']
|
||||
self.assertTrue('metadata' in payload)
|
||||
self.assertEquals(payload['metadata'], {})
|
||||
|
||||
db.instance_destroy(_context, instance['uuid'])
|
||||
|
||||
def test_get_instance_faults(self):
|
||||
|
|
Loading…
Reference in New Issue