From a74788455ae2f0d98ad6f137e73c37e5ce87ed12 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 14 Sep 2012 10:43:13 -0700 Subject: [PATCH] Allow older versions of libvirt to delete vms Libvirt < 0.9.4 doesn't support undefineFlags, so the vms can't be deleted. This patch adds a workaround to fallback to the old style of undefine if undefineFlags throws an Attribute error. It also attempts to remove any managed save images that exist. Fixes bug 1051010 Change-Id: I155fe2ab3be347b1515c5aab4a9233921bd722ca --- nova/tests/test_libvirt.py | 52 ++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index d0b89f78..060a8445 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -2165,8 +2165,7 @@ class LibvirtConnTestCase(test.TestCase): instance = db.instance_create(self.context, self.test_instance) conn.destroy(instance, {}) - def test_destroy(self): - """Ensure destroy calls virDomain.undefineFlags""" + def test_destroy_undefines(self): mock = self.mox.CreateMock(libvirt.virDomain) mock.destroy() mock.undefineFlags(1).AndReturn(1) @@ -2186,9 +2185,7 @@ class LibvirtConnTestCase(test.TestCase): "uuid": "875a8070-d0b9-4949-8b31-104d125c9a64"} conn.destroy(instance, []) - def test_destroy_noflag(self): - """Ensure destroy calls virDomain.undefine - if mock.undefineFlags raises an error""" + def test_destroy_undefines_no_undefine_flags(self): mock = self.mox.CreateMock(libvirt.virDomain) mock.destroy() mock.undefineFlags(1).AndRaise(libvirt.libvirtError('Err')) @@ -2209,6 +2206,51 @@ class LibvirtConnTestCase(test.TestCase): "uuid": "875a8070-d0b9-4949-8b31-104d125c9a64"} conn.destroy(instance, []) + def test_destroy_undefines_no_attribute_with_managed_save(self): + mock = self.mox.CreateMock(libvirt.virDomain) + mock.destroy() + mock.undefineFlags(1).AndRaise(AttributeError()) + mock.hasManagedSaveImage(0).AndReturn(True) + mock.managedSaveRemove(0) + mock.undefine() + + self.mox.ReplayAll() + + def fake_lookup_by_name(instance_name): + return mock + + def fake_get_info(instance_name): + return {'state': power_state.SHUTDOWN} + + conn = libvirt_driver.LibvirtDriver(False) + self.stubs.Set(conn, '_lookup_by_name', fake_lookup_by_name) + self.stubs.Set(conn, 'get_info', fake_get_info) + instance = {"name": "instancename", "id": "instanceid", + "uuid": "875a8070-d0b9-4949-8b31-104d125c9a64"} + conn.destroy(instance, []) + + def test_destroy_undefines_no_attribute_no_managed_save(self): + mock = self.mox.CreateMock(libvirt.virDomain) + mock.destroy() + mock.undefineFlags(1).AndRaise(AttributeError()) + mock.hasManagedSaveImage(0).AndRaise(AttributeError()) + mock.undefine() + + self.mox.ReplayAll() + + def fake_lookup_by_name(instance_name): + return mock + + def fake_get_info(instance_name): + return {'state': power_state.SHUTDOWN} + + conn = libvirt_driver.LibvirtDriver(False) + self.stubs.Set(conn, '_lookup_by_name', fake_lookup_by_name) + self.stubs.Set(conn, 'get_info', fake_get_info) + instance = {"name": "instancename", "id": "instanceid", + "uuid": "875a8070-d0b9-4949-8b31-104d125c9a64"} + conn.destroy(instance, []) + def test_private_destroy(self): """Ensure Instance not found skips undefine""" mock = self.mox.CreateMock(libvirt.virDomain)