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:
Walter A. Boring IV 2016-03-02 03:05:29 -08:00 committed by Walter A. Boring IV (hemna)
parent 2b3d852396
commit feac52b6ef
3 changed files with 32 additions and 12 deletions

View File

@ -3599,7 +3599,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
mock.call.createVLUN(
self.VOLUME_3PAR_NAME,
auto=True,
hostname=self.FAKE_HOST),
hostname=self.FAKE_HOST,
lun=None),
mock.call.getHostVLUNs(self.FAKE_HOST)]
mock_client.assert_has_calls(
@ -3692,7 +3693,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
self.VOLUME_3PAR_NAME,
auto=True,
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_client.assert_has_calls(
@ -3765,7 +3767,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
mock.call.createVLUN(
self.VOLUME_3PAR_NAME,
auto=True,
hostname=self.FAKE_HOST),
hostname=self.FAKE_HOST,
lun=None),
mock.call.getHostVLUNs(self.FAKE_HOST)]
mock_client.assert_has_calls(
@ -4593,7 +4596,8 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
self.VOLUME_3PAR_NAME,
auto=True,
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_client.assert_has_calls(

View File

@ -203,10 +203,11 @@ class HP3PARCommon(object):
2.0.51 - Adds consistency group support
2.0.52 - Added update_migrated_volume. bug #1492023
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 = {}
@ -802,16 +803,22 @@ class HP3PARCommon(object):
def _delete_3par_host(self, 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:
location = None
auto = True
if lun_id:
auto = False
if nsp is None:
location = self.client.createVLUN(volume, hostname=hostname,
auto=True)
auto=auto, lun=lun_id)
else:
port = self.build_portPos(nsp)
location = self.client.createVLUN(volume, hostname=hostname,
auto=True, portPos=port)
auto=auto, portPos=port,
lun=lun_id)
vlun_info = None
if location:
@ -1026,13 +1033,14 @@ class HP3PARCommon(object):
{'name': volume_name, 'host': hostname})
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.
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'])
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,
host['name'],
vlun_info['lun_id'],

View File

@ -100,10 +100,11 @@ class HP3PARISCSIDriver(driver.TransferVD,
2.0.21 - Adds consistency group support
2.0.22 - Update driver to use ABC metaclasses
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):
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
# VLUN should be created or an existing one used.
lun_id = None
for port in ready_ports:
iscsi_ip = port['IPAddr']
if iscsi_ip in target_portal_ips:
@ -333,7 +335,13 @@ class HP3PARISCSIDriver(driver.TransferVD,
break
else:
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, self.iscsi_ips[iscsi_ip]['ip_port'])
target_portals.append(iscsi_ip_port)