Merge "Disconnect multipath iscsi may logout session"

This commit is contained in:
Jenkins 2016-07-12 06:07:27 +00:00 committed by Gerrit Code Review
commit 9f1f150085
2 changed files with 24 additions and 10 deletions

View File

@ -1161,8 +1161,9 @@ class ISCSIConnector(BaseLinuxConnector, BaseISCSIConnector):
if "/mapper/" in dev:
devices.append(dev)
else:
mpdev = mpath_map.get(dev)
if mpdev:
dev_name = self._linuxscsi.get_name_from_path(dev)
mpdev = mpath_map.get(dev_name)
if mpdev and mpdev not in devices:
devices.append(mpdev)
# Do a discovery to find all targets.

View File

@ -1031,6 +1031,7 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
'/dev/sdb': '/dev/mapper/mpathb'}
self.assertEqual(expected, self.connector._get_multipath_device_map())
@mock.patch.object(linuxscsi.LinuxSCSI, 'get_name_from_path')
@mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_map')
@mock.patch.object(connector.ISCSIConnector,
'_get_target_portals_from_iscsiadm_output')
@ -1046,17 +1047,20 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
self, exists_mock, multipath_iqn_mock, disconnect_mock,
get_all_devices_mock, get_iscsi_devices_mock,
rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock,
get_multipath_device_map_mock):
get_multipath_device_map_mock, get_name_from_path_mock):
iqn1 = 'iqn.2013-01.ro.com.netapp:node.netapp01'
iqn2 = 'iqn.2013-01.ro.com.netapp:node.netapp02'
iqns = [iqn1, iqn2]
portal = '10.0.0.1:3260'
dev = ('ip-%s-iscsi-%s-lun-0' % (portal, iqn1))
dev_name = '/dev/sdx'
get_portals_mock.return_value = [[portal, iqn1]]
multipath_iqn_mock.return_value = iqns
get_name_from_path_mock.return_value = dev_name
get_all_devices_mock.return_value = [dev, '/dev/mapper/md-1']
get_multipath_device_map_mock.return_value = {dev: '/dev/mapper/md-3'}
get_multipath_device_map_mock.return_value = {
dev_name: '/dev/mapper/md-3'}
get_iscsi_devices_mock.return_value = []
fake_property = {'target_portal': portal,
'target_iqn': iqn1}
@ -1065,6 +1069,7 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
# Target in use by other mp devices, don't disconnect
self.assertFalse(disconnect_mock.called)
@mock.patch.object(linuxscsi.LinuxSCSI, 'get_name_from_path')
@mock.patch.object(connector.ISCSIConnector,
'_get_target_portals_from_iscsiadm_output')
@mock.patch.object(connector.ISCSIConnector, '_rescan_iscsi')
@ -1079,18 +1084,21 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
def test_disconnect_volume_multipath_iscsi_other_targets(
self, exists_mock, multipath_iqn_mock, get_multipath_map_mock,
disconnect_mock, get_all_devices_mock, get_iscsi_devices_mock,
rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock):
rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock,
get_name_from_path_mock):
iqn1 = 'iqn.2010-10.org.openstack:target-1'
iqn2 = 'iqn.2010-10.org.openstack:target-2'
portal = '10.0.0.1:3260'
dev2 = ('ip-%s-iscsi-%s-lun-0' % (portal, iqn2))
dev_name = '/dev/sdx'
# Multiple targets are discovered, but only block devices for target-1
# is deleted and target-2 is in use.
get_portals_mock.return_value = [[portal, iqn1], [portal, iqn2]]
multipath_iqn_mock.return_value = [iqn2, iqn2]
get_name_from_path_mock.return_value = dev_name
get_all_devices_mock.return_value = [dev2, '/dev/mapper/md-1']
get_multipath_map_mock.return_value = {dev2: '/dev/mapper/md-3'}
get_multipath_map_mock.return_value = {dev_name: '/dev/mapper/md-3'}
get_iscsi_devices_mock.return_value = [dev2]
fake_property = {'target_portal': portal,
'target_iqn': iqn1}
@ -1099,6 +1107,7 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
# Only target-1 should be disconneced.
disconnect_mock.assert_called_once_with(fake_property)
@mock.patch.object(linuxscsi.LinuxSCSI, 'get_name_from_path')
@mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_map',
return_value={})
@mock.patch.object(connector.ISCSIConnector,
@ -1115,7 +1124,8 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
def test_disconnect_volume_multipath_iscsi_without_other_mp_devices(
self, exists_mock, disconnect_mock, get_all_devices_mock,
get_iscsi_devices_mock, rescan_multipath_mock, rescan_iscsi_mock,
get_portals_mock, get_multipath_device_map_mock):
get_portals_mock, get_multipath_device_map_mock,
get_name_from_path_mock):
portal = '10.0.2.15:3260'
name = 'volume-00000001'
iqn = 'iqn.2010-10.org.openstack:%s' % name
@ -1128,6 +1138,7 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
# Target not in use by other mp devices, disconnect
disconnect_mock.assert_called_once_with(fake_property)
@mock.patch.object(linuxscsi.LinuxSCSI, 'get_name_from_path')
@mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_map',
return_value={})
@mock.patch.object(connector.ISCSIConnector,
@ -1142,15 +1153,17 @@ class ISCSIConnectorTestCase(ConnectorTestCase):
def test_disconnect_volume_multipath_iscsi_with_invalid_symlink(
self, exists_mock, disconnect_mock, get_all_devices_mock,
get_iscsi_devices_mock, rescan_multipath_mock, rescan_iscsi_mock,
get_portals_mock, get_multipath_device_map_mock):
get_portals_mock, get_multipath_device_map_mock,
get_name_from_path_mock):
# Simulate a broken symlink by returning False for os.path.exists(dev)
portal = '10.0.0.1:3260'
name = 'volume-00000001'
iqn = 'iqn.2010-10.org.openstack:%s' % name
dev = ('ip-%s-iscsi-%s-lun-0' % (portal, iqn))
dev_name = '/dev/sdx'
get_portals_mock.return_value = [[portal, iqn]]
get_all_devices_mock.return_value = [dev, '/dev/mapper/md-1']
get_name_from_path_mock.return_value = dev_name
get_all_devices_mock.return_value = [dev_name, '/dev/mapper/md-1']
get_iscsi_devices_mock.return_value = []
fake_property = {'target_portal': portal,