Soft delete virtual_interfaces when instance is destroyed

Like the other reference table entries for an instance,
we should soft_delete virtual_interfaces when destroying
an instance. Failing to do so can lead to archive issues
due to the referential constraint.

Change-Id: I04355bdec5477b4c144105fea130089fe1ae6772
Closes-Bug: #1823781
This commit is contained in:
Matt Riedemann 2019-04-08 17:18:39 -04:00
parent 083eb4bc75
commit 1af9de4e6e
2 changed files with 17 additions and 0 deletions

View File

@ -1806,6 +1806,8 @@ def instance_destroy(context, instance_uuid, constraint=None):
model_query(context, models.Migration).\
filter_by(instance_uuid=instance_uuid).\
soft_delete()
model_query(context, models.VirtualInterface).filter_by(
instance_uuid=instance_uuid).soft_delete()
model_query(context, models.InstanceIdMapping).filter_by(
uuid=instance_uuid).soft_delete()
# NOTE(snikitin): We can't use model_query here, because there is no

View File

@ -2574,6 +2574,21 @@ class InstanceTestCase(test.TestCase, ModelsObjectComparatorMixin):
self.assertTrue(instance.deleted)
self.assertEqual(0, len(migrations))
def test_delete_virtual_interfaces_on_instance_destroy(self):
# Create the instance.
ctxt = context.get_admin_context()
uuid = uuidsentinel.uuid1
db.instance_create(ctxt, {'uuid': uuid})
# Create the VirtualInterface.
db.virtual_interface_create(ctxt, {'instance_uuid': uuid})
# Make sure the vif is tied to the instance.
vifs = db.virtual_interface_get_by_instance(ctxt, uuid)
self.assertEqual(1, len(vifs))
# Destroy the instance and verify the vif is gone as well.
db.instance_destroy(ctxt, uuid)
self.assertEqual(
0, len(db.virtual_interface_get_by_instance(ctxt, uuid)))
def test_instance_update_and_get_original(self):
instance = self.create_instance_with_args(vm_state='building')
(old_ref, new_ref) = db.instance_update_and_get_original(self.ctxt,