Merge "Storwize Support iSCSI host when FC volume is there"
This commit is contained in:
commit
ea2d1db31f
@ -2412,7 +2412,8 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
self.iscsi_driver.initialize_connection(volume_iSCSI, connector)
|
self.iscsi_driver.initialize_connection(volume_iSCSI, connector)
|
||||||
self.iscsi_driver.initialize_connection(volume_iSCSI, connector2)
|
self.iscsi_driver.initialize_connection(volume_iSCSI, connector2)
|
||||||
for conn in [connector, connector2]:
|
for conn in [connector, connector2]:
|
||||||
host = self.iscsi_driver._helpers.get_host_from_connector(conn)
|
host = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
|
conn, iscsi=True)
|
||||||
self.assertIsNotNone(host)
|
self.assertIsNotNone(host)
|
||||||
self.iscsi_driver.terminate_connection(volume_iSCSI, connector)
|
self.iscsi_driver.terminate_connection(volume_iSCSI, connector)
|
||||||
self.iscsi_driver.terminate_connection(volume_iSCSI, connector2)
|
self.iscsi_driver.terminate_connection(volume_iSCSI, connector2)
|
||||||
@ -2425,11 +2426,11 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
self.iscsi_driver.initialize_connection(volume_iSCSI, connector2)
|
self.iscsi_driver.initialize_connection(volume_iSCSI, connector2)
|
||||||
# Test multiple attachments case
|
# Test multiple attachments case
|
||||||
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector2)
|
connector2, iscsi=True)
|
||||||
self.iscsi_driver._helpers.unmap_vol_from_host(
|
self.iscsi_driver._helpers.unmap_vol_from_host(
|
||||||
volume_iSCSI['name'], host_name)
|
volume_iSCSI['name'], host_name)
|
||||||
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector2)
|
connector2, iscsi=True)
|
||||||
self.assertIsNotNone(host_name)
|
self.assertIsNotNone(host_name)
|
||||||
with mock.patch.object(storwize_svc_common.StorwizeSSH,
|
with mock.patch.object(storwize_svc_common.StorwizeSSH,
|
||||||
'rmvdiskhostmap') as rmmap:
|
'rmvdiskhostmap') as rmmap:
|
||||||
@ -2437,7 +2438,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
self.iscsi_driver.terminate_connection(volume_iSCSI,
|
self.iscsi_driver.terminate_connection(volume_iSCSI,
|
||||||
connector2)
|
connector2)
|
||||||
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector2)
|
connector2, iscsi=True)
|
||||||
self.assertIsNone(host_name)
|
self.assertIsNone(host_name)
|
||||||
# Test single attachment case
|
# Test single attachment case
|
||||||
self.iscsi_driver._helpers.unmap_vol_from_host(
|
self.iscsi_driver._helpers.unmap_vol_from_host(
|
||||||
@ -2448,7 +2449,8 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
self.iscsi_driver.terminate_connection(volume_iSCSI, connector)
|
self.iscsi_driver.terminate_connection(volume_iSCSI, connector)
|
||||||
# validate that the host entries are deleted
|
# validate that the host entries are deleted
|
||||||
for conn in [connector, connector2]:
|
for conn in [connector, connector2]:
|
||||||
host = self.iscsi_driver._helpers.get_host_from_connector(conn)
|
host = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
|
conn, iscsi=True)
|
||||||
self.assertIsNone(host)
|
self.assertIsNone(host)
|
||||||
|
|
||||||
def test_storwize_initialize_iscsi_connection_single_path(self):
|
def test_storwize_initialize_iscsi_connection_single_path(self):
|
||||||
@ -2478,7 +2480,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
# Check case where no hosts exist
|
# Check case where no hosts exist
|
||||||
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector)
|
connector, iscsi=True)
|
||||||
self.assertIsNone(ret)
|
self.assertIsNone(ret)
|
||||||
|
|
||||||
# Initialize connection to map volume to a host
|
# Initialize connection to map volume to a host
|
||||||
@ -2492,7 +2494,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
self.assertEqual(v, ret['data'][k])
|
self.assertEqual(v, ret['data'][k])
|
||||||
|
|
||||||
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector)
|
connector, iscsi=True)
|
||||||
self.assertIsNotNone(ret)
|
self.assertIsNotNone(ret)
|
||||||
|
|
||||||
def test_storwize_initialize_iscsi_connection_multipath(self):
|
def test_storwize_initialize_iscsi_connection_multipath(self):
|
||||||
@ -2530,7 +2532,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
# Check case where no hosts exist
|
# Check case where no hosts exist
|
||||||
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector)
|
connector, iscsi=True)
|
||||||
self.assertIsNone(ret)
|
self.assertIsNone(ret)
|
||||||
|
|
||||||
# Initialize connection to map volume to a host
|
# Initialize connection to map volume to a host
|
||||||
@ -2544,7 +2546,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
self.assertEqual(v, ret['data'][k])
|
self.assertEqual(v, ret['data'][k])
|
||||||
|
|
||||||
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
ret = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
connector)
|
connector, iscsi=True)
|
||||||
self.assertIsNotNone(ret)
|
self.assertIsNotNone(ret)
|
||||||
|
|
||||||
def test_storwize_svc_iscsi_host_maps(self):
|
def test_storwize_svc_iscsi_host_maps(self):
|
||||||
@ -2684,7 +2686,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
# Make sure our host still exists
|
# Make sure our host still exists
|
||||||
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
self._connector)
|
self._connector, iscsi=True)
|
||||||
self.assertIsNotNone(host_name)
|
self.assertIsNotNone(host_name)
|
||||||
|
|
||||||
# Remove the mapping from the 2nd volume. The host should
|
# Remove the mapping from the 2nd volume. The host should
|
||||||
@ -2696,11 +2698,11 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
fake_conn = {'ip': '127.0.0.1', 'initiator': 'iqn.fake'}
|
fake_conn = {'ip': '127.0.0.1', 'initiator': 'iqn.fake'}
|
||||||
self.iscsi_driver.initialize_connection(volume2, self._connector)
|
self.iscsi_driver.initialize_connection(volume2, self._connector)
|
||||||
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
self._connector)
|
self._connector, iscsi=True)
|
||||||
self.assertIsNotNone(host_name)
|
self.assertIsNotNone(host_name)
|
||||||
self.iscsi_driver.terminate_connection(volume2, fake_conn)
|
self.iscsi_driver.terminate_connection(volume2, fake_conn)
|
||||||
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
host_name = self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
self._connector)
|
self._connector, iscsi=True)
|
||||||
self.assertIsNone(host_name)
|
self.assertIsNone(host_name)
|
||||||
self.iscsi_driver.delete_volume(volume2)
|
self.iscsi_driver.delete_volume(volume2)
|
||||||
self._assert_vol_exists(volume2['name'], False)
|
self._assert_vol_exists(volume2['name'], False)
|
||||||
@ -2713,7 +2715,7 @@ class StorwizeSVCISCSIDriverTestCase(test.TestCase):
|
|||||||
if self.USESIM:
|
if self.USESIM:
|
||||||
ret = (
|
ret = (
|
||||||
self.iscsi_driver._helpers.get_host_from_connector(
|
self.iscsi_driver._helpers.get_host_from_connector(
|
||||||
self._connector))
|
self._connector, iscsi=True))
|
||||||
self.assertIsNone(ret)
|
self.assertIsNone(ret)
|
||||||
|
|
||||||
def test_storwize_svc_iscsi_multi_host_maps(self):
|
def test_storwize_svc_iscsi_multi_host_maps(self):
|
||||||
@ -2878,18 +2880,12 @@ class StorwizeSVCFcDriverTestCase(test.TestCase):
|
|||||||
'wwnns': ['20000090fa17311e', '20000090fa17311f'],
|
'wwnns': ['20000090fa17311e', '20000090fa17311f'],
|
||||||
'wwpns': ['ff00000000000000', 'ff00000000000001'],
|
'wwpns': ['ff00000000000000', 'ff00000000000001'],
|
||||||
'initiator': 'iqn.1993-08.org.debian:01:eac5ccc1aaa'}
|
'initiator': 'iqn.1993-08.org.debian:01:eac5ccc1aaa'}
|
||||||
|
|
||||||
self.fc_driver.initialize_connection(volume_fc, connector)
|
self.fc_driver.initialize_connection(volume_fc, connector)
|
||||||
# Create a FC host
|
# Create a FC host
|
||||||
helper = self.fc_driver._helpers
|
helper = self.fc_driver._helpers
|
||||||
|
|
||||||
if self.USESIM:
|
|
||||||
# tell lsfabric to not return anything
|
|
||||||
self.sim.error_injection('lsfabric', 'no_hosts')
|
|
||||||
host_name = helper.get_host_from_connector(
|
host_name = helper.get_host_from_connector(
|
||||||
connector, volume_fc['name'])
|
connector, volume_fc['name'])
|
||||||
if self.USESIM:
|
|
||||||
self.sim.error_injection('lsfabric', 'no_hosts')
|
|
||||||
self.assertIsNotNone(host_name)
|
self.assertIsNotNone(host_name)
|
||||||
|
|
||||||
def test_storwize_get_host_from_connector_with_lshost_failure(self):
|
def test_storwize_get_host_from_connector_with_lshost_failure(self):
|
||||||
@ -4206,19 +4202,20 @@ class StorwizeSVCCommonDriverTestCase(test.TestCase):
|
|||||||
tmpconn1 = {'initiator': u'unicode:initiator1.%s' % rand_id,
|
tmpconn1 = {'initiator': u'unicode:initiator1.%s' % rand_id,
|
||||||
'ip': '10.10.10.10',
|
'ip': '10.10.10.10',
|
||||||
'host': u'unicode.foo}.bar{.baz-%s' % rand_id}
|
'host': u'unicode.foo}.bar{.baz-%s' % rand_id}
|
||||||
self.driver._helpers.create_host(tmpconn1)
|
self.driver._helpers.create_host(tmpconn1, iscsi=True)
|
||||||
|
|
||||||
# Add a host with a different prefix
|
# Add a host with a different prefix
|
||||||
tmpconn2 = {'initiator': u'unicode:initiator2.%s' % rand_id,
|
tmpconn2 = {'initiator': u'unicode:initiator2.%s' % rand_id,
|
||||||
'ip': '10.10.10.11',
|
'ip': '10.10.10.11',
|
||||||
'host': u'unicode.hello.world-%s' % rand_id}
|
'host': u'unicode.hello.world-%s' % rand_id}
|
||||||
self.driver._helpers.create_host(tmpconn2)
|
self.driver._helpers.create_host(tmpconn2, iscsi=True)
|
||||||
|
|
||||||
conn = {'initiator': u'unicode:initiator3.%s' % rand_id,
|
conn = {'initiator': u'unicode:initiator3.%s' % rand_id,
|
||||||
'ip': '10.10.10.12',
|
'ip': '10.10.10.12',
|
||||||
'host': u'unicode.foo}.bar}.baz-%s' % rand_id}
|
'host': u'unicode.foo}.bar}.baz-%s' % rand_id}
|
||||||
self.driver.initialize_connection(volume1, conn)
|
self.driver.initialize_connection(volume1, conn)
|
||||||
host_name = self.driver._helpers.get_host_from_connector(conn)
|
host_name = self.driver._helpers.get_host_from_connector(
|
||||||
|
conn, iscsi=True)
|
||||||
self.assertIsNotNone(host_name)
|
self.assertIsNotNone(host_name)
|
||||||
self.driver.terminate_connection(volume1, conn)
|
self.driver.terminate_connection(volume1, conn)
|
||||||
host_name = self.driver._helpers.get_host_from_connector(conn)
|
host_name = self.driver._helpers.get_host_from_connector(conn)
|
||||||
@ -4227,7 +4224,8 @@ class StorwizeSVCCommonDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
# Clean up temporary hosts
|
# Clean up temporary hosts
|
||||||
for tmpconn in [tmpconn1, tmpconn2]:
|
for tmpconn in [tmpconn1, tmpconn2]:
|
||||||
host_name = self.driver._helpers.get_host_from_connector(tmpconn)
|
host_name = self.driver._helpers.get_host_from_connector(
|
||||||
|
tmpconn, iscsi=True)
|
||||||
self.assertIsNotNone(host_name)
|
self.assertIsNotNone(host_name)
|
||||||
self.driver._helpers.delete_host(host_name)
|
self.driver._helpers.delete_host(host_name)
|
||||||
|
|
||||||
|
@ -823,13 +823,14 @@ class StorwizeHelpers(object):
|
|||||||
wwpns.add(wwpn)
|
wwpns.add(wwpn)
|
||||||
return list(wwpns)
|
return list(wwpns)
|
||||||
|
|
||||||
def get_host_from_connector(self, connector, volume_name=None):
|
def get_host_from_connector(self, connector, volume_name=None,
|
||||||
|
iscsi=False):
|
||||||
"""Return the Storwize host described by the connector."""
|
"""Return the Storwize host described by the connector."""
|
||||||
LOG.debug('Enter: get_host_from_connector: %s.', connector)
|
LOG.debug('Enter: get_host_from_connector: %s.', connector)
|
||||||
|
|
||||||
# If we have FC information, we have a faster lookup option
|
# If we have FC information, we have a faster lookup option
|
||||||
host_name = None
|
host_name = None
|
||||||
if 'wwpns' in connector:
|
if 'wwpns' in connector and not iscsi:
|
||||||
for wwpn in connector['wwpns']:
|
for wwpn in connector['wwpns']:
|
||||||
resp = self.ssh.lsfabric(wwpn=wwpn)
|
resp = self.ssh.lsfabric(wwpn=wwpn)
|
||||||
for wwpn_info in resp:
|
for wwpn_info in resp:
|
||||||
@ -894,12 +895,13 @@ class StorwizeHelpers(object):
|
|||||||
# unexpected error so reraise it
|
# unexpected error so reraise it
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
pass
|
pass
|
||||||
if 'initiator' in connector:
|
if iscsi:
|
||||||
for iscsi in resp.select('iscsi_name'):
|
if 'initiator' in connector:
|
||||||
if iscsi == connector['initiator']:
|
for iscsi in resp.select('iscsi_name'):
|
||||||
host_name = name
|
if iscsi == connector['initiator']:
|
||||||
found = True
|
host_name = name
|
||||||
break
|
found = True
|
||||||
|
break
|
||||||
elif 'wwpns' in connector and len(connector['wwpns']):
|
elif 'wwpns' in connector and len(connector['wwpns']):
|
||||||
connector_wwpns = [str(x).lower() for x in connector['wwpns']]
|
connector_wwpns = [str(x).lower() for x in connector['wwpns']]
|
||||||
for wwpn in resp.select('WWPN'):
|
for wwpn in resp.select('WWPN'):
|
||||||
@ -913,7 +915,7 @@ class StorwizeHelpers(object):
|
|||||||
LOG.debug('Leave: get_host_from_connector: host %s.', host_name)
|
LOG.debug('Leave: get_host_from_connector: host %s.', host_name)
|
||||||
return host_name
|
return host_name
|
||||||
|
|
||||||
def create_host(self, connector):
|
def create_host(self, connector, iscsi=False):
|
||||||
"""Create a new host on the storage system.
|
"""Create a new host on the storage system.
|
||||||
|
|
||||||
We create a host name and associate it with the given connection
|
We create a host name and associate it with the given connection
|
||||||
@ -932,13 +934,18 @@ class StorwizeHelpers(object):
|
|||||||
raise exception.VolumeDriverException(message=msg)
|
raise exception.VolumeDriverException(message=msg)
|
||||||
|
|
||||||
ports = []
|
ports = []
|
||||||
if 'initiator' in connector:
|
if iscsi:
|
||||||
ports.append(['initiator', '%s' % connector['initiator']])
|
if 'initiator' in connector:
|
||||||
if 'wwpns' in connector:
|
ports.append(['initiator', '%s' % connector['initiator']])
|
||||||
for wwpn in connector['wwpns']:
|
else:
|
||||||
ports.append(['wwpn', '%s' % wwpn])
|
msg = _('create_host: No initiators supplied.')
|
||||||
|
else:
|
||||||
|
if 'wwpns' in connector:
|
||||||
|
for wwpn in connector['wwpns']:
|
||||||
|
ports.append(['wwpn', '%s' % wwpn])
|
||||||
|
else:
|
||||||
|
msg = _('create_host: No wwpns supplied.')
|
||||||
if not len(ports):
|
if not len(ports):
|
||||||
msg = _('create_host: No initiators or wwpns supplied.')
|
|
||||||
LOG.error(msg)
|
LOG.error(msg)
|
||||||
raise exception.VolumeDriverException(message=msg)
|
raise exception.VolumeDriverException(message=msg)
|
||||||
|
|
||||||
|
@ -135,10 +135,11 @@ class StorwizeSVCISCSIDriver(storwize_common.StorwizeSVCCommonDriver):
|
|||||||
volume_name = self._get_target_vol(volume)
|
volume_name = self._get_target_vol(volume)
|
||||||
|
|
||||||
# Check if a host object is defined for this host name
|
# Check if a host object is defined for this host name
|
||||||
host_name = self._helpers.get_host_from_connector(connector)
|
host_name = self._helpers.get_host_from_connector(connector,
|
||||||
|
iscsi=True)
|
||||||
if host_name is None:
|
if host_name is None:
|
||||||
# Host does not exist - add a new host to Storwize/SVC
|
# Host does not exist - add a new host to Storwize/SVC
|
||||||
host_name = self._helpers.create_host(connector)
|
host_name = self._helpers.create_host(connector, iscsi=True)
|
||||||
|
|
||||||
chap_secret = self._helpers.get_chap_secret_for_host(host_name)
|
chap_secret = self._helpers.get_chap_secret_for_host(host_name)
|
||||||
chap_enabled = self.configuration.storwize_svc_iscsi_chap_enabled
|
chap_enabled = self.configuration.storwize_svc_iscsi_chap_enabled
|
||||||
@ -242,7 +243,7 @@ class StorwizeSVCISCSIDriver(storwize_common.StorwizeSVCCommonDriver):
|
|||||||
auth_password=chap_secret,
|
auth_password=chap_secret,
|
||||||
discovery_auth_method='CHAP',
|
discovery_auth_method='CHAP',
|
||||||
discovery_auth_username=connector['initiator'],
|
discovery_auth_username=connector['initiator'],
|
||||||
discovery_auth_password= chap_secret)
|
discovery_auth_password=chap_secret)
|
||||||
LOG.debug('leave: _get_single_iscsi_data:\n volume: %(vol)s\n '
|
LOG.debug('leave: _get_single_iscsi_data:\n volume: %(vol)s\n '
|
||||||
'connector: %(conn)s\n lun_id: %(lun_id)s\n '
|
'connector: %(conn)s\n lun_id: %(lun_id)s\n '
|
||||||
'properties: %(prop)s',
|
'properties: %(prop)s',
|
||||||
@ -334,8 +335,8 @@ class StorwizeSVCISCSIDriver(storwize_common.StorwizeSVCCommonDriver):
|
|||||||
# get host according to iSCSI protocol
|
# get host according to iSCSI protocol
|
||||||
info = {'driver_volume_type': 'iscsi',
|
info = {'driver_volume_type': 'iscsi',
|
||||||
'data': {}}
|
'data': {}}
|
||||||
|
host_name = self._helpers.get_host_from_connector(connector,
|
||||||
host_name = self._helpers.get_host_from_connector(connector)
|
iscsi=True)
|
||||||
if host_name is None:
|
if host_name is None:
|
||||||
msg = (_('terminate_connection: Failed to get host name from'
|
msg = (_('terminate_connection: Failed to get host name from'
|
||||||
' connector.'))
|
' connector.'))
|
||||||
|
Loading…
Reference in New Issue
Block a user