diff --git a/cinder/tests/unit/volume/drivers/huawei/test_huawei_drivers.py b/cinder/tests/unit/volume/drivers/huawei/test_huawei_drivers.py index 00d30f5e6..d0cb0aa0c 100644 --- a/cinder/tests/unit/volume/drivers/huawei/test_huawei_drivers.py +++ b/cinder/tests/unit/volume/drivers/huawei/test_huawei_drivers.py @@ -52,6 +52,7 @@ Volume = collections.namedtuple('Volume', vol_attrs) PROVIDER_LOCATION = '11' HOST = 'ubuntu001@backend001#OpenStack_Pool' ID = '21ec7341-9256-497b-97d9-ef48edcf0635' +ENCODE_NAME = huawei_utils.encode_name(ID) ADMIN_METADATA = {'huawei_lun_wwn': '6643e8c1004c5f6723e9f454003'} TEST_PAIR_ID = "3400a30d844d0004" REPLICA_DRIVER_DATA = '{"pair_id": "%s", "rmt_lun_id": "1"}' % TEST_PAIR_ID @@ -422,7 +423,7 @@ FAKE_QUERY_ALL_LUN_RESPONSE = { }, "data": [{ "ID": "1", - "NAME": huawei_utils.encode_name(ID) + "NAME": ENCODE_NAME }] } @@ -491,26 +492,17 @@ FAKE_LUN_COUNT_RESPONSE = """ } """ # A fake response of snapshot list response -FAKE_SNAPSHOT_LIST_INFO_RESPONSE = """ -{ +FAKE_SNAPSHOT_LIST_INFO_RESPONSE = { "error": { "code": 0, "description": "0" }, "data": [{ "ID": 11, - "NAME": "wr_LMKAjS7O_VtsEIREGYw" - }, - { - "ID": 12, - "NAME": "SDFAJSDFLKJ" - }, - { - "ID": 13, - "NAME": "s1Ew5v36To-hR2txJitX5Q" - }] + "NAME": ENCODE_NAME + }, ] } -""" + # A fake response of create snapshot response FAKE_CREATE_SNAPSHOT_INFO_RESPONSE = """ @@ -1251,7 +1243,7 @@ MAP_COMMAND_TO_FAKE_RESPONSE['/lun/1/PUT'] = ( MAP_COMMAND_TO_FAKE_RESPONSE['/lun/11/PUT'] = ( FAKE_COMMON_SUCCESS_RESPONSE) -MAP_COMMAND_TO_FAKE_RESPONSE['/lun?range=[0-65535]/GET'] = ( +MAP_COMMAND_TO_FAKE_RESPONSE['/lun?filter=NAME::%s/GET' % ENCODE_NAME] = ( json.dumps(FAKE_QUERY_ALL_LUN_RESPONSE)) MAP_COMMAND_TO_FAKE_RESPONSE['/lun/associate?TYPE=11&ASSOCIATEOBJTYPE=256' @@ -1355,8 +1347,8 @@ MAP_COMMAND_TO_FAKE_RESPONSE['/snapshot/stop/PUT'] = ( MAP_COMMAND_TO_FAKE_RESPONSE['/snapshot/11/DELETE'] = ( FAKE_COMMON_SUCCESS_RESPONSE) -MAP_COMMAND_TO_FAKE_RESPONSE['/snapshot?range=[0-32767]/GET'] = ( - FAKE_SNAPSHOT_LIST_INFO_RESPONSE) +MAP_COMMAND_TO_FAKE_RESPONSE['/snapshot?filter=NAME::%s/GET' % ENCODE_NAME] = ( + json.dumps(FAKE_SNAPSHOT_LIST_INFO_RESPONSE)) # mock QoS info map MAP_COMMAND_TO_FAKE_RESPONSE['/ioclass/11/GET'] = ( diff --git a/cinder/volume/drivers/huawei/huawei_driver.py b/cinder/volume/drivers/huawei/huawei_driver.py index 54d08f442..c5e0f873f 100644 --- a/cinder/volume/drivers/huawei/huawei_driver.py +++ b/cinder/volume/drivers/huawei/huawei_driver.py @@ -1305,6 +1305,7 @@ class HuaweiBaseDriver(driver.VolumeDriver): def _check_lun_valid_for_manage(self, lun_info, external_ref): lun_id = lun_info.get('ID') + lun_name = lun_info.get('NAME') # Check whether the LUN is already in LUN group. if lun_info.get('ISADD2LUNGROUP') == 'true': @@ -1402,9 +1403,9 @@ class HuaweiBaseDriver(driver.VolumeDriver): existing_ref=external_ref, reason=msg) # Check whether the LUN exists in a LUN mirror. - if self.client.is_lun_in_mirror(lun_id): + if self.client.is_lun_in_mirror(lun_name): msg = (_("Can't import LUN %s to Cinder. Already exists in " - "a LUN mirror.") % lun_id) + "a LUN mirror.") % lun_name) raise exception.ManageExistingInvalidReference( existing_ref=external_ref, reason=msg) diff --git a/cinder/volume/drivers/huawei/rest_client.py b/cinder/volume/drivers/huawei/rest_client.py index e6fdc537c..8e57fbf83 100644 --- a/cinder/volume/drivers/huawei/rest_client.py +++ b/cinder/volume/drivers/huawei/rest_client.py @@ -13,7 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import ast import json import re import six @@ -288,7 +287,10 @@ class RestClient(object): return item['ID'] def get_lun_id_by_name(self, name): - url = "/lun?range=[0-65535]" + if not name: + return + + url = "/lun?filter=NAME::%s" % name result = self.call(url, None, "GET") self._assert_rest_result(result, _('Get lun id by name error.')) @@ -350,7 +352,10 @@ class RestClient(object): self._assert_rest_result(result, _('Delete snapshot error.')) def get_snapshot_id_by_name(self, name): - url = "/snapshot?range=[0-32767]" + if not name: + return + + url = "/snapshot?filter=NAME::%s" % name description = 'The snapshot license file is unavailable.' result = self.call(url, None, "GET") if 'error' in result: @@ -2111,16 +2116,18 @@ class RestClient(object): return result.get('data', []) - def is_lun_in_mirror(self, lun_id): - url = "/lun?range=[0-65535]" + def is_lun_in_mirror(self, name): + if not name: + return False + + url = "/lun?filter=NAME::%s" % name result = self.call(url, None, "GET") self._assert_rest_result(result, _('Get volume by name error.')) for item in result.get('data', []): rss_obj = item.get('HASRSSOBJECT') if rss_obj: - rss_obj = ast.literal_eval(rss_obj) - if (item.get('ID') == lun_id and - rss_obj.get('LUNMirror') == 'TRUE'): + rss_obj = json.loads(rss_obj) + if rss_obj.get('LUNMirror') == 'TRUE': return True return False