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
This commit is contained in:
huananhuawei 2016-10-20 15:03:06 +08:00
parent 14899a9a8e
commit d4ae67db31
3 changed files with 27 additions and 27 deletions

View File

@ -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'] = (

View File

@ -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)

View File

@ -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