diff options
author | Jenkins <jenkins@review.openstack.org> | 2012-09-14 20:49:49 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2012-09-14 20:49:49 +0000 |
commit | d41b93267f2c0e31fa94c8ea185864b631142df4 (patch) | |
tree | e92c956ed1d62c61c6de8ffebe62e58fbd1b3650 | |
parent | 0c47b74b84a274a7380ace9596b8b1fce62576df (diff) | |
parent | c6ddff821fef8d9edfc7498dbe19d5794d9adc8f (diff) | |
download | nova-d41b93267f2c0e31fa94c8ea185864b631142df4.tar.gz nova-d41b93267f2c0e31fa94c8ea185864b631142df4.tar.xz nova-d41b93267f2c0e31fa94c8ea185864b631142df4.zip |
Merge "Allow older versions of libvirt to delete vms"
-rw-r--r-- | nova/tests/test_libvirt.py | 52 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 12 |
2 files changed, 58 insertions, 6 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index d0b89f78f..060a8445a 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) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 9b6e6e9b4..7632ad960 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -501,10 +501,20 @@ class LibvirtDriver(driver.ComputeDriver): try: virt_dom.undefineFlags( libvirt.VIR_DOMAIN_UNDEFINE_MANAGED_SAVE) - except libvirt.libvirtError as e: + except libvirt.libvirtError: LOG.debug(_("Error from libvirt during undefineFlags." " Retrying with undefine"), instance=instance) virt_dom.undefine() + except AttributeError: + # NOTE(vish): Older versions of libvirt don't support + # undefine flags, so attempt to do the + # right thing. + try: + if virt_dom.hasManagedSaveImage(0): + virt_dom.managedSaveRemove(0) + except AttributeError: + pass + virt_dom.undefine() except libvirt.libvirtError as e: errcode = e.get_error_code() LOG.error(_("Error from libvirt during undefine. " |