summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaoki Saito <nasaito@nec.com>2020-07-17 17:30:17 +0900
committerNaoki Saito <nasaito@nec.com>2020-09-19 03:42:29 +0000
commitd77ae8785faac9084de401024178ed785fdd3725 (patch)
treea04fc05e732dbc1f68730f0c8ad9b05113ce6cc6
parentecb0bf3e032cb9214b3e21af0f9f4ba375ae0bbe (diff)
downloadcinder-d77ae8785faac9084de401024178ed785fdd3725.tar.gz
NEC driver: fix live-migration failure with FC
The initialize_connection() in the driver sometimes returns wrong LUN and causes a live-migration failure. The function searches the LUN from LD sets (attached hosts) and returns the first hit. The function must return an LUN of the destination host, but the first hit may be an LUN of the source host. This patch fixes initialize_connection() to return correct LUN by searching with WWPN of the desitination host. Change-Id: I102ae84204e0d88814a7d2e028f7cec118ad6b60 Closes-Bug: #1887908 (cherry picked from commit 94c1d241533397bb938682abeaa51ae74d069cb7) (cherry picked from commit c55e259d59af6a29ebef5deb61ea01633162f7a0)
-rw-r--r--cinder/tests/unit/volume/drivers/nec/test_volume.py69
-rw-r--r--cinder/volume/drivers/nec/volume_helper.py8
-rw-r--r--releasenotes/notes/bug-1887908-nec-live-migration-failure-withfc-3128fff7c48e739f.yaml6
3 files changed, 76 insertions, 7 deletions
diff --git a/cinder/tests/unit/volume/drivers/nec/test_volume.py b/cinder/tests/unit/volume/drivers/nec/test_volume.py
index ca2704ca4..b4640cb21 100644
--- a/cinder/tests/unit/volume/drivers/nec/test_volume.py
+++ b/cinder/tests/unit/volume/drivers/nec/test_volume.py
@@ -212,6 +212,17 @@ xml_out = '''
</OBJECT>
<OBJECT name="Logical Disk">
<SECTION name="LD Detail Information">
+ <UNIT name="LDN(h)">0011</UNIT>
+ <UNIT name="OS Type">LX</UNIT>
+ <UNIT name="LD Name">6EWPOChJkdSysJmpMAB9YR</UNIT>
+ <UNIT name="LD Capacity">6442450944</UNIT>
+ <UNIT name="Pool No.(h)">0001</UNIT>
+ <UNIT name="Purpose">---</UNIT>
+ <UNIT name="RPL Attribute">IV</UNIT>
+ </SECTION>
+ </OBJECT>
+ <OBJECT name="Logical Disk">
+ <SECTION name="LD Detail Information">
<UNIT name="LDN(h)">0fff</UNIT>
<UNIT name="OS Type"> </UNIT>
<UNIT name="LD Name">Pool0000_SYV0FFF</UNIT>
@@ -330,6 +341,26 @@ xml_out = '''
<UNIT name="LUN(h)">0001</UNIT>
<UNIT name="LDN(h)">0006</UNIT>
</SECTION>
+ <SECTION name="LUN/LD List">
+ <UNIT name="LUN(h)">0002</UNIT>
+ <UNIT name="LDN(h)">0011</UNIT>
+ </SECTION>
+ </OBJECT>
+ <OBJECT name="LD Set(FC)">
+ <SECTION name="LD Set(FC) Information">
+ <UNIT name="Platform">LX</UNIT>
+ <UNIT name="LD Set Name">OpenStack3</UNIT>
+ </SECTION>
+ <SECTION name="Path List">
+ <UNIT name="Path">1000-0090-FAA0-786D</UNIT>
+ </SECTION>
+ <SECTION name="Path List">
+ <UNIT name="Path">1000-0090-FAA0-786C</UNIT>
+ </SECTION>
+ <SECTION name="LUN/LD List">
+ <UNIT name="LUN(h)">0001</UNIT>
+ <UNIT name="LDN(h)">0011</UNIT>
+ </SECTION>
</OBJECT>
<OBJECT name="LD Set(iSCSI)">
<SECTION name="LD Set(iSCSI) Information">
@@ -1032,6 +1063,37 @@ class ExportTest(volume_helper.MStorageDSVDriver, test.TestCase):
self._fc_terminate_connection(vol, connector)
delldsetld_mock.assert_not_called()
+ vol = fake_volume_obj(ctx, id='ccd662e5-2efe-4899-b12f-114b5cad81c3')
+ connector = {'wwpns': ["10000090FAA0786A", "10000090FAA0786B"],
+ 'host': 'HostA'}
+ atchmnt = {
+ 'id': constants.ATTACHMENT_ID,
+ 'volume_id': vol.id,
+ 'connector': connector
+ }
+ attach_object = volume_attachment.VolumeAttachment(**atchmnt)
+ attachment = volume_attachment.VolumeAttachmentList(
+ objects=[attach_object])
+ vol.volume_attachment = attachment
+
+ info = self._fc_initialize_connection(vol, connector)
+ self.assertEqual(2, info['data']['target_lun'])
+
+ connector = {'wwpns': ["10000090FAA0786C", "10000090FAA0786D"],
+ 'host': 'HostB'}
+ atchmnt = {
+ 'id': constants.ATTACHMENT_ID,
+ 'volume_id': vol.id,
+ 'connector': connector
+ }
+ attach_object = volume_attachment.VolumeAttachment(**atchmnt)
+ attachment = volume_attachment.VolumeAttachmentList(
+ objects=[attach_object])
+ vol.volume_attachment = attachment
+
+ info = self._fc_initialize_connection(vol, connector)
+ self.assertEqual(1, info['data']['target_lun'])
+
def test_fc_terminate_connection(self):
ctx = context.RequestContext('admin', 'fake', True)
vol = fake_volume_obj(ctx, id='46045673-41e7-44a7-9333-02f07feab04b')
@@ -1243,7 +1305,12 @@ class NonDisruptiveBackup_test(volume_helper.MStorageDSVDriver,
'protocol': 'FC',
'wwpn': ['1000-0090-FAA0-786A', '1000-0090-FAA0-786B'],
'port': []}
- return_ldset = [ldset_lds0, ldset_lds1]
+ ldset_lds2 = {'ldsetname': 'LX:OpenStack1',
+ 'lds': {6: {'ldn': 6, 'lun': 1}},
+ 'protocol': 'FC',
+ 'wwpn': ['1000-0090-FAA0-786A', '1000-0090-FAA0-786B'],
+ 'port': []}
+ return_ldset = [ldset_lds0, ldset_lds1, ldset_lds2]
self.mock_object(self, '_validate_fcldset_exist',
side_effect=return_ldset)
mocker = self.mock_object(self._cli, 'addldsetld',
diff --git a/cinder/volume/drivers/nec/volume_helper.py b/cinder/volume/drivers/nec/volume_helper.py
index 9c3574359..440c6be9b 100644
--- a/cinder/volume/drivers/nec/volume_helper.py
+++ b/cinder/volume/drivers/nec/volume_helper.py
@@ -1278,15 +1278,11 @@ class MStorageDriver(volume_common.MStorageVolumeCommon):
else:
ldn = lds[ldname]['ldn']
- lun = None
- for ldset in ldsets.values():
- if ldn in ldset['lds']:
- lun = ldset['lds'][ldn]['lun']
- break
+ ldset = self._validate_fcldset_exist(ldsets, connector)
info = {
'driver_volume_type': 'fibre_channel',
- 'data': {'target_lun': lun,
+ 'data': {'target_lun': ldset['lds'][ldn]['lun'],
'target_wwn': target_wwns,
'initiator_target_map': init_targ_map}}
diff --git a/releasenotes/notes/bug-1887908-nec-live-migration-failure-withfc-3128fff7c48e739f.yaml b/releasenotes/notes/bug-1887908-nec-live-migration-failure-withfc-3128fff7c48e739f.yaml
new file mode 100644
index 000000000..34fce49ff
--- /dev/null
+++ b/releasenotes/notes/bug-1887908-nec-live-migration-failure-withfc-3128fff7c48e739f.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ `Bug #1887908 <https://bugs.launchpad.net/cinder/+bug/1887908>`_:
+ In NEC driver, fix live-migration failure with FC.
+