1016 lines
39 KiB
Python
1016 lines
39 KiB
Python
# Copyright (c) 2013 - 2014 Huawei Technologies Co., Ltd.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
""" Tests for huawei 18000 storage."""
|
|
import json
|
|
import os
|
|
import shutil
|
|
import tempfile
|
|
import time
|
|
from xml.dom import minidom
|
|
|
|
import mock
|
|
|
|
from cinder import exception
|
|
from cinder import test
|
|
from cinder.volume import configuration as conf
|
|
from cinder.volume.drivers.huawei import huawei_18000
|
|
from cinder.volume.drivers.huawei import rest_common
|
|
|
|
|
|
test_volume = {'name': 'volume-21ec7341-9256-497b-97d9-ef48edcf0635',
|
|
'size': 2,
|
|
'volume_name': 'vol1',
|
|
'id': '21ec7341-9256-497b-97d9-ef48edcf0635',
|
|
'volume_id': '21ec7341-9256-497b-97d9-ef48edcf0635',
|
|
'provider_auth': None,
|
|
'project_id': 'project',
|
|
'display_name': 'vol1',
|
|
'display_description': 'test volume',
|
|
'volume_type_id': None,
|
|
'provider_location': '11'}
|
|
|
|
test_snap = {'name': 'volume-21ec7341-9256-497b-97d9-ef48edcf0635',
|
|
'size': 1,
|
|
'volume_name': 'vol1',
|
|
'id': '21ec7341-9256-497b-97d9-ef48edcf0635',
|
|
'volume_id': '21ec7341-9256-497b-97d9-ef48edcf0635',
|
|
'provider_auth': None,
|
|
'project_id': 'project',
|
|
'display_name': 'vol1',
|
|
'display_description': 'test volume',
|
|
'volume_type_id': None,
|
|
'provider_location': '11'}
|
|
|
|
FakeConnector = {'initiator': 'iqn.1993-08.debian:01:ec2bff7ac3a3',
|
|
'wwpns': ['10000090fa0d6754'],
|
|
'wwnns': ['10000090fa0d6755'],
|
|
'host': 'ubuntuc'}
|
|
|
|
|
|
def find_data(method):
|
|
if method is None:
|
|
data = """{"error":{"code":0},
|
|
"data":{"ID":"1",
|
|
"NAME":"5mFHcBv4RkCcD+JyrWc0SA"}}"""
|
|
if method == 'GET':
|
|
data = """{"error":{"code":0},
|
|
"data":[{"ID":"1",
|
|
"NAME":"IexzQZJWSXuX2e9I7c8GNQ"}]}"""
|
|
return data
|
|
|
|
|
|
def find_data_lun(method):
|
|
if method == 'GET':
|
|
data = """{"error":{"code":0},
|
|
"data":{"ID":"1",
|
|
"NAME":"IexzQZJWSXuX2e9I7c8GNQ",
|
|
"HEALTHSTATUS":"1",
|
|
"RUNNINGSTATUS":"27"}}"""
|
|
return data
|
|
|
|
|
|
def find_data_lungroup(method):
|
|
if method is None:
|
|
data = '{"error":{"code":0},\
|
|
"data":{"NAME":"5mFHcBv4RkCcD+JyrWc0SA",\
|
|
"DESCRIPTION":"5mFHcBv4RkCcD+JyrWc0SA",\
|
|
"ID":"11",\
|
|
"TYPE":256}}'
|
|
|
|
if method == "GET":
|
|
data = """{"error":{"code":0},
|
|
"data":[{
|
|
"NAME":"OpenStack_LunGroup_1",
|
|
"DESCRIPTION":"5mFHcBv4RkCcD+JyrWc0SA",
|
|
"ID":"11",
|
|
"TYPE":256}]}"""
|
|
|
|
if method == "DELETE":
|
|
data = """{"error":{"code":0},
|
|
"data":[{
|
|
"NAME":"IexzQZJWSXuX2e9I7c8GNQ",
|
|
"DESCRIPTION":"5mFHcBv4RkCcD+JyrWc0SA",
|
|
"ID":"11",
|
|
"TYPE":256}]}"""
|
|
return data
|
|
|
|
|
|
def find_data_hostgroup(method):
|
|
if method is None:
|
|
data = """{"error":{"code":0},"data":{
|
|
"NAME":"ubuntuc",
|
|
"DESCRIPTION":"",
|
|
"ID":"0",
|
|
"TYPE":14}}"""
|
|
|
|
if method == "GET":
|
|
data = """{"error":{"code":0},"data":[{
|
|
"NAME":"ubuntuc",
|
|
"DESCRIPTION":"",
|
|
"ID":"0","TYPE":14}]}"""
|
|
return data
|
|
|
|
|
|
def Fake_sleep(time):
|
|
pass
|
|
|
|
|
|
def find_data_mappingview(method, other_flag):
|
|
if method is None:
|
|
data = """{"error":{"code":0},"data":
|
|
{"WORKMODE":"255","HEALTHSTATUS":"1",
|
|
"NAME":"mOWtSXnaQKi3hpB3tdFRIQ",
|
|
"RUNNINGSTATUS":"27","DESCRIPTION":"",
|
|
"ENABLEINBANDCOMMAND":"true",
|
|
"ID":"1","INBANDLUNWWN":"",
|
|
"TYPE":245}}
|
|
"""
|
|
|
|
if method == "GET":
|
|
if other_flag:
|
|
data = """{"error":{"code":0},"data":[
|
|
{"WORKMODE":"255","HEALTHSTATUS":"1",
|
|
"NAME":"mOWtSXnaQKi3hpB3tdFRIQ",
|
|
"RUNNINGSTATUS":"27","DESCRIPTION":"",
|
|
"ENABLEINBANDCOMMAND":"true","ID":"1",
|
|
"INBANDLUNWWN":"","TYPE":245},
|
|
{"WORKMODE":"255","HEALTHSTATUS":"1",
|
|
"NAME":"YheUoRwbSX2BxN767nvLSw",
|
|
"RUNNINGSTATUS":"27","DESCRIPTION":"",
|
|
"ENABLEINBANDCOMMAND":"true",
|
|
"ID":"2","INBANDLUNWWN":"",
|
|
"TYPE":245}]}
|
|
"""
|
|
else:
|
|
data = """{"error":{"code":0},"data":[
|
|
{"WORKMODE":"255","HEALTHSTATUS":"1",
|
|
"NAME":"IexzQZJWSXuX2e9I7c8GNQ",
|
|
"RUNNINGSTATUS":"27","DESCRIPTION":"",
|
|
"ENABLEINBANDCOMMAND":"true","ID":"1",
|
|
"INBANDLUNWWN":"","TYPE":245},
|
|
{"WORKMODE":"255","HEALTHSTATUS":"1",
|
|
"NAME":"YheUoRwbSX2BxN767nvLSw",
|
|
"RUNNINGSTATUS":"27","DESCRIPTION":"",
|
|
"ENABLEINBANDCOMMAND":"true","ID":"2",
|
|
"INBANDLUNWWN":"","TYPE":245}]}
|
|
"""
|
|
return data
|
|
|
|
|
|
def find_data_snapshot(method):
|
|
if method is None:
|
|
data = '{"error":{"code":0},"data":{"ID":11,"NAME":"YheUoRwbSX2BxN7"}}'
|
|
if method == "GET":
|
|
data = """{"error":{"code":0},"data":[
|
|
{"ID":11,"NAME":"SDFAJSDFLKJ"},
|
|
{"ID":12,"NAME":"SDFAJSDFLKJ2"}]}"""
|
|
return data
|
|
|
|
|
|
def find_data_host(method):
|
|
if method is None:
|
|
data = """{"error":{"code":0},
|
|
"data":
|
|
{"PARENTTYPE":245,
|
|
"NAME":"Default Host",
|
|
"DESCRIPTION":"",
|
|
"RUNNINGSTATUS":"1",
|
|
"IP":"",
|
|
"PARENTNAME":"0",
|
|
"OPERATIONSYSTEM":"1",
|
|
"LOCATION":"",
|
|
"HEALTHSTATUS":"1",
|
|
"MODEL":"",
|
|
"ID":"0",
|
|
"PARENTID":"0",
|
|
"NETWORKNAME":"",
|
|
"TYPE":21}} """
|
|
|
|
if method == "GET":
|
|
data = """{"error":{"code":0},
|
|
"data":[
|
|
{"PARENTTYPE":245,"NAME":"ubuntuc",
|
|
"DESCRIPTION":"","RUNNINGSTATUS":"1",
|
|
"IP":"","PARENTNAME":"",
|
|
"OPERATIONSYSTEM":"0","LOCATION":"",
|
|
"HEALTHSTATUS":"1","MODEL":"",
|
|
"ID":"1","PARENTID":"",
|
|
"NETWORKNAME":"","TYPE":21},
|
|
{"PARENTTYPE":245,"NAME":"ubuntu",
|
|
"DESCRIPTION":"","RUNNINGSTATUS":"1",
|
|
"IP":"","PARENTNAME":"","OPERATIONSYSTEM":"0",
|
|
"LOCATION":"","HEALTHSTATUS":"1",
|
|
"MODEL":"","ID":"2","PARENTID":"",
|
|
"NETWORKNAME":"","TYPE":21}]} """
|
|
return data
|
|
|
|
|
|
def find_data_host_associate(method):
|
|
if (method is None) or (method == "GET"):
|
|
data = '{"error":{"code":0}}'
|
|
return data
|
|
|
|
|
|
def data_session(url):
|
|
if url == "/xx/sessions":
|
|
data = """{"error":{"code":0},
|
|
"data":{"username":"admin",
|
|
"iBaseToken":"2001031430",
|
|
"deviceid":"210235G7J20000000000"}}"""
|
|
if url == "sessions":
|
|
data = '{"error":{"code":0},"data":{"ID":11}}'
|
|
return data
|
|
|
|
|
|
def data_lun(url, method):
|
|
if url == "lun":
|
|
data = find_data(method)
|
|
if url == "lun/1":
|
|
data = find_data_lun(method)
|
|
if url == "lun?range=[0-65535]":
|
|
data = find_data(method)
|
|
if url == "lungroup?range=[0-8191]":
|
|
data = find_data_lungroup(method)
|
|
if url == "lungroup":
|
|
data = find_data_lungroup(method)
|
|
if url == "lungroup/associate":
|
|
data = """{"error":{"code":0},
|
|
"data":{"NAME":"5mFHcBv4RkCcD+JyrWc0SA",
|
|
"DESCRIPTION":"5mFHcBv4RkCcD+JyrWc0SA",
|
|
"ID":"11",
|
|
"TYPE":256}}"""
|
|
return data
|
|
|
|
|
|
def data_host(url, method):
|
|
if url == "hostgroup":
|
|
data = find_data_hostgroup(method)
|
|
if url == "hostgroup?range=[0-8191]":
|
|
data = find_data_hostgroup(method)
|
|
if url == "host":
|
|
data = find_data_host(method)
|
|
if url == "host?range=[0-65534]":
|
|
data = find_data_host(method)
|
|
if url == "host/associate":
|
|
data = find_data_host_associate(method)
|
|
if url == "host/associate?TYPE=21&ASSOCIATEOBJTYPE=14&ASSOCIATEOBJID=0":
|
|
data = find_data_host_associate(method)
|
|
return data
|
|
|
|
|
|
def find_data_storagepool_snapshot(url, method):
|
|
if url == "storagepool":
|
|
data = """{"error":{"code":0},
|
|
"data":[{"USERFREECAPACITY":"985661440",
|
|
"ID":"0",
|
|
"NAME":"OpenStack_Pool",
|
|
"USERTOTALCAPACITY":"985661440"
|
|
}]}"""
|
|
if url == "snapshot":
|
|
data = find_data_snapshot(method)
|
|
if url == "snapshot/activate":
|
|
data = """{"error":{"code":0},"data":[
|
|
{"ID":11,"NAME":"SDFAJSDFLKJ"},
|
|
{"ID":12,"NAME":"SDFAJSDFLKJ"}]}"""
|
|
|
|
return data
|
|
|
|
|
|
def find_data_luncpy_range_eth_port(url):
|
|
if url == "luncopy":
|
|
data = """{"error":{"code":0},
|
|
"data":{"COPYSTOPTIME":"-1",
|
|
"HEALTHSTATUS":"1",
|
|
"NAME":"w1PSNvu6RumcZMmSh4/l+Q==",
|
|
"RUNNINGSTATUS":"36",
|
|
"DESCRIPTION":"w1PSNvu6RumcZMmSh4/l+Q==",
|
|
"ID":"0","LUNCOPYTYPE":"1",
|
|
"COPYPROGRESS":"0","COPYSPEED":"2",
|
|
"TYPE":219,"COPYSTARTTIME":"-1"}}"""
|
|
|
|
if url == "LUNCOPY?range=[0-100000]":
|
|
data = """{"error":{"code":0},
|
|
"data":[{"COPYSTOPTIME":"1372209335",
|
|
"HEALTHSTATUS":"1",
|
|
"NAME":"w1PSNvu6RumcZMmSh4/l+Q==",
|
|
"RUNNINGSTATUS":"40",
|
|
"DESCRIPTION":"w1PSNvu6RumcZMmSh4/l+Q==",
|
|
"ID":"0","LUNCOPYTYPE":"1",
|
|
"COPYPROGRESS":"100",
|
|
"COPYSPEED":"2",
|
|
"TYPE":219,
|
|
"COPYSTARTTIME":"1372209329"}]}"""
|
|
|
|
if url == "eth_port":
|
|
data = """{"error":{"code":0},
|
|
"data":[{"PARENTTYPE":209,
|
|
"MACADDRESS":"00:22:a1:0a:79:57",
|
|
"ETHNEGOTIATE":"-1","ERRORPACKETS":"0",
|
|
"IPV4ADDR":"192.168.100.2",
|
|
"IPV6GATEWAY":"","IPV6MASK":"0",
|
|
"OVERFLOWEDPACKETS":"0","ISCSINAME":"P0",
|
|
"HEALTHSTATUS":"1","ETHDUPLEX":"2",
|
|
"ID":"16909568","LOSTPACKETS":"0",
|
|
"TYPE":213,"NAME":"P0","INIORTGT":"4",
|
|
"RUNNINGSTATUS":"10","IPV4GATEWAY":"",
|
|
"BONDNAME":"","STARTTIME":"1371684218",
|
|
"SPEED":"1000","ISCSITCPPORT":"0",
|
|
"IPV4MASK":"255.255.0.0","IPV6ADDR":"",
|
|
"LOGICTYPE":"0","LOCATION":"ENG0.B5.P0",
|
|
"MTU":"1500","PARENTID":"1.5"}]}"""
|
|
return data
|
|
|
|
|
|
class Fake18000Common(rest_common.RestCommon):
|
|
|
|
def __init__(self, configuration):
|
|
rest_common.RestCommon.__init__(self, configuration)
|
|
self.test_normal = True
|
|
self.other_flag = True
|
|
self.associate_flag = True
|
|
self.connect_flag = False
|
|
self.delete_flag = False
|
|
self.terminateFlag = False
|
|
self.deviceid = None
|
|
|
|
def _change_file_mode(self, filepath):
|
|
pass
|
|
|
|
def _parse_volume_type(self, volume):
|
|
|
|
poolinfo = self._find_pool_info()
|
|
volume_size = self._get_volume_size(poolinfo, volume)
|
|
|
|
params = {'LUNType': 0,
|
|
'WriteType': '1',
|
|
'PrefetchType': '3',
|
|
'qos_level': 'Qos-high',
|
|
'StripUnitSize': '64',
|
|
'PrefetchValue': '0',
|
|
'PrefetchTimes': '0',
|
|
'qos': 'OpenStack_Qos_High',
|
|
'MirrorSwitch': '1',
|
|
'tier': 'Tier_high'}
|
|
|
|
params['volume_size'] = volume_size
|
|
params['pool_id'] = poolinfo['ID']
|
|
return params
|
|
|
|
def _get_snapshotid_by_name(self, snapshot_name):
|
|
return "11"
|
|
|
|
def _get_qosid_by_lunid(self, lunid):
|
|
return ""
|
|
|
|
def _check_snapshot_exist(self, snapshot_id):
|
|
return True
|
|
|
|
def fc_initiator_data(self):
|
|
data = """{"error":{"code":0},"data":[
|
|
{"HEALTHSTATUS":"1","NAME":"",
|
|
"MULTIPATHTYPE":"1","ISFREE":"true",
|
|
"RUNNINGSTATUS":"27","ID":"10000090fa0d6754",
|
|
"OPERATIONSYSTEM":"255","TYPE":223},
|
|
{"HEALTHSTATUS":"1","NAME":"",
|
|
"MULTIPATHTYPE":"1","ISFREE":"true",
|
|
"RUNNINGSTATUS":"27","ID":"10000090fa0d6755",
|
|
"OPERATIONSYSTEM":"255","TYPE":223}]}"""
|
|
return data
|
|
|
|
def host_link(self):
|
|
data = """{"error":{"code":0},
|
|
"data":[{"PARENTTYPE":21,
|
|
"TARGET_ID":"0000000000000000",
|
|
"INITIATOR_NODE_WWN":"20000090fa0d6754",
|
|
"INITIATOR_TYPE":"223",
|
|
"RUNNINGSTATUS":"27",
|
|
"PARENTNAME":"ubuntuc",
|
|
"INITIATOR_ID":"10000090fa0d6754",
|
|
"TARGET_PORT_WWN":"24000022a10a2a39",
|
|
"HEALTHSTATUS":"1",
|
|
"INITIATOR_PORT_WWN":"10000090fa0d6754",
|
|
"ID":"010000090fa0d675-0000000000110400",
|
|
"TARGET_NODE_WWN":"21000022a10a2a39",
|
|
"PARENTID":"1","CTRL_ID":"0",
|
|
"TYPE":255,"TARGET_TYPE":"212"}]}"""
|
|
self.connect_flag = True
|
|
return data
|
|
|
|
def call(self, url=False, data=None, method=None):
|
|
|
|
url = url.replace('http://100.115.10.69:8082/deviceManager/rest', '')
|
|
url = url.replace('/210235G7J20000000000/', '')
|
|
data = None
|
|
|
|
if self.test_normal:
|
|
if url == "/xx/sessions" or url == "sessions":
|
|
data = data_session(url)
|
|
|
|
if url == "lun/count?TYPE=11&ASSOCIATEOBJTYPE=256&"\
|
|
"ASSOCIATEOBJID=11":
|
|
data = """{"data":{"COUNT":7},
|
|
"error":{"code":0,"description":"0"}}"""
|
|
|
|
if url == "lungroup/associate?TYPE=256&ASSOCIATEOBJTYPE=11&"\
|
|
"ASSOCIATEOBJID=11":
|
|
data = """{"error":{"code":0},
|
|
"data":[{"ID":11}]}"""
|
|
|
|
if url == "storagepool" or url == "snapshot" or url == "snaps"\
|
|
"hot/activate":
|
|
data = find_data_storagepool_snapshot(url, method)
|
|
|
|
if url == "lungroup" or url == "lungroup/associate"\
|
|
or url == "lun" or url == "lun/1":
|
|
data = data_lun(url, method)
|
|
|
|
if url == "lun?range=[0-65535]" or url == "lungroup?r"\
|
|
"ange=[0-8191]":
|
|
data = data_lun(url, method)
|
|
|
|
if url == "lungroup/associate?ID=11"\
|
|
"&ASSOCIATEOBJTYPE=11&ASSOCIATEOBJID=11"\
|
|
or url == "lungroup/associate?ID=12"\
|
|
"&ASSOCIATEOBJTYPE=11&ASSOCIATEOBJID=12":
|
|
data = '{"error":{"code":0}}'
|
|
self.terminateFlag = True
|
|
|
|
if url == "fc_initiator/10000090fa0d6754" or url == "lun/11"\
|
|
or url == "LUNCOPY/0"\
|
|
or url == "mappingview/REMOVE_ASSOCIATE":
|
|
data = '{"error":{"code":0}}'
|
|
self.delete_flag = True
|
|
|
|
if url == "LUNCOPY/start" or url == "mappingview/1"\
|
|
or url == "hostgroup/associate":
|
|
data = '{"error":{"code":0}}'
|
|
|
|
if url == "MAPPINGVIEW/CREATE_ASSOCIATE" or url == "snapshot/11"\
|
|
or url == "snapshot/stop" or url == "LUNGroup/11":
|
|
data = '{"error":{"code":0}}'
|
|
self.delete_flag = True
|
|
|
|
if url == "luncopy" or url == "eth_port" or url == "LUNC"\
|
|
"OPY?range=[0-100000]":
|
|
data = find_data_luncpy_range_eth_port(url)
|
|
|
|
if url == "iscsidevicename":
|
|
data = """{"error":{"code":0},
|
|
"data":[{"CMO_ISCSI_DEVICE_NAME":
|
|
"iqn.2006-08.com.huawei:oceanstor:21000022a10a2a39:iscsinametest"}]}"""
|
|
|
|
if url == "hostgroup" or url == "host" or url == "host/associate":
|
|
data = data_host(url, method)
|
|
|
|
if url == "host/associate?TYPE=21&ASSOCIATEOBJTYPE=14&AS"\
|
|
"SOCIATEOBJID=0":
|
|
data = data_host(url, method)
|
|
|
|
if url == "hostgroup?range=[0-8191]" or url == "host?ra"\
|
|
"nge=[0-65534]":
|
|
data = data_host(url, method)
|
|
|
|
if url == "iscsi_initiator/iqn.1993-08.debian:01:ec2bff7ac3a3":
|
|
data = """{"error":{"code":0},"data":{
|
|
"ID":"iqn.1993-08.debian:01:ec2bff7ac3a3",
|
|
"NAME":"iqn.1993-08.debian:01:ec2bff7ac3a3",
|
|
"ISFREE":"True"}}"""
|
|
|
|
if url == "iscsi_initiator" or url == "iscsi_initiator/"\
|
|
or url == "iscsi_initiator?range=[0-65535]":
|
|
data = '{"error":{"code":0}}'
|
|
|
|
if url == "mappingview" or url == "mappingview?range=[0-65535]":
|
|
data = find_data_mappingview(method, self.other_flag)
|
|
|
|
if (url == ("lun/associate?ID=1&TYPE=11&"
|
|
"ASSOCIATEOBJTYPE=21&ASSOCIATEOBJID=0")
|
|
or url == ("lun/associate?TYPE=11&ASSOCIATEOBJTYPE=256"
|
|
"&ASSOCIATEOBJID=11")
|
|
or (url == ("lun/associate?TYPE=11&ASSOCIATEOBJTYPE=256"
|
|
"&ASSOCIATEOBJID=12")
|
|
and not self.associate_flag)):
|
|
data = '{"error":{"code":0},"data":[{"ID":"11"}]}'
|
|
if ((url == ("lun/associate?TYPE=11&ASSOCIATEOBJTYPE=256"
|
|
"&ASSOCIATEOBJID=12"))
|
|
and self.associate_flag):
|
|
data = '{"error":{"code":0},"data":[{"ID":"12"}]}'
|
|
|
|
if url == "fc_initiator?ISFREE=true&range=[0-1000]":
|
|
data = self.fc_initiator_data()
|
|
|
|
if url == "host_link?INITIATOR_TYPE=223&INITIATOR_PORT_WWN="\
|
|
"10000090fa0d6754":
|
|
data = self.host_link()
|
|
|
|
if url == "mappingview/associate?TYPE=245&"\
|
|
"ASSOCIATEOBJTYPE=14&ASSOCIATEOBJID=0"\
|
|
or url == "mappingview/associate?TYPE=245&"\
|
|
"ASSOCIATEOBJTYPE=256&ASSOCIATEOBJID=11":
|
|
data = '{"error":{"code":0},"data":[{"ID":11,"NAME":"test"}]}'
|
|
|
|
if url == "lun/associate?TYPE=11&"\
|
|
"ASSOCIATEOBJTYPE=21&ASSOCIATEOBJID=1":
|
|
data = '{"error":{"code":0}}'
|
|
self.connect_flag = True
|
|
|
|
if url == "iscsi_tgt_port":
|
|
data = '{"data":[{"ETHPORTID":"139267",\
|
|
"ID":"iqn.oceanstor:21004846fb8ca15f::22003:111.111.101.244",\
|
|
"TPGT":"8196","TYPE":249}],\
|
|
"error":{"code":0,"description":"0"}}'
|
|
|
|
else:
|
|
data = '{"error":{"code":31755596}}'
|
|
if (url == "lun/11") and (method == "GET"):
|
|
data = """{"error":{"code":0},"data":{"ID":"11",
|
|
"IOCLASSID":"11",
|
|
"NAME":"5mFHcBv4RkCcD+JyrWc0SA"}}"""
|
|
res_json = json.loads(data)
|
|
|
|
return res_json
|
|
|
|
|
|
class Fake18000Storage(huawei_18000.Huawei18000ISCSIDriver):
|
|
"""Fake Huawei Storage, Rewrite some methods of HuaweiISCSIDriver."""
|
|
|
|
def __init__(self, configuration):
|
|
super(Fake18000Storage, self).__init__(configuration)
|
|
self.configuration = configuration
|
|
|
|
def do_setup(self):
|
|
self.common = Fake18000Common(configuration=self.configuration)
|
|
|
|
|
|
class Fake18000FCStorage(huawei_18000.Huawei18000FCDriver):
|
|
"""Fake Huawei Storage, Rewrite some methods of HuaweiISCSIDriver."""
|
|
def __init__(self, configuration):
|
|
super(Fake18000FCStorage, self).__init__(configuration)
|
|
self.configuration = configuration
|
|
|
|
def do_setup(self):
|
|
self.common = Fake18000Common(configuration=self.configuration)
|
|
|
|
|
|
class Huawei18000ISCSIDriverTestCase(test.TestCase):
|
|
|
|
def setUp(self):
|
|
super(Huawei18000ISCSIDriverTestCase, self).setUp()
|
|
self.tmp_dir = tempfile.mkdtemp()
|
|
self.fake_conf_file = self.tmp_dir + '/cinder_huawei_conf.xml'
|
|
self.addCleanup(shutil.rmtree, self.tmp_dir)
|
|
self.create_fake_conf_file()
|
|
self.addCleanup(os.remove, self.fake_conf_file)
|
|
self.configuration = mock.Mock(spec=conf.Configuration)
|
|
self.configuration.cinder_huawei_conf_file = self.fake_conf_file
|
|
self.stubs.Set(time, 'sleep', Fake_sleep)
|
|
driver = Fake18000Storage(configuration=self.configuration)
|
|
self.driver = driver
|
|
self.driver.do_setup()
|
|
self.driver.common.test_normal = True
|
|
|
|
def testloginSuccess(self):
|
|
deviceid = self.driver.common.login()
|
|
self.assertEqual(deviceid, '210235G7J20000000000')
|
|
|
|
def testcreatevolumesuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_volume(test_volume)
|
|
self.assertEqual(lun_info['provider_location'], '1')
|
|
self.assertEqual(lun_info['lun_info']['NAME'],
|
|
'5mFHcBv4RkCcD+JyrWc0SA')
|
|
|
|
def testcreatesnapshotsuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_snapshot(test_volume)
|
|
self.assertEqual(lun_info['provider_location'], 11)
|
|
self.assertEqual(lun_info['lun_info']['NAME'], 'YheUoRwbSX2BxN7')
|
|
|
|
def testdeletevolumesuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.delete_flag = False
|
|
self.driver.delete_volume(test_volume)
|
|
self.assertTrue(self.driver.common.delete_flag)
|
|
|
|
def testdeletesnapshotsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.delete_flag = False
|
|
self.driver.delete_snapshot(test_snap)
|
|
self.assertTrue(self.driver.common.delete_flag)
|
|
|
|
def testcolonevolumesuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_cloned_volume(test_volume,
|
|
test_volume)
|
|
self.assertEqual(lun_info['provider_location'], '1')
|
|
self.assertEqual(lun_info['lun_info']['NAME'],
|
|
'5mFHcBv4RkCcD+JyrWc0SA')
|
|
|
|
def testcreateolumefromsnapsuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_volume_from_snapshot(test_volume,
|
|
test_volume)
|
|
self.assertEqual(lun_info['provider_location'], '1')
|
|
self.assertEqual(lun_info['lun_info']['NAME'],
|
|
'5mFHcBv4RkCcD+JyrWc0SA')
|
|
|
|
def testinitializeconnectionsuccess(self):
|
|
self.driver.common.login()
|
|
iscsi_properties = self.driver.initialize_connection(test_volume,
|
|
FakeConnector)
|
|
self.assertEqual(iscsi_properties['data']['target_lun'], 1)
|
|
|
|
def testterminateconnectionsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.terminateFlag = False
|
|
self.driver.terminate_connection(test_volume, FakeConnector)
|
|
self.assertTrue(self.driver.common.terminateFlag)
|
|
|
|
def testinitializeconnectionnoviewsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.other_flag = False
|
|
self.driver.common.connect_flag = False
|
|
self.driver.initialize_connection(test_volume, FakeConnector)
|
|
self.assertTrue(self.driver.common.connect_flag)
|
|
|
|
def testterminateconnectionoviewnsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.terminateFlag = False
|
|
self.driver.terminate_connection(test_volume, FakeConnector)
|
|
self.assertTrue(self.driver.common.terminateFlag)
|
|
|
|
def testgetvolumestatus(self):
|
|
self.driver.common.login()
|
|
data = self.driver.get_volume_stats()
|
|
self.assertEqual(data['driver_version'], '1.1.0')
|
|
|
|
def testloginfail(self):
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException, self.driver.common.login)
|
|
|
|
def testcreatesnapshotfail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.create_snapshot, test_volume)
|
|
|
|
def testcreatevolumefail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.create_volume, test_volume)
|
|
|
|
def testdeletevolumefail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.delete_volume, test_volume)
|
|
|
|
def testdeletesnapshotfail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.delete_snapshot, test_volume)
|
|
|
|
def testinitializeconnectionfail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.initialize_connection,
|
|
test_volume, FakeConnector)
|
|
|
|
def testgetdefaulttimeout(self):
|
|
result = self.driver.common._get_default_timeout()
|
|
self.assertEqual('43200', result)
|
|
|
|
def testgetwaitinterval(self):
|
|
result = self.driver.common._get_wait_interval('LUNReadyWaitInterval')
|
|
self.assertEqual('2', result)
|
|
|
|
def test_lun_is_associated_to_lungroup(self):
|
|
self.driver.common.login()
|
|
self.driver.common._associate_lun_to_lungroup('11', '11')
|
|
result = self.driver.common._is_lun_associated_to_lungroup('11', '11')
|
|
self.assertTrue(result)
|
|
|
|
def test_lun_is_not_associated_to_lun_group(self):
|
|
self.driver.common.login()
|
|
self.driver.common._associate_lun_to_lungroup('12', '12')
|
|
self.driver.common.associate_flag = True
|
|
result = self.driver.common._is_lun_associated_to_lungroup('12', '12')
|
|
self.assertTrue(result)
|
|
self.driver.common._remove_lun_from_lungroup('12', '12')
|
|
self.driver.common.associate_flag = False
|
|
result = self.driver.common._is_lun_associated_to_lungroup('12', '12')
|
|
self.assertFalse(result)
|
|
|
|
def create_fake_conf_file(self):
|
|
"""Create a fake Config file
|
|
|
|
Huawei storage customize a XML configuration file, the configuration
|
|
file is used to set the Huawei storage custom parameters, therefore,
|
|
in the UT test we need to simulate such a configuration file
|
|
"""
|
|
doc = minidom.Document()
|
|
|
|
config = doc.createElement('config')
|
|
doc.appendChild(config)
|
|
|
|
storage = doc.createElement('Storage')
|
|
config.appendChild(storage)
|
|
controllerip0 = doc.createElement('ControllerIP0')
|
|
controllerip0_text = doc.createTextNode('10.10.10.1')
|
|
controllerip0.appendChild(controllerip0_text)
|
|
storage.appendChild(controllerip0)
|
|
controllerip1 = doc.createElement('ControllerIP1')
|
|
controllerip1_text = doc.createTextNode('10.10.10.2')
|
|
controllerip1.appendChild(controllerip1_text)
|
|
storage.appendChild(controllerip1)
|
|
username = doc.createElement('UserName')
|
|
username_text = doc.createTextNode('admin')
|
|
username.appendChild(username_text)
|
|
storage.appendChild(username)
|
|
userpassword = doc.createElement('UserPassword')
|
|
userpassword_text = doc.createTextNode('Admin@storage')
|
|
userpassword.appendChild(userpassword_text)
|
|
storage.appendChild(userpassword)
|
|
url = doc.createElement('RestURL')
|
|
url_text = doc.createTextNode('http://100.115.10.69:8082/'
|
|
'deviceManager/rest/')
|
|
url.appendChild(url_text)
|
|
storage.appendChild(url)
|
|
|
|
lun = doc.createElement('LUN')
|
|
config.appendChild(lun)
|
|
storagepool = doc.createElement('StoragePool')
|
|
pool_text = doc.createTextNode('OpenStack_Pool')
|
|
storagepool.appendChild(pool_text)
|
|
lun.appendChild(storagepool)
|
|
|
|
timeout = doc.createElement('Timeout')
|
|
timeout_text = doc.createTextNode('43200')
|
|
timeout.appendChild(timeout_text)
|
|
lun.appendChild(timeout)
|
|
|
|
lun_ready_wait_interval = doc.createElement('LUNReadyWaitInterval')
|
|
lun_ready_wait_interval_text = doc.createTextNode('2')
|
|
lun_ready_wait_interval.appendChild(lun_ready_wait_interval_text)
|
|
lun.appendChild(lun_ready_wait_interval)
|
|
|
|
prefetch = doc.createElement('Prefetch')
|
|
prefetch.setAttribute('Type', '0')
|
|
prefetch.setAttribute('Value', '0')
|
|
lun.appendChild(prefetch)
|
|
|
|
iscsi = doc.createElement('iSCSI')
|
|
config.appendChild(iscsi)
|
|
defaulttargetip = doc.createElement('DefaultTargetIP')
|
|
defaulttargetip_text = doc.createTextNode('100.115.10.68')
|
|
defaulttargetip.appendChild(defaulttargetip_text)
|
|
iscsi.appendChild(defaulttargetip)
|
|
initiator = doc.createElement('Initiator')
|
|
initiator.setAttribute('Name', 'iqn.1993-08.debian:01:ec2bff7ac3a3')
|
|
initiator.setAttribute('TargetIP', '192.168.100.2')
|
|
iscsi.appendChild(initiator)
|
|
|
|
fakefile = open(self.fake_conf_file, 'w')
|
|
fakefile.write(doc.toprettyxml(indent=''))
|
|
fakefile.close()
|
|
|
|
|
|
class Huawei18000FCDriverTestCase(test.TestCase):
|
|
|
|
def setUp(self):
|
|
super(Huawei18000FCDriverTestCase, self).setUp()
|
|
self.tmp_dir = tempfile.mkdtemp()
|
|
self.fake_conf_file = self.tmp_dir + '/cinder_huawei_conf.xml'
|
|
self.addCleanup(shutil.rmtree, self.tmp_dir)
|
|
self.create_fake_conf_file()
|
|
self.addCleanup(os.remove, self.fake_conf_file)
|
|
self.configuration = mock.Mock(spec=conf.Configuration)
|
|
self.configuration.cinder_huawei_conf_file = self.fake_conf_file
|
|
self.stubs.Set(time, 'sleep', Fake_sleep)
|
|
driver = Fake18000FCStorage(configuration=self.configuration)
|
|
self.driver = driver
|
|
self.driver.do_setup()
|
|
self.driver.common.test_normal = True
|
|
|
|
def testloginSuccess(self):
|
|
deviceid = self.driver.common.login()
|
|
self.assertEqual(deviceid, '210235G7J20000000000')
|
|
|
|
def testcreatevolumesuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_volume(test_volume)
|
|
self.assertEqual(lun_info['provider_location'], '1')
|
|
self.assertEqual(lun_info['lun_info']['NAME'],
|
|
'5mFHcBv4RkCcD+JyrWc0SA')
|
|
|
|
def testcreatesnapshotsuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_snapshot(test_volume)
|
|
self.assertEqual(lun_info['provider_location'], 11)
|
|
self.assertEqual(lun_info['lun_info']['NAME'], 'YheUoRwbSX2BxN7')
|
|
|
|
def testdeletevolumesuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.delete_flag = False
|
|
self.driver.delete_volume(test_volume)
|
|
self.assertTrue(self.driver.common.delete_flag)
|
|
|
|
def testdeletesnapshotsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.delete_flag = False
|
|
self.driver.delete_snapshot(test_snap)
|
|
self.assertTrue(self.driver.common.delete_flag)
|
|
|
|
def testcolonevolumesuccess(self):
|
|
self.driver.common.login()
|
|
lun_info = self.driver.create_cloned_volume(test_volume,
|
|
test_volume)
|
|
self.assertEqual(lun_info['provider_location'], '1')
|
|
self.assertEqual(lun_info['lun_info']['NAME'],
|
|
'5mFHcBv4RkCcD+JyrWc0SA')
|
|
|
|
def testcreateolumefromsnapsuccess(self):
|
|
self.driver.common.login()
|
|
volumeid = self.driver.create_volume_from_snapshot(test_volume,
|
|
test_volume)
|
|
self.assertEqual(volumeid['provider_location'], '1')
|
|
|
|
def testinitializeconnectionsuccess(self):
|
|
self.driver.common.login()
|
|
properties = self.driver.initialize_connection(test_volume,
|
|
FakeConnector)
|
|
self.assertEqual(properties['data']['target_lun'], 1)
|
|
|
|
def testterminateconnectionsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.terminateFlag = False
|
|
self.driver.terminate_connection(test_volume, FakeConnector)
|
|
self.assertTrue(self.driver.common.terminateFlag)
|
|
|
|
def testinitializeconnectionnoviewsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.other_flag = False
|
|
self.driver.common.connect_flag = False
|
|
self.driver.initialize_connection(test_volume, FakeConnector)
|
|
self.assertTrue(self.driver.common.connect_flag)
|
|
|
|
def testterminateconnectionoviewnsuccess(self):
|
|
self.driver.common.login()
|
|
self.driver.common.terminateFlag = False
|
|
self.driver.terminate_connection(test_volume, FakeConnector)
|
|
self.assertTrue(self.driver.common.terminateFlag)
|
|
|
|
def testgetvolumestatus(self):
|
|
self.driver.common.login()
|
|
data = self.driver.get_volume_stats()
|
|
self.assertEqual(data['driver_version'], '1.1.0')
|
|
|
|
def testloginfail(self):
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.common.login)
|
|
|
|
def testcreatesnapshotfail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.create_snapshot, test_volume)
|
|
|
|
def testcreatevolumefail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.create_volume, test_volume)
|
|
|
|
def testdeletevolumefail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.delete_volume, test_volume)
|
|
|
|
def testdeletesnapshotfail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.delete_snapshot, test_volume)
|
|
|
|
def testinitializeconnectionfail(self):
|
|
self.driver.common.login()
|
|
self.driver.common.test_normal = False
|
|
self.assertRaises(exception.CinderException,
|
|
self.driver.initialize_connection,
|
|
test_volume, FakeConnector)
|
|
|
|
def testgetdefaulttimeout(self):
|
|
result = self.driver.common._get_default_timeout()
|
|
self.assertEqual('43200', result)
|
|
|
|
def testgetwaitinterval(self):
|
|
result = self.driver.common._get_wait_interval('LUNReadyWaitInterval')
|
|
self.assertEqual('2', result)
|
|
|
|
def test_lun_is_associated_to_lungroup(self):
|
|
self.driver.common.login()
|
|
self.driver.common._associate_lun_to_lungroup('11', '11')
|
|
result = self.driver.common._is_lun_associated_to_lungroup('11', '11')
|
|
self.assertTrue(result)
|
|
|
|
def test_lun_is_not_associated_to_lun_group(self):
|
|
self.driver.common.login()
|
|
self.driver.common._associate_lun_to_lungroup('12', '12')
|
|
self.driver.common.associate_flag = True
|
|
result = self.driver.common._is_lun_associated_to_lungroup('12', '12')
|
|
self.assertTrue(result)
|
|
self.driver.common._remove_lun_from_lungroup('12', '12')
|
|
self.driver.common.associate_flag = False
|
|
result = self.driver.common._is_lun_associated_to_lungroup('12', '12')
|
|
self.assertFalse(result)
|
|
|
|
def create_fake_conf_file(self):
|
|
"""Create a fake Config file
|
|
|
|
Huawei storage customize a XML configuration file, the configuration
|
|
file is used to set the Huawei storage custom parameters, therefore,
|
|
in the UT test we need to simulate such a configuration file
|
|
"""
|
|
doc = minidom.Document()
|
|
|
|
config = doc.createElement('config')
|
|
doc.appendChild(config)
|
|
|
|
storage = doc.createElement('Storage')
|
|
config.appendChild(storage)
|
|
controllerip0 = doc.createElement('ControllerIP0')
|
|
controllerip0_text = doc.createTextNode('10.10.10.1')
|
|
controllerip0.appendChild(controllerip0_text)
|
|
storage.appendChild(controllerip0)
|
|
controllerip1 = doc.createElement('ControllerIP1')
|
|
controllerip1_text = doc.createTextNode('10.10.10.2')
|
|
controllerip1.appendChild(controllerip1_text)
|
|
storage.appendChild(controllerip1)
|
|
username = doc.createElement('UserName')
|
|
username_text = doc.createTextNode('admin')
|
|
username.appendChild(username_text)
|
|
storage.appendChild(username)
|
|
userpassword = doc.createElement('UserPassword')
|
|
userpassword_text = doc.createTextNode('Admin@storage')
|
|
userpassword.appendChild(userpassword_text)
|
|
storage.appendChild(userpassword)
|
|
url = doc.createElement('RestURL')
|
|
url_text = doc.createTextNode('http://100.115.10.69:8082/'
|
|
'deviceManager/rest/')
|
|
url.appendChild(url_text)
|
|
storage.appendChild(url)
|
|
|
|
lun = doc.createElement('LUN')
|
|
config.appendChild(lun)
|
|
storagepool = doc.createElement('StoragePool')
|
|
pool_text = doc.createTextNode('OpenStack_Pool')
|
|
storagepool.appendChild(pool_text)
|
|
lun.appendChild(storagepool)
|
|
|
|
timeout = doc.createElement('Timeout')
|
|
timeout_text = doc.createTextNode('43200')
|
|
timeout.appendChild(timeout_text)
|
|
lun.appendChild(timeout)
|
|
|
|
lun_ready_wait_interval = doc.createElement('LUNReadyWaitInterval')
|
|
lun_ready_wait_interval_text = doc.createTextNode('2')
|
|
lun_ready_wait_interval.appendChild(lun_ready_wait_interval_text)
|
|
lun.appendChild(lun_ready_wait_interval)
|
|
|
|
prefetch = doc.createElement('Prefetch')
|
|
prefetch.setAttribute('Type', '0')
|
|
prefetch.setAttribute('Value', '0')
|
|
lun.appendChild(prefetch)
|
|
|
|
iscsi = doc.createElement('iSCSI')
|
|
config.appendChild(iscsi)
|
|
defaulttargetip = doc.createElement('DefaultTargetIP')
|
|
defaulttargetip_text = doc.createTextNode('100.115.10.68')
|
|
defaulttargetip.appendChild(defaulttargetip_text)
|
|
iscsi.appendChild(defaulttargetip)
|
|
initiator = doc.createElement('Initiator')
|
|
initiator.setAttribute('Name', 'iqn.1993-08.debian:01:ec2bff7ac3a3')
|
|
initiator.setAttribute('TargetIP', '192.168.100.2')
|
|
iscsi.appendChild(initiator)
|
|
|
|
fakefile = open(self.fake_conf_file, 'w')
|
|
fakefile.write(doc.toprettyxml(indent=''))
|
|
fakefile.close()
|