Merge "HPE 3PAR: Handle single path in FC configuration"
This commit is contained in:
commit
f5cf4d66d1
@ -5578,7 +5578,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
mock_create_client.return_value = mock_client
|
mock_create_client.return_value = mock_client
|
||||||
result = self.driver.initialize_connection(
|
result = self.driver.initialize_connection(
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
|
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume(self.VOLUME_3PAR_NAME),
|
mock.call.getVolume(self.VOLUME_3PAR_NAME),
|
||||||
@ -5612,6 +5612,84 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
|
|
||||||
self.assertDictEqual(expected_properties, result)
|
self.assertDictEqual(expected_properties, result)
|
||||||
|
|
||||||
|
def test_initialize_connection_single_path(self):
|
||||||
|
# setup_mock_client drive with default configuration
|
||||||
|
# and return the mock HTTP 3PAR client
|
||||||
|
mock_client = self.setup_driver()
|
||||||
|
mock_client.getVolume.return_value = {'userCPG': HPE3PAR_CPG}
|
||||||
|
mock_client.getCPG.return_value = {}
|
||||||
|
mock_client.getHost.side_effect = [
|
||||||
|
hpeexceptions.HTTPNotFound('fake'),
|
||||||
|
{'name': self.FAKE_HOST,
|
||||||
|
'FCPaths': [{'driverVersion': None,
|
||||||
|
'firmwareVersion': None,
|
||||||
|
'hostSpeed': 0,
|
||||||
|
'model': None,
|
||||||
|
'portPos': {'cardPort': 1, 'node': 7,
|
||||||
|
'slot': 1},
|
||||||
|
'vendor': None,
|
||||||
|
'wwn': self.wwn[0]}]}]
|
||||||
|
mock_client.queryHost.return_value = {
|
||||||
|
'members': [{
|
||||||
|
'name': self.FAKE_HOST
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
mock_client.getHostVLUNs.side_effect = [
|
||||||
|
hpeexceptions.HTTPNotFound('fake'),
|
||||||
|
[{'active': True,
|
||||||
|
'volumeName': self.VOLUME_3PAR_NAME,
|
||||||
|
'portPos': {'node': 7, 'slot': 1, 'cardPort': 1},
|
||||||
|
'remoteName': self.wwn[0],
|
||||||
|
'lun': 90, 'type': 0}]]
|
||||||
|
|
||||||
|
location = ("%(volume_name)s,%(lun_id)s,%(host)s,%(nsp)s" %
|
||||||
|
{'volume_name': self.VOLUME_3PAR_NAME,
|
||||||
|
'lun_id': 90,
|
||||||
|
'host': self.FAKE_HOST,
|
||||||
|
'nsp': 'something'})
|
||||||
|
mock_client.createVLUN.return_value = location
|
||||||
|
expected_properties = {
|
||||||
|
'driver_volume_type': 'fibre_channel',
|
||||||
|
'data': {
|
||||||
|
'encrypted': False,
|
||||||
|
'target_lun': 90,
|
||||||
|
'target_wwn': ['0987654321234'],
|
||||||
|
'target_discovered': True,
|
||||||
|
'initiator_target_map':
|
||||||
|
{'123456789012345': ['0987654321234']}}}
|
||||||
|
|
||||||
|
with mock.patch.object(hpecommon.HPE3PARCommon,
|
||||||
|
'_create_client') as mock_create_client:
|
||||||
|
mock_create_client.return_value = mock_client
|
||||||
|
result = self.driver.initialize_connection(
|
||||||
|
self.volume,
|
||||||
|
self.connector.copy())
|
||||||
|
|
||||||
|
expected = [
|
||||||
|
mock.call.getVolume(self.VOLUME_3PAR_NAME),
|
||||||
|
mock.call.getCPG(HPE3PAR_CPG),
|
||||||
|
mock.call.getHost(self.FAKE_HOST),
|
||||||
|
mock.call.queryHost(wwns=['123456789012345']),
|
||||||
|
mock.call.getHost(self.FAKE_HOST),
|
||||||
|
mock.call.getPorts(),
|
||||||
|
mock.call.getHostVLUNs(self.FAKE_HOST),
|
||||||
|
mock.call.getPorts(),
|
||||||
|
mock.call.createVLUN(
|
||||||
|
self.VOLUME_3PAR_NAME,
|
||||||
|
auto=True,
|
||||||
|
hostname=self.FAKE_HOST,
|
||||||
|
lun=None,
|
||||||
|
portPos={'node': 7, 'slot': 1, 'cardPort': 1}),
|
||||||
|
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
||||||
|
|
||||||
|
mock_client.assert_has_calls(
|
||||||
|
self.standard_login +
|
||||||
|
expected +
|
||||||
|
self.standard_logout)
|
||||||
|
|
||||||
|
self.assertDictEqual(expected_properties, result)
|
||||||
|
|
||||||
@mock.patch('cinder.zonemanager.utils.create_lookup_service')
|
@mock.patch('cinder.zonemanager.utils.create_lookup_service')
|
||||||
def test_initialize_connection_with_lookup_single_nsp(self, mock_lookup):
|
def test_initialize_connection_with_lookup_single_nsp(self, mock_lookup):
|
||||||
# setup_mock_client drive with default configuration
|
# setup_mock_client drive with default configuration
|
||||||
@ -5772,7 +5850,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
mock_create_client.return_value = mock_client
|
mock_create_client.return_value = mock_client
|
||||||
result = self.driver.initialize_connection(
|
result = self.driver.initialize_connection(
|
||||||
self.volume_encrypted,
|
self.volume_encrypted,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
|
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume(self.VOLUME_3PAR_NAME),
|
mock.call.getVolume(self.VOLUME_3PAR_NAME),
|
||||||
@ -6419,7 +6497,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
||||||
mock.call.getCPG(HPE3PAR_CPG),
|
mock.call.getCPG(HPE3PAR_CPG),
|
||||||
@ -6466,7 +6544,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
||||||
mock.call.getCPG(HPE3PAR_CPG),
|
mock.call.getCPG(HPE3PAR_CPG),
|
||||||
@ -6508,7 +6586,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
|
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
||||||
@ -6548,7 +6626,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
||||||
mock.call.getCPG(HPE3PAR_CPG),
|
mock.call.getCPG(HPE3PAR_CPG),
|
||||||
@ -6587,7 +6665,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
# On Python 3, hash is randomized, and so set() is used to get
|
# On Python 3, hash is randomized, and so set() is used to get
|
||||||
# the expected order
|
# the expected order
|
||||||
fcwwns = list(set(('123456789054321', '123456789012345')))
|
fcwwns = list(set(('123456789054321', '123456789012345')))
|
||||||
@ -6630,7 +6708,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
|
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
||||||
@ -6673,7 +6751,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver):
|
|||||||
host = self.driver._create_host(
|
host = self.driver._create_host(
|
||||||
common,
|
common,
|
||||||
self.volume,
|
self.volume,
|
||||||
self.connector)
|
self.connector_multipath_enabled)
|
||||||
|
|
||||||
expected = [
|
expected = [
|
||||||
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
|
||||||
|
@ -108,10 +108,11 @@ class HPE3PARFCDriver(hpebasedriver.HPE3PARDriverBase):
|
|||||||
3.0.12 - Adds consistency group capability in generic volume groups.
|
3.0.12 - Adds consistency group capability in generic volume groups.
|
||||||
4.0.0 - Adds base class.
|
4.0.0 - Adds base class.
|
||||||
4.0.1 - Added check to remove FC zones. bug #1730720
|
4.0.1 - Added check to remove FC zones. bug #1730720
|
||||||
|
4.0.2 - Create one vlun in single path configuration. bug #1727176
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VERSION = "4.0.1"
|
VERSION = "4.0.2"
|
||||||
|
|
||||||
# The name of the CI wiki page.
|
# The name of the CI wiki page.
|
||||||
CI_WIKI_NAME = "HPE_Storage_CI"
|
CI_WIKI_NAME = "HPE_Storage_CI"
|
||||||
@ -168,6 +169,10 @@ class HPE3PARFCDriver(hpebasedriver.HPE3PARDriverBase):
|
|||||||
host = self._create_host(common, volume, connector)
|
host = self._create_host(common, volume, connector)
|
||||||
target_wwns, init_targ_map, numPaths = \
|
target_wwns, init_targ_map, numPaths = \
|
||||||
self._build_initiator_target_map(common, connector)
|
self._build_initiator_target_map(common, connector)
|
||||||
|
if not connector.get('multipath'):
|
||||||
|
target_wwns = target_wwns[:1]
|
||||||
|
initiator = connector.get('wwpns')[0]
|
||||||
|
init_targ_map[initiator] = init_targ_map[initiator][:1]
|
||||||
# check if a VLUN already exists for this host
|
# check if a VLUN already exists for this host
|
||||||
existing_vlun = common.find_existing_vlun(volume, host)
|
existing_vlun = common.find_existing_vlun(volume, host)
|
||||||
|
|
||||||
@ -387,6 +392,8 @@ class HPE3PARFCDriver(hpebasedriver.HPE3PARDriverBase):
|
|||||||
hostname = common._safe_hostname(connector['host'])
|
hostname = common._safe_hostname(connector['host'])
|
||||||
cpg = common.get_cpg(volume, allowSnap=True)
|
cpg = common.get_cpg(volume, allowSnap=True)
|
||||||
domain = common.get_domain(cpg)
|
domain = common.get_domain(cpg)
|
||||||
|
if not connector.get('multipath'):
|
||||||
|
connector['wwpns'] = connector['wwpns'][:1]
|
||||||
try:
|
try:
|
||||||
host = common._get_3par_host(hostname)
|
host = common._get_3par_host(hostname)
|
||||||
# Check whether host with wwn of initiator present on 3par
|
# Check whether host with wwn of initiator present on 3par
|
||||||
|
Loading…
x
Reference in New Issue
Block a user