3PAR use same LUN id for each export path
When multipath is enabled, and the 3PAR driver is configured to export a VLUN over N iSCSI IP(ports), we now use the same LUN ID for each iSCSI IP export. Previously, when we would export a volume over N iSCSI ports, we would get a new LUN ID for each iSCSI port. Master Change id: Ide0ce373a14f348a554688dee9b699feed3c5f26 Change-Id: If40b842e59e384db6eee11e9fa843e4ead6411d4 Closes-Bug: #1551994
This commit is contained in:
parent
2b3d852396
commit
feac52b6ef
|
@ -3599,7 +3599,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
|
||||||
mock.call.createVLUN(
|
mock.call.createVLUN(
|
||||||
self.VOLUME_3PAR_NAME,
|
self.VOLUME_3PAR_NAME,
|
||||||
auto=True,
|
auto=True,
|
||||||
hostname=self.FAKE_HOST),
|
hostname=self.FAKE_HOST,
|
||||||
|
lun=None),
|
||||||
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
||||||
|
|
||||||
mock_client.assert_has_calls(
|
mock_client.assert_has_calls(
|
||||||
|
@ -3692,7 +3693,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
|
||||||
self.VOLUME_3PAR_NAME,
|
self.VOLUME_3PAR_NAME,
|
||||||
auto=True,
|
auto=True,
|
||||||
hostname=self.FAKE_HOST,
|
hostname=self.FAKE_HOST,
|
||||||
portPos={'node': 7, 'slot': 1, 'cardPort': 1}),
|
portPos={'node': 7, 'slot': 1, 'cardPort': 1},
|
||||||
|
lun=None),
|
||||||
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
||||||
|
|
||||||
mock_client.assert_has_calls(
|
mock_client.assert_has_calls(
|
||||||
|
@ -3765,7 +3767,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
|
||||||
mock.call.createVLUN(
|
mock.call.createVLUN(
|
||||||
self.VOLUME_3PAR_NAME,
|
self.VOLUME_3PAR_NAME,
|
||||||
auto=True,
|
auto=True,
|
||||||
hostname=self.FAKE_HOST),
|
hostname=self.FAKE_HOST,
|
||||||
|
lun=None),
|
||||||
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
||||||
|
|
||||||
mock_client.assert_has_calls(
|
mock_client.assert_has_calls(
|
||||||
|
@ -4593,7 +4596,8 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
|
||||||
self.VOLUME_3PAR_NAME,
|
self.VOLUME_3PAR_NAME,
|
||||||
auto=True,
|
auto=True,
|
||||||
hostname=self.FAKE_HOST,
|
hostname=self.FAKE_HOST,
|
||||||
portPos=self.FAKE_ISCSI_PORT['portPos']),
|
portPos=self.FAKE_ISCSI_PORT['portPos'],
|
||||||
|
lun=None),
|
||||||
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
mock.call.getHostVLUNs(self.FAKE_HOST)]
|
||||||
|
|
||||||
mock_client.assert_has_calls(
|
mock_client.assert_has_calls(
|
||||||
|
|
|
@ -203,10 +203,11 @@ class HP3PARCommon(object):
|
||||||
2.0.51 - Adds consistency group support
|
2.0.51 - Adds consistency group support
|
||||||
2.0.52 - Added update_migrated_volume. bug #1492023
|
2.0.52 - Added update_migrated_volume. bug #1492023
|
||||||
2.0.53 - Fix volume size conversion. bug #1513158
|
2.0.53 - Fix volume size conversion. bug #1513158
|
||||||
|
2.0.54 - Use same LUN ID for each VLUN path #1551994
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VERSION = "2.0.53"
|
VERSION = "2.0.54"
|
||||||
|
|
||||||
stats = {}
|
stats = {}
|
||||||
|
|
||||||
|
@ -802,16 +803,22 @@ class HP3PARCommon(object):
|
||||||
def _delete_3par_host(self, hostname):
|
def _delete_3par_host(self, hostname):
|
||||||
self.client.deleteHost(hostname)
|
self.client.deleteHost(hostname)
|
||||||
|
|
||||||
def _create_3par_vlun(self, volume, hostname, nsp):
|
def _create_3par_vlun(self, volume, hostname, nsp, lun_id=None):
|
||||||
try:
|
try:
|
||||||
location = None
|
location = None
|
||||||
|
auto = True
|
||||||
|
|
||||||
|
if lun_id:
|
||||||
|
auto = False
|
||||||
|
|
||||||
if nsp is None:
|
if nsp is None:
|
||||||
location = self.client.createVLUN(volume, hostname=hostname,
|
location = self.client.createVLUN(volume, hostname=hostname,
|
||||||
auto=True)
|
auto=auto, lun=lun_id)
|
||||||
else:
|
else:
|
||||||
port = self.build_portPos(nsp)
|
port = self.build_portPos(nsp)
|
||||||
location = self.client.createVLUN(volume, hostname=hostname,
|
location = self.client.createVLUN(volume, hostname=hostname,
|
||||||
auto=True, portPos=port)
|
auto=auto, portPos=port,
|
||||||
|
lun=lun_id)
|
||||||
|
|
||||||
vlun_info = None
|
vlun_info = None
|
||||||
if location:
|
if location:
|
||||||
|
@ -1026,13 +1033,14 @@ class HP3PARCommon(object):
|
||||||
{'name': volume_name, 'host': hostname})
|
{'name': volume_name, 'host': hostname})
|
||||||
return found_vlun
|
return found_vlun
|
||||||
|
|
||||||
def create_vlun(self, volume, host, nsp=None):
|
def create_vlun(self, volume, host, nsp=None, lun_id=None):
|
||||||
"""Create a VLUN.
|
"""Create a VLUN.
|
||||||
|
|
||||||
In order to export a volume on a 3PAR box, we have to create a VLUN.
|
In order to export a volume on a 3PAR box, we have to create a VLUN.
|
||||||
"""
|
"""
|
||||||
volume_name = self._get_3par_vol_name(volume['id'])
|
volume_name = self._get_3par_vol_name(volume['id'])
|
||||||
vlun_info = self._create_3par_vlun(volume_name, host['name'], nsp)
|
vlun_info = self._create_3par_vlun(volume_name, host['name'], nsp,
|
||||||
|
lun_id=lun_id)
|
||||||
return self._get_vlun(volume_name,
|
return self._get_vlun(volume_name,
|
||||||
host['name'],
|
host['name'],
|
||||||
vlun_info['lun_id'],
|
vlun_info['lun_id'],
|
||||||
|
|
|
@ -100,10 +100,11 @@ class HP3PARISCSIDriver(driver.TransferVD,
|
||||||
2.0.21 - Adds consistency group support
|
2.0.21 - Adds consistency group support
|
||||||
2.0.22 - Update driver to use ABC metaclasses
|
2.0.22 - Update driver to use ABC metaclasses
|
||||||
2.0.23 - Added update_migrated_volume. bug # 1492023
|
2.0.23 - Added update_migrated_volume. bug # 1492023
|
||||||
|
2.0.24 - Use same LUN ID for each VLUN path #1551994
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VERSION = "2.0.23"
|
VERSION = "2.0.24"
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(HP3PARISCSIDriver, self).__init__(*args, **kwargs)
|
super(HP3PARISCSIDriver, self).__init__(*args, **kwargs)
|
||||||
|
@ -318,6 +319,7 @@ class HP3PARISCSIDriver(driver.TransferVD,
|
||||||
|
|
||||||
# Cycle through each ready iSCSI port and determine if a new
|
# Cycle through each ready iSCSI port and determine if a new
|
||||||
# VLUN should be created or an existing one used.
|
# VLUN should be created or an existing one used.
|
||||||
|
lun_id = None
|
||||||
for port in ready_ports:
|
for port in ready_ports:
|
||||||
iscsi_ip = port['IPAddr']
|
iscsi_ip = port['IPAddr']
|
||||||
if iscsi_ip in target_portal_ips:
|
if iscsi_ip in target_portal_ips:
|
||||||
|
@ -333,7 +335,13 @@ class HP3PARISCSIDriver(driver.TransferVD,
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
vlun = common.create_vlun(
|
vlun = common.create_vlun(
|
||||||
volume, host, self.iscsi_ips[iscsi_ip]['nsp'])
|
volume, host, self.iscsi_ips[iscsi_ip]['nsp'],
|
||||||
|
lun_id=lun_id)
|
||||||
|
|
||||||
|
# We want to use the same LUN ID for every port
|
||||||
|
if lun_id is None:
|
||||||
|
lun_id = vlun['lun']
|
||||||
|
|
||||||
iscsi_ip_port = "%s:%s" % (
|
iscsi_ip_port = "%s:%s" % (
|
||||||
iscsi_ip, self.iscsi_ips[iscsi_ip]['ip_port'])
|
iscsi_ip, self.iscsi_ips[iscsi_ip]['ip_port'])
|
||||||
target_portals.append(iscsi_ip_port)
|
target_portals.append(iscsi_ip_port)
|
||||||
|
|
Loading…
Reference in New Issue