diff --git a/cinder/tests/unit/volume/drivers/ibm/test_ds8k_proxy.py b/cinder/tests/unit/volume/drivers/ibm/test_ds8k_proxy.py index 81332fa4be2..51dbd56a21f 100644 --- a/cinder/tests/unit/volume/drivers/ibm/test_ds8k_proxy.py +++ b/cinder/tests/unit/volume/drivers/ibm/test_ds8k_proxy.py @@ -1125,6 +1125,22 @@ class DS8KProxyTest(test.TestCase): self.assertRaises(exception.InvalidParameterValue, FakeDS8KCommonHelper, self.configuration, None) + @ddt.data('25- 27-', '-25- 27', '25-27 122', '25, 26', '25-#28') + def test_get_lss_ids_for_cg_1(self, lss_range_for_cg): + """lss_range_for_cg should has the right format.""" + self.configuration.lss_range_for_cg = lss_range_for_cg + self.assertRaises(exception.InvalidParameterValue, + FakeDS8KCommonHelper, self.configuration, None) + + def test_get_lss_ids_for_cg_2(self): + """get value from lss_range_for_cg""" + self.configuration.lss_range_for_cg = '25- 27 30 32 85-88 EF' + cmn_helper = FakeDS8KCommonHelper(self.configuration, None) + lss_ids = cmn_helper._get_lss_ids_for_cg() + test_lss_ids = set(['25', '26', '27', '30', '32', + '85', '86', '87', '88', 'EF']) + self.assertEqual(test_lss_ids, lss_ids) + @mock.patch.object(helper.DS8KCommonHelper, 'get_systems') def test_verify_version_of_8_0_1(self, mock_get_systems): """8.0.1 should not use this driver.""" diff --git a/cinder/volume/drivers/ibm/ibm_storage/ds8k_helper.py b/cinder/volume/drivers/ibm/ibm_storage/ds8k_helper.py index 31137c5f1d7..24a5be2965e 100644 --- a/cinder/volume/drivers/ibm/ibm_storage/ds8k_helper.py +++ b/cinder/volume/drivers/ibm/ibm_storage/ds8k_helper.py @@ -161,22 +161,49 @@ class DS8KCommonHelper(object): self.backend['storage_version'] = storage_info['release'] def _get_lss_ids_for_cg(self): - lss_ids_for_cg = set() lss_range = self._get_value('lss_range_for_cg') - if lss_range: - lss_range = lss_range.replace(' ', '').split('-') - if len(lss_range) == 1: - begin = int(lss_range[0], 16) - end = begin - else: - begin = int(lss_range[0], 16) - end = int(lss_range[1], 16) - if begin > 0xFF or end > 0xFF or begin > end: + lss_ids_for_cg = set() + if not lss_range or not lss_range.strip(): + return lss_ids_for_cg + if '-' in lss_range: + lss_ids = list() + lss_range = lss_range.strip() + if lss_range.startswith('-') or lss_range.endswith('-'): + raise exception.InvalidParameterValue( + err=_('Param [lss_range_for_cg]\'s format is invalid, ' + 'please don\'t put the \'-\' at the beginning or ' + 'the end.')) + lss_range = lss_range.replace('-', ' - ').split() + for index, lss in enumerate(lss_range): + if lss is '-': + try: + begin = int(lss_range[index - 1], 16) + end = int(lss_range[index + 1], 16) + lss_ids_for_cg |= set( + ('%02x' % i).upper() for i in + range(begin, end + 1)) + except ValueError as e: + raise exception.InvalidParameterValue( + err=_('Param [lss_range_for_cg] is invalid, it ' + 'only supports space and \'-\' as ' + 'separator. ' + 'Exception = %s.') % six.text_type(e)) + else: + lss_ids.append(lss) + lss_ids_for_cg |= set(lss_ids) + else: + lss_ids_for_cg = set(lss_range.split()) + for lss_id in lss_ids_for_cg: + try: + if int(lss_id, 16) > 0xFF: + raise exception.InvalidParameterValue( + err=_('Param [lss_range_for_cg] is invalid, it ' + 'should be within 00-FF')) + except ValueError as e: raise exception.InvalidParameterValue( err=_('Param [lss_range_for_cg] is invalid, it ' - 'should be within 00-FF.')) - lss_ids_for_cg = set( - ('%02x' % i).upper() for i in range(begin, end + 1)) + 'only supports space and \'-\' as separator. ' + 'Exception = %s.') % six.text_type(e)) return lss_ids_for_cg def _check_host_type(self):