[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": "", "name": "",
"state": "online", "state": "online",
"release": "7.5.1", "release": "7.5.1",
"bundle": "87.51.9.0", "bundle": "87.51.63.0",
"MTM": "2421-961", "MTM": "2421-961",
"sn": "1300741", "sn": "1300741",
"wwnn": TEST_SOURCE_WWNN, "wwnn": TEST_SOURCE_WWNN,
@ -563,7 +563,7 @@ FAKE_GET_SYSTEM_RESPONSE_2 = {
"name": "", "name": "",
"state": "online", "state": "online",
"release": "7.5.1", "release": "7.5.1",
"bundle": "87.51.9.0", "bundle": "87.51.63.0",
"MTM": "2421-962", "MTM": "2421-962",
"sn": "1300742", "sn": "1300742",
"wwnn": TEST_TARGET_WWNN, "wwnn": TEST_TARGET_WWNN,
@ -989,7 +989,7 @@ class FakeDS8KCommonHelper(helper.DS8KCommonHelper):
self._get_value('san_login'), self._get_value('san_login'),
self._get_value('san_password'), self._get_value('san_password'),
None, True) None, True)
self.backend['rest_version'] = self._get_version()['bundle_version'] self.backend['rest_version'] = self._get_version()['bundle']
class FakeDS8KECKDHelper(FakeDS8KCommonHelper, helper.DS8KECKDHelper): 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): 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.""" """test the min version of REST for fb volume in 7.x."""
mock_get_version.return_value = { mock_get_version.return_value = {
"bundle_version": "5.7.50.0" "bundle": "87.50.38.0"
} }
self.assertRaises(exception.VolumeDriverException, self.assertRaises(exception.VolumeDriverException,
FakeDS8KCommonHelper, self.configuration, None) 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): 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.""" """test the min version of REST for fb volume in 8.1."""
mock_get_version.return_value = { mock_get_version.return_value = {
"bundle_version": "5.8.10.0" "bundle": "88.10.112.0"
} }
FakeDS8KCommonHelper(self.configuration, None) FakeDS8KCommonHelper(self.configuration, None)
@ -1189,7 +1189,7 @@ class DS8KProxyTest(test.TestCase):
self.configuration.ds8k_ssid_prefix = 'FF' self.configuration.ds8k_ssid_prefix = 'FF'
self.configuration.san_clustername = TEST_ECKD_POOL_ID self.configuration.san_clustername = TEST_ECKD_POOL_ID
mock_get_version.return_value = { mock_get_version.return_value = {
"bundle_version": "5.7.50.0" "bundle": "87.50.22.0"
} }
self.assertRaises(exception.VolumeDriverException, self.assertRaises(exception.VolumeDriverException,
FakeDS8KECKDHelper, self.configuration, None) FakeDS8KECKDHelper, self.configuration, None)
@ -1203,7 +1203,7 @@ class DS8KProxyTest(test.TestCase):
self.configuration.ds8k_ssid_prefix = 'FF' self.configuration.ds8k_ssid_prefix = 'FF'
self.configuration.san_clustername = TEST_ECKD_POOL_ID self.configuration.san_clustername = TEST_ECKD_POOL_ID
mock_get_version.return_value = { mock_get_version.return_value = {
"bundle_version": "5.8.10.0" "bundle": "88.10.112.0"
} }
self.assertRaises(exception.VolumeDriverException, self.assertRaises(exception.VolumeDriverException,
FakeDS8KECKDHelper, self.configuration, None) FakeDS8KECKDHelper, self.configuration, None)
@ -1217,7 +1217,7 @@ class DS8KProxyTest(test.TestCase):
self.configuration.ds8k_ssid_prefix = 'FF' self.configuration.ds8k_ssid_prefix = 'FF'
self.configuration.san_clustername = TEST_ECKD_POOL_ID self.configuration.san_clustername = TEST_ECKD_POOL_ID
mock_get_version.return_value = { mock_get_version.return_value = {
"bundle_version": "5.8.20.0" "bundle": "88.20.40.0"
} }
self.assertRaises(exception.VolumeDriverException, self.assertRaises(exception.VolumeDriverException,
FakeDS8KECKDHelper, self.configuration, None) FakeDS8KECKDHelper, self.configuration, None)
@ -3214,8 +3214,8 @@ class DS8KProxyTest(test.TestCase):
self.driver.create_group, self.driver.create_group,
self.ctxt, group) self.ctxt, group)
@ddt.data({'bundle_version': "5.7.51.1067"}, @ddt.data({'bundle': "87.51.60.0"},
{'bundle_version': "5.8.20.1058"}) {'bundle': "88.20.47.0"})
@mock.patch.object(helper.DS8KCommonHelper, '_get_version') @mock.patch.object(helper.DS8KCommonHelper, '_get_version')
def test_create_replication_consisgroup_should_verify_rest_version( def test_create_replication_consisgroup_should_verify_rest_version(
self, rest_version, mock_get_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'] OPTIONAL_PARAMS = ['ds8k_host_type', 'lss_range_for_cg']
# if use new REST API, please update the version below # 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' INVALID_STORAGE_VERSION = '8.0.1'
REST_VERSION_5_7_MIN_PPRC_CG = '5.7.51.1068' REST_VERSION_87_51_MIN_PPRC_CG = '87.51.63.0'
REST_VERSION_5_8_MIN_PPRC_CG = '5.8.20.1059' REST_VERSION_88_20_MIN_PPRC_CG = '88.20.112.0'
def __init__(self, conf, HTTPConnectorObject=None): def __init__(self, conf, HTTPConnectorObject=None):
self.conf = conf self.conf = conf
@ -148,7 +148,7 @@ class DS8KCommonHelper(object):
except restclient.TimeoutException: except restclient.TimeoutException:
raise restclient.APIException( raise restclient.APIException(
data=(_("Can't connect to %(host)s") % {'host': san_ip})) 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 " LOG.info("Connection to DS8K storage system %(host)s has been "
"established successfully, the version of REST is %(rest)s.", "established successfully, the version of REST is %(rest)s.",
{'host': self._get_value('san_ip'), {'host': self._get_value('san_ip'),
@ -224,14 +224,15 @@ class DS8KCommonHelper(object):
"if you want to use this version of driver, " "if you want to use this version of driver, "
"please upgrade the CCL.") "please upgrade the CCL.")
% self.INVALID_STORAGE_VERSION)) % 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.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( raise exception.VolumeDriverException(
message=(_("REST version %(invalid)s is lower than " message=(_("REST version %(invalid)s is lower than "
"%(valid)s, please upgrade it in DS8K.") "%(valid)s, please upgrade it in DS8K.")
% {'invalid': self.backend['rest_version'], % {'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): def verify_rest_version_for_pprc_cg(self):
if '8.1' in self.backend['rest_version']: 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 " message=_("REST for DS8K 8.1 does not support PPRC "
"consistency group, please upgrade the CCL.")) "consistency group, please upgrade the CCL."))
valid_rest_version = None 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.backend['rest_version']) <
dist_version.LooseVersion(self.REST_VERSION_5_7_MIN_PPRC_CG)): dist_version.LooseVersion(self.REST_VERSION_87_51_MIN_PPRC_CG)):
valid_rest_version = self.REST_VERSION_5_7_MIN_PPRC_CG valid_rest_version = self.REST_VERSION_87_51_MIN_PPRC_CG
elif ('5.8' in self.backend['rest_version'] and elif ('88' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) < dist_version.LooseVersion(self.backend['rest_version']) <
dist_version.LooseVersion(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_5_8_MIN_PPRC_CG valid_rest_version = self.REST_VERSION_88_20_MIN_PPRC_CG
if valid_rest_version: if valid_rest_version:
raise exception.VolumeDriverException( raise exception.VolumeDriverException(
@ -760,7 +762,7 @@ class DS8KCommonHelper(object):
self._client.send('DELETE', '/volumes/%s' % lun_id) self._client.send('DELETE', '/volumes/%s' % lun_id)
def _get_version(self): def _get_version(self):
return self._client.fetchone('GET', '') return self._client.fetchone('GET', '/systems')
@proxy.logger @proxy.logger
def _create_lun(self, volData): def _create_lun(self, volData):
@ -1042,8 +1044,8 @@ class DS8KECKDHelper(DS8KCommonHelper):
OPTIONAL_PARAMS = ['ds8k_host_type', 'port_pairs', 'ds8k_ssid_prefix', OPTIONAL_PARAMS = ['ds8k_host_type', 'port_pairs', 'ds8k_ssid_prefix',
'lss_range_for_cg'] 'lss_range_for_cg']
# if use new REST API, please update the version below # if use new REST API, please update the version below
VALID_REST_VERSION_5_7_MIN = '5.7.51.1068' VALID_REST_VERSION_87_51_MIN = '87.51.63.0'
VALID_REST_VERSION_5_8_MIN = '5.8.20.1059' VALID_REST_VERSION_88_20_MIN = '88.20.112.0'
MIN_VALID_STORAGE_VERSION = '8.1' MIN_VALID_STORAGE_VERSION = '8.1'
INVALID_STORAGE_VERSION = '8.0.1' INVALID_STORAGE_VERSION = '8.0.1'
@ -1094,19 +1096,20 @@ class DS8KECKDHelper(DS8KCommonHelper):
dist_version.LooseVersion(self.MIN_VALID_STORAGE_VERSION)): dist_version.LooseVersion(self.MIN_VALID_STORAGE_VERSION)):
self._disable_thin_provision = True 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.backend['rest_version']) <
dist_version.LooseVersion(self.VALID_REST_VERSION_5_7_MIN)) or dist_version.LooseVersion(self.VALID_REST_VERSION_87_51_MIN)) or
('5.8' in self.backend['rest_version'] and ('88' == rest_ver and
dist_version.LooseVersion(self.backend['rest_version']) < 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( raise exception.VolumeDriverException(
message=(_("REST version %(invalid)s is lower than " message=(_("REST version %(invalid)s is lower than "
"%(valid)s, please upgrade it in DS8K.") "%(valid)s, please upgrade it in DS8K.")
% {'invalid': self.backend['rest_version'], % {'invalid': self.backend['rest_version'],
'valid': (self.VALID_REST_VERSION_5_7_MIN if '5.7' 'valid': (self.VALID_REST_VERSION_87_51_MIN
in self.backend['rest_version'] else if '87' == rest_ver else
self.VALID_REST_VERSION_5_8_MIN)})) self.VALID_REST_VERSION_88_20_MIN)}))
@proxy.logger @proxy.logger
def _get_device_mapping(self): 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.