From d4ae67db3112596c6e431d5dd2e48782b6fd093d Mon Sep 17 00:00:00 2001 From: huananhuawei Date: Thu, 20 Oct 2016 15:03:06 +0800 Subject: [PATCH] Huawei: Fix the rest query timeout problem Due to the amount of query data is too large to cause rest query timeout. This commit fixes that by matching by name when rest query Change-Id: Ied73574658403ed04cb238c953b11d56c9d35ba1 Closes-Bug: #1633956 --- .../drivers/huawei/test_huawei_drivers.py | 26 +++++++------------ cinder/volume/drivers/huawei/huawei_driver.py | 5 ++-- cinder/volume/drivers/huawei/rest_client.py | 23 ++++++++++------ 3 files changed, 27 insertions(+), 27 deletions(-) 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 00d30f5e603..d0cb0aa0cf6 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 54d08f44217..c5e0f873f91 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 e6fdc537cc3..8e57fbf8390 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