From 44067ba758b378c4c2c2ff88b0d1b7a3c27ac812 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Mon, 27 Feb 2012 17:37:57 -0800 Subject: Call detach_volume when attach fails * Fixes bug 914974 * Raise exception.DeviceBusy when volume cannot attach Change-Id: Ie18377ba6acd6226612c70fa209185cc579c2d85 --- nova/exception.py | 4 ++++ nova/virt/libvirt/connection.py | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/nova/exception.py b/nova/exception.py index 668617500..e1caf28fe 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -362,6 +362,10 @@ class InvalidDevicePath(Invalid): message = _("The supplied device path (%(path)s) is invalid.") +class DeviceIsBusy(Invalid): + message = _("The supplied device (%(device)s) is busy.") + + class InvalidCPUInfo(Invalid): message = _("Unacceptable CPU info") + ": %(reason)s" diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index c531c2cc8..83277ea44 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -472,7 +472,18 @@ class LibvirtConnection(driver.ComputeDriver): if FLAGS.libvirt_type == 'lxc': self._attach_lxc_volume(xml, virt_dom, instance_name) else: - virt_dom.attachDevice(xml) + try: + virt_dom.attachDevice(xml) + except Exception, ex: + self.volume_driver_method('disconnect_volume', + connection_info, + mount_device) + + if isinstance(ex, libvirt.libvirtError): + errcode = ex.get_error_code() + if errcode == libvirt.VIR_ERR_OPERATION_FAILED: + raise exception.DeviceIsBusy(device=mount_device) + raise @staticmethod def _get_disk_xml(xml, device): -- cgit