summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikhil Komawar <nikhil.komawar@rackspace.com>2012-08-10 11:12:27 -0400
committerNikhil Komawar <nikhil.komawar@rackspace.com>2012-08-21 15:03:36 +0000
commitff8d3d95d43212b786e97769fda89628a1724880 (patch)
tree9f07ca16f47038cb7ab40d1753706ea0d03aa2fe
parent0272c063bbc32f1ff39f2baa8ae3f0764723ef73 (diff)
downloadnova-ff8d3d95d43212b786e97769fda89628a1724880.tar.gz
nova-ff8d3d95d43212b786e97769fda89628a1724880.tar.xz
nova-ff8d3d95d43212b786e97769fda89628a1724880.zip
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
-rw-r--r--nova/compute/api.py6
-rw-r--r--nova/db/api.py3
-rw-r--r--nova/notifications.py3
-rw-r--r--nova/tests/compute/test_compute.py20
4 files changed, 30 insertions, 2 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 39b43594a..3453dfabe 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -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,
diff --git a/nova/db/api.py b/nova/db/api.py
index 94fdd8ce2..d0e90b260 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -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)
####################
diff --git a/nova/notifications.py b/nova/notifications.py
index 019db3388..73b318c5c 100644
--- a/nova/notifications.py
+++ b/nova/notifications.py
@@ -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
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index b6d775bd2..ad93481cc 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -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):