Delete InstanceSystemMetadata on instance deletion

Thanks to no-db-compute only pre-delete instance data is used in
notifications. So now we can go back to deleting InstanceSystemMetadata
when an instance is deleted.

Fixes bug 1153827

Change-Id: Ic66b998cde2a15a24f302f08c34753a8b57da73d
This commit is contained in:
Joe Gordon 2013-03-13 16:58:13 -07:00
parent 423289d50d
commit 17bca43895
3 changed files with 13 additions and 25 deletions

View File

@ -1522,6 +1522,9 @@ def instance_destroy(context, instance_uuid, constraint=None):
session.query(models.InstanceMetadata).\
filter_by(instance_uuid=instance_uuid).\
soft_delete()
session.query(models.InstanceSystemMetadata).\
filter_by(instance_uuid=instance_uuid).\
soft_delete()
return instance_ref

View File

@ -309,8 +309,9 @@ class UsageInfoTestCase(test.TestCase):
self.assertEquals(payload['image_ref_url'], image_ref_url)
self.compute.terminate_instance(self.context, instance)
def test_notify_usage_exists_deleted_instance(self):
# Ensure 'exists' notification generates appropriate usage data.
def test_notify_usage_exists_fail_on_deleted_instance(self):
# notify_usage_exists should not work for a deleted VM. A
# notification should be done before the instance is deleted in the db.
instance_id = self._create_instance()
instance = db.instance_get(self.context, instance_id)
# Set some system metadata
@ -322,27 +323,8 @@ class UsageInfoTestCase(test.TestCase):
self.compute.terminate_instance(self.context, instance)
instance = db.instance_get(self.context.elevated(read_deleted='yes'),
instance_id)
compute_utils.notify_usage_exists(self.context, instance)
msg = test_notifier.NOTIFICATIONS[-1]
self.assertEquals(msg['priority'], 'INFO')
self.assertEquals(msg['event_type'], 'compute.instance.exists')
payload = msg['payload']
self.assertEquals(payload['tenant_id'], self.project_id)
self.assertEquals(payload['user_id'], self.user_id)
self.assertEquals(payload['instance_id'], instance['uuid'])
self.assertEquals(payload['instance_type'], 'm1.tiny')
type_id = instance_types.get_instance_type_by_name('m1.tiny')['id']
self.assertEquals(str(payload['instance_type_id']), str(type_id))
for attr in ('display_name', 'created_at', 'launched_at',
'state', 'state_description',
'bandwidth', 'audit_period_beginning',
'audit_period_ending', 'image_meta'):
self.assertTrue(attr in payload,
msg="Key %s not in payload" % attr)
self.assertEquals(payload['image_meta'],
{'md_key1': 'val1', 'md_key2': 'val2'})
image_ref_url = "%s/images/1" % glance.generate_glance_url()
self.assertEquals(payload['image_ref_url'], image_ref_url)
self.assertRaises(KeyError, compute_utils.notify_usage_exists,
self.context, instance)
def test_notify_usage_exists_instance_not_found(self):
# Ensure 'exists' notification generates appropriate usage data.

View File

@ -470,7 +470,7 @@ class DbApiTestCase(DbTestCase):
system_meta = db.instance_system_metadata_get(ctxt, instance['uuid'])
self.assertEqual('baz', system_meta['original_image_ref'])
def test_delete_instance_metadata_on_instance_destroy(self):
def test_delete_instance_and_system_metadata_on_instance_destroy(self):
ctxt = context.get_admin_context()
# Create an instance with some metadata
@ -482,8 +482,11 @@ class DbApiTestCase(DbTestCase):
self.assertEqual('meow', instance_meta['key1'])
db.instance_destroy(ctxt, instance['uuid'])
instance_meta = db.instance_metadata_get(ctxt, instance['uuid'])
# Make sure instance metadata is deleted as well
instance_system_meta = db.instance_system_metadata_get(ctxt,
instance['uuid'])
# Make sure instance and system metadata is deleted as well
self.assertEqual({}, instance_meta)
self.assertEqual({}, instance_system_meta)
def test_instance_update_unique_name(self):
otherprojectcontext = context.RequestContext(self.user_id,