[IBM DS8K]: Fixed rest API issue to get bundle

Cinder driver for IBM storage DS8K is calling the unsupported
rest API "api/v1", which is failing with R9 version. Some
how this unsupported API is working with R7 and R8 versions.

Modified IBM DS8K driver to use the supported API to get the
bundle information.

closes bug: #1895510

Change-Id: If8c17eb48b67e7b109e19e4b064260cb52b5cecf
This commit is contained in:
GirishChilukuri 2020-09-15 08:46:23 +00:00
parent d428e3f909
commit b477632a66
3 changed files with 42 additions and 33 deletions

View File

@ -535,7 +535,7 @@ FAKE_GET_SYSTEM_RESPONSE_1 = {
"name": "",
"state": "online",
"release": "7.5.1",
"bundle": "87.51.9.0",
"bundle": "87.51.63.0",
"MTM": "2421-961",
"sn": "1300741",
"wwnn": TEST_SOURCE_WWNN,
@ -563,7 +563,7 @@ FAKE_GET_SYSTEM_RESPONSE_2 = {
"name": "",
"state": "online",
"release": "7.5.1",
"bundle": "87.51.9.0",
"bundle": "87.51.63.0",
"MTM": "2421-962",
"sn": "1300742",
"wwnn": TEST_TARGET_WWNN,
@ -989,7 +989,7 @@ class FakeDS8KCommonHelper(helper.DS8KCommonHelper):
self._get_value('san_login'),
self._get_value('san_password'),
None, True)
self.backend['rest_version'] = self._get_version()['bundle_version']
self.backend['rest_version'] = self._get_version()['bundle']
class FakeDS8KECKDHelper(FakeDS8KCommonHelper, helper.DS8KECKDHelper):
@ -1167,7 +1167,7 @@ class DS8KProxyTest(test.TestCase):
def test_verify_rest_version_for_5_7_fb(self, mock_get_version):
"""test the min version of REST for fb volume in 7.x."""
mock_get_version.return_value = {
"bundle_version": "5.7.50.0"
"bundle": "87.50.38.0"
}
self.assertRaises(exception.VolumeDriverException,
FakeDS8KCommonHelper, self.configuration, None)
@ -1176,7 +1176,7 @@ class DS8KProxyTest(test.TestCase):
def test_verify_rest_version_for_5_8_fb(self, mock_get_version):
"""test the min version of REST for fb volume in 8.1."""
mock_get_version.return_value = {
"bundle_version": "5.8.10.0"
"bundle": "88.10.112.0"
}
FakeDS8KCommonHelper(self.configuration, None)
@ -1189,7 +1189,7 @@ class DS8KProxyTest(test.TestCase):
self.configuration.ds8k_ssid_prefix = 'FF'
self.configuration.san_clustername = TEST_ECKD_POOL_ID
mock_get_version.return_value = {
"bundle_version": "5.7.50.0"
"bundle": "87.50.22.0"
}
self.assertRaises(exception.VolumeDriverException,
FakeDS8KECKDHelper, self.configuration, None)
@ -1203,7 +1203,7 @@ class DS8KProxyTest(test.TestCase):
self.configuration.ds8k_ssid_prefix = 'FF'
self.configuration.san_clustername = TEST_ECKD_POOL_ID
mock_get_version.return_value = {
"bundle_version": "5.8.10.0"
"bundle": "88.10.112.0"
}
self.assertRaises(exception.VolumeDriverException,
FakeDS8KECKDHelper, self.configuration, None)
@ -1217,7 +1217,7 @@ class DS8KProxyTest(test.TestCase):
self.configuration.ds8k_ssid_prefix = 'FF'
self.configuration.san_clustername = TEST_ECKD_POOL_ID
mock_get_version.return_value = {
"bundle_version": "5.8.20.0"
"bundle": "88.20.40.0"
}
self.assertRaises(exception.VolumeDriverException,
FakeDS8KECKDHelper, self.configuration, None)
@ -3214,8 +3214,8 @@ class DS8KProxyTest(test.TestCase):
self.driver.create_group,
self.ctxt, group)
@ddt.data({'bundle_version': "5.7.51.1067"},
{'bundle_version': "5.8.20.1058"})
@ddt.data({'bundle': "87.51.60.0"},
{'bundle': "88.20.47.0"})
@mock.patch.object(helper.DS8KCommonHelper, '_get_version')
def test_create_replication_consisgroup_should_verify_rest_version(
self, rest_version, mock_get_version):

View File

@ -61,10 +61,10 @@ class DS8KCommonHelper(object):
OPTIONAL_PARAMS = ['ds8k_host_type', 'lss_range_for_cg']
# if use new REST API, please update the version below
VALID_REST_VERSION_5_7_MIN = '5.7.51.1047'
VALID_REST_VERSION_87_51_MIN = '87.51.52.0'
INVALID_STORAGE_VERSION = '8.0.1'
REST_VERSION_5_7_MIN_PPRC_CG = '5.7.51.1068'
REST_VERSION_5_8_MIN_PPRC_CG = '5.8.20.1059'
REST_VERSION_87_51_MIN_PPRC_CG = '87.51.63.0'
REST_VERSION_88_20_MIN_PPRC_CG = '88.20.112.0'
def __init__(self, conf, HTTPConnectorObject=None):
self.conf = conf
@ -148,7 +148,7 @@ class DS8KCommonHelper(object):
except restclient.TimeoutException:
raise restclient.APIException(
data=(_("Can't connect to %(host)s") % {'host': san_ip}))
self.backend['rest_version'] = self._get_version()['bundle_version']
self.backend['rest_version'] = self._get_version()['bundle']
LOG.info("Connection to DS8K storage system %(host)s has been "
"established successfully, the version of REST is %(rest)s.",
{'host': self._get_value('san_ip'),
@ -224,14 +224,15 @@ class DS8KCommonHelper(object):
"if you want to use this version of driver, "
"please upgrade the CCL.")
% self.INVALID_STORAGE_VERSION))
if ('5.7' in self.backend['rest_version'] and
rest_ver = self.backend['rest_version'][0:2]
if ('87' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) <
dist_version.LooseVersion(self.VALID_REST_VERSION_5_7_MIN)):
dist_version.LooseVersion(self.VALID_REST_VERSION_87_51_MIN)):
raise exception.VolumeDriverException(
message=(_("REST version %(invalid)s is lower than "
"%(valid)s, please upgrade it in DS8K.")
% {'invalid': self.backend['rest_version'],
'valid': self.VALID_REST_VERSION_5_7_MIN}))
'valid': self.VALID_REST_VERSION_87_51_MIN}))
def verify_rest_version_for_pprc_cg(self):
if '8.1' in self.backend['rest_version']:
@ -239,14 +240,15 @@ class DS8KCommonHelper(object):
message=_("REST for DS8K 8.1 does not support PPRC "
"consistency group, please upgrade the CCL."))
valid_rest_version = None
if ('5.7' in self.backend['rest_version'] and
rest_ver = self.backend['rest_version'][0:2]
if ('87' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) <
dist_version.LooseVersion(self.REST_VERSION_5_7_MIN_PPRC_CG)):
valid_rest_version = self.REST_VERSION_5_7_MIN_PPRC_CG
elif ('5.8' in self.backend['rest_version'] and
dist_version.LooseVersion(self.REST_VERSION_87_51_MIN_PPRC_CG)):
valid_rest_version = self.REST_VERSION_87_51_MIN_PPRC_CG
elif ('88' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) <
dist_version.LooseVersion(self.REST_VERSION_5_8_MIN_PPRC_CG)):
valid_rest_version = self.REST_VERSION_5_8_MIN_PPRC_CG
dist_version.LooseVersion(self.REST_VERSION_88_20_MIN_PPRC_CG)):
valid_rest_version = self.REST_VERSION_88_20_MIN_PPRC_CG
if valid_rest_version:
raise exception.VolumeDriverException(
@ -760,7 +762,7 @@ class DS8KCommonHelper(object):
self._client.send('DELETE', '/volumes/%s' % lun_id)
def _get_version(self):
return self._client.fetchone('GET', '')
return self._client.fetchone('GET', '/systems')
@proxy.logger
def _create_lun(self, volData):
@ -1042,8 +1044,8 @@ class DS8KECKDHelper(DS8KCommonHelper):
OPTIONAL_PARAMS = ['ds8k_host_type', 'port_pairs', 'ds8k_ssid_prefix',
'lss_range_for_cg']
# if use new REST API, please update the version below
VALID_REST_VERSION_5_7_MIN = '5.7.51.1068'
VALID_REST_VERSION_5_8_MIN = '5.8.20.1059'
VALID_REST_VERSION_87_51_MIN = '87.51.63.0'
VALID_REST_VERSION_88_20_MIN = '88.20.112.0'
MIN_VALID_STORAGE_VERSION = '8.1'
INVALID_STORAGE_VERSION = '8.0.1'
@ -1094,19 +1096,20 @@ class DS8KECKDHelper(DS8KCommonHelper):
dist_version.LooseVersion(self.MIN_VALID_STORAGE_VERSION)):
self._disable_thin_provision = True
if (('5.7' in self.backend['rest_version'] and
rest_ver = self.backend['rest_version'][0:2]
if (('87' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) <
dist_version.LooseVersion(self.VALID_REST_VERSION_5_7_MIN)) or
('5.8' in self.backend['rest_version'] and
dist_version.LooseVersion(self.VALID_REST_VERSION_87_51_MIN)) or
('88' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) <
dist_version.LooseVersion(self.VALID_REST_VERSION_5_8_MIN))):
dist_version.LooseVersion(self.VALID_REST_VERSION_88_20_MIN))):
raise exception.VolumeDriverException(
message=(_("REST version %(invalid)s is lower than "
"%(valid)s, please upgrade it in DS8K.")
% {'invalid': self.backend['rest_version'],
'valid': (self.VALID_REST_VERSION_5_7_MIN if '5.7'
in self.backend['rest_version'] else
self.VALID_REST_VERSION_5_8_MIN)}))
'valid': (self.VALID_REST_VERSION_87_51_MIN
if '87' == rest_ver else
self.VALID_REST_VERSION_88_20_MIN)}))
@proxy.logger
def _get_device_mapping(self):

View File

@ -0,0 +1,6 @@
---
fixes:
- |
`Bug #1895510 <https://bugs.launchpad.net/cinder/+bug/1895510>`_:
IBM DS8K: Fixed compatability issue when using the IBM DS8K driver
with storage version R9 and later.