diff options
-rw-r--r-- | nova/compute/api.py | 6 | ||||
-rw-r--r-- | nova/db/api.py | 3 | ||||
-rw-r--r-- | nova/notifications.py | 3 | ||||
-rw-r--r-- | nova/tests/compute/test_compute.py | 20 |
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): |