summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-05-16 13:13:04 +0000
committerGerrit Code Review <review@openstack.org>2013-05-16 13:13:04 +0000
commit5b51f6157941bc4fcd819b4b49b56ac837ea8b77 (patch)
tree4ff8089eac9ecd56cbcae793fda167b347b37f5e /nova/virt
parent56f5172f33bbd1da1b8749b7754805de44c3ab9c (diff)
parentfc786dd469a15bda1b9d3c7bacf9f1771b9b9956 (diff)
Merge "Detach volume fails when using multipath iscsi"
Diffstat (limited to 'nova/virt')
-rw-r--r--nova/virt/libvirt/volume.py64
1 files changed, 41 insertions, 23 deletions
diff --git a/nova/virt/libvirt/volume.py b/nova/virt/libvirt/volume.py
index eee25a52b..ef8818743 100644
--- a/nova/virt/libvirt/volume.py
+++ b/nova/virt/libvirt/volume.py
@@ -268,32 +268,20 @@ class LibvirtISCSIVolumeDriver(LibvirtBaseVolumeDriver):
@utils.synchronized('connect_volume')
def disconnect_volume(self, connection_info, disk_dev):
"""Detach the volume from instance_name."""
+ iscsi_properties = connection_info['data']
+ multipath_device = None
+ if CONF.libvirt_iscsi_use_multipath:
+ host_device = ("/dev/disk/by-path/ip-%s-iscsi-%s-lun-%s" %
+ (iscsi_properties['target_portal'],
+ iscsi_properties['target_iqn'],
+ iscsi_properties.get('target_lun', 0)))
+ multipath_device = self._get_multipath_device_name(host_device)
+
super(LibvirtISCSIVolumeDriver,
self).disconnect_volume(connection_info, disk_dev)
- iscsi_properties = connection_info['data']
- if CONF.libvirt_iscsi_use_multipath and \
- "mapper" in connection_info['data']['device_path']:
- self._rescan_iscsi()
- self._rescan_multipath()
- devices = [dev for dev in self.connection.get_all_block_devices()
- if "/mapper/" in dev]
- if not devices:
- #disconnect if no other multipath devices
- self._disconnect_mpath(iscsi_properties)
- return
-
- other_iqns = [self._get_multipath_iqn(device)
- for device in devices]
-
- if iscsi_properties['target_iqn'] not in other_iqns:
- #disconnect if no other multipath devices with same iqn
- self._disconnect_mpath(iscsi_properties)
- return
-
- #else do not disconnect iscsi portals,
- #as they are used for other luns
- return
+ if CONF.libvirt_iscsi_use_multipath and multipath_device:
+ return self._disconnect_volume_multipath_iscsi(iscsi_properties)
# NOTE(vish): Only disconnect from the target if no luns from the
# target are in use.
@@ -305,6 +293,36 @@ class LibvirtISCSIVolumeDriver(LibvirtBaseVolumeDriver):
if not devices:
self._disconnect_from_iscsi_portal(iscsi_properties)
+ def _disconnect_volume_multipath_iscsi(self, iscsi_properties):
+ self._rescan_iscsi()
+ self._rescan_multipath()
+ block_devices = self.connection.get_all_block_devices()
+ devices = []
+ for dev in block_devices:
+ if "/mapper/" in dev:
+ devices.append(dev)
+ else:
+ mpdev = self._get_multipath_device_name(dev)
+ if mpdev:
+ devices.append(mpdev)
+
+ if not devices:
+ # disconnect if no other multipath devices
+ self._disconnect_mpath(iscsi_properties)
+ return
+
+ other_iqns = [self._get_multipath_iqn(device)
+ for device in devices]
+
+ if iscsi_properties['target_iqn'] not in other_iqns:
+ # disconnect if no other multipath devices with same iqn
+ self._disconnect_mpath(iscsi_properties)
+ return
+
+ # else do not disconnect iscsi portals,
+ # as they are used for other luns
+ return
+
def _connect_to_iscsi_portal(self, iscsi_properties):
# NOTE(vish): If we are on the same host as nova volume, the
# discovery makes the target so we don't need to