diff options
| -rw-r--r-- | nova/exception.py | 4 | ||||
| -rw-r--r-- | nova/virt/libvirt/connection.py | 13 |
2 files changed, 16 insertions, 1 deletions
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 9ee098507..356bcdacf 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -471,7 +471,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): |
