From 1af9de4e6e546111fbe317fcf5392b1a47f2ef20 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Mon, 8 Apr 2019 17:18:39 -0400 Subject: [PATCH] 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 --- nova/db/sqlalchemy/api.py | 2 ++ nova/tests/unit/db/test_db_api.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ce8298fafe33..2234e525c64e 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -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 diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index 654db0b737c2..eb6e494811b9 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -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,