cinder/cinder/tests/unit/volume/drivers/test_qnap.py

5994 lines
216 KiB
Python

# Copyright (c) 2016 QNAP Systems, Inc.
# 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.
import base64
from collections import OrderedDict
from ddt import data
from ddt import ddt
from ddt import unpack
from defusedxml import cElementTree as ET
import eventlet
import mock
from oslo_config import cfg
from oslo_utils import units
import requests
import six
from six.moves import urllib
from cinder import exception
from cinder import test
from cinder import utils
from cinder.volume import driver
from cinder.volume.drivers import qnap
CONF = cfg.CONF
FAKE_LUNNAA = {'LUNNAA': 'fakeLunNaa'}
FAKE_SNAPSHOT = {'snapshot_id': 'fakeSnapshotId'}
FAKE_PASSWORD = 'qnapadmin'
FAKE_PARMS = OrderedDict()
FAKE_PARMS['pwd'] = base64.b64encode(FAKE_PASSWORD.encode("utf-8"))
FAKE_PARMS['serviceKey'] = 1
FAKE_PARMS['user'] = 'admin'
sanitized_params = OrderedDict()
for key in FAKE_PARMS:
value = FAKE_PARMS[key]
if value is not None:
sanitized_params[key] = six.text_type(value)
sanitized_params = utils.create_ordereddict(sanitized_params)
global_sanitized_params = urllib.parse.urlencode(sanitized_params)
header = {
'charset': 'utf-8',
'Content-Type': 'application/x-www-form-urlencoded'
}
login_url = '/cgi-bin/authLogin.cgi?'
fake_login_url = 'http://1.2.3.4:8080' + login_url
get_basic_info_url = '/cgi-bin/authLogin.cgi'
fake_get_basic_info_url = 'http://1.2.3.4:8080' + get_basic_info_url
FAKE_RES_DETAIL_DATA_LOGIN = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<authSid><![CDATA[fakeSid]]></authSid>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_NO_AUTHPASSED = """
<QDocRoot version="1.0">
<authPassed><![CDATA[0]]></authPassed>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_TS = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[TS-870U-RP]]></displayModelName>
<internalModelName><![CDATA[TS-879]]></internalModelName>
</model>
<firmware>
<version><![CDATA[4.2.1]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[ES1640dc]]></displayModelName>
<internalModelName><![CDATA[ES1640dc]]></internalModelName>
</model>
<firmware>
<version><![CDATA[1.1.3]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_114 = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[ES1640dc]]></displayModelName>
<internalModelName><![CDATA[ES1640dc]]></internalModelName>
</model>
<firmware>
<version><![CDATA[1.1.4]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_TES = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[TES-1885U]]></displayModelName>
<internalModelName><![CDATA[ES-X85U]]></internalModelName>
</model>
<firmware>
<version><![CDATA[1.1.3]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_TES_433 = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[TES-1885U]]></displayModelName>
<internalModelName><![CDATA[TS-X85U]]></internalModelName>
</model>
<firmware>
<version><![CDATA[4.3.3]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_UNSUPPORT = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[ES1640dc]]></displayModelName>
<internalModelName><![CDATA[ES1640dc]]></internalModelName>
</model>
<firmware>
<version><![CDATA[1.1.1]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_UNSUPPORT_TS = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[TS-870U-RP]]></displayModelName>
<internalModelName><![CDATA[TS-879]]></internalModelName>
</model>
<firmware>
<version><![CDATA[4.0.0]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETBASIC_INFO_UNSUPPORT_TES = """
<QDocRoot version="1.0">
<model>
<displayModelName><![CDATA[TES-1885U]]></displayModelName>
<internalModelName><![CDATA[ES-X85U]]></internalModelName>
</model>
<firmware>
<version><![CDATA[1.1.1]]></version>
</firmware>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_LUN_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<iSCSILUNList>
<LUNInfo>
<LUNNAA><![CDATA[fakeLunNaa]]></LUNNAA>
<LUNName><![CDATA[fakeLunName]]></LUNName>
<LUNIndex><![CDATA[fakeLunIndex]]></LUNIndex>
<LUNThinAllocate><![CDATA[fakeLunThinAllocate]]></LUNThinAllocate>
<LUNPath><![CDATA[fakeLunPath]]></LUNPath>
<LUNTargetList>
<row>
<targetIndex><![CDATA[9]]></targetIndex>
<LUNNumber><![CDATA[1]]></LUNNumber>
<LUNEnable><![CDATA[1]]></LUNEnable>
</row>
</LUNTargetList>
<LUNStatus>1</LUNStatus>
</LUNInfo>
</iSCSILUNList>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_LUN_INFO_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<iSCSILUNList>
<LUNInfo>
<LUNNAA><![CDATA[fakeLunNaa]]></LUNNAA>
<LUNName><![CDATA[fakeLunName]]></LUNName>
<LUNIndex><![CDATA[fakeLunIndex]]></LUNIndex>
<LUNThinAllocate><![CDATA[fakeLunThinAllocate]]></LUNThinAllocate>
<LUNPath><![CDATA[fakeLunPath]]></LUNPath>
<LUNTargetList>
<row>
<targetIndex><![CDATA[9]]></targetIndex>
<LUNNumber><![CDATA[1]]></LUNNumber>
<LUNEnable><![CDATA[1]]></LUNEnable>
</row>
</LUNTargetList>
<LUNStatus>1</LUNStatus>
</LUNInfo>
</iSCSILUNList>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SNAPSHOT_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<SnapshotList>
<row>
<snapshot_id>fakeSnapshotId</snapshot_id>
<snapshot_name>fakeSnapshotName</snapshot_name>
</row>
</SnapshotList>
<ErrorList></ErrorList>
<result>0</result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SNAPSHOT_INFO_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<SnapshotList>
<row>
<snapshot_id>fakeSnapshotId</snapshot_id>
<snapshot_name>fakeSnapshotName</snapshot_name>
</row>
</SnapshotList>
<ErrorList></ErrorList>
<result>-1</result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_MAPPED_LUN_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<iSCSILUNList>
<LUNInfo>
<LUNNAA><![CDATA[fakeLunNaa]]></LUNNAA>
<LUNName><![CDATA[fakeLunName]]></LUNName>
<LUNIndex><![CDATA[fakeLunIndex]]></LUNIndex>
<LUNThinAllocate><![CDATA[fakeLunThinAllocate]]></LUNThinAllocate>
<LUNPath><![CDATA[fakeLunPath]]></LUNPath>
<LUNTargetList>
<row>
<targetIndex><![CDATA[9]]></targetIndex>
<LUNNumber><![CDATA[1]]></LUNNumber>
<LUNEnable><![CDATA[1]]></LUNEnable>
</row>
</LUNTargetList>
<LUNStatus>2</LUNStatus>
</LUNInfo>
</iSCSILUNList>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_ONE_LUN_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<LUNInfo>
<row>
<LUNIndex><![CDATA[fakeLunIndex]]></LUNIndex>
<LUNName><![CDATA[fakeLunName]]></LUNName>
<LUNPath><![CDATA[fakeLunPath]]></LUNPath>
<LUNStatus><![CDATA[1]]></LUNStatus>
<LUNThinAllocate><![CDATA[fakeLunThinAllocate]]></LUNThinAllocate>
<LUNNAA><![CDATA[fakeLunNaa]]></LUNNAA>
<LUNTargetList/>
</row>
</LUNInfo>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_MAPPED_ONE_LUN_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<LUNInfo>
<row>
<LUNIndex><![CDATA[fakeLunIndex]]></LUNIndex>
<LUNName><![CDATA[fakeLunName]]></LUNName>
<LUNPath><![CDATA[fakeLunPath]]></LUNPath>
<LUNStatus><![CDATA[2]]></LUNStatus>
<LUNThinAllocate><![CDATA[fakeLunThinAllocate]]></LUNThinAllocate>
<LUNNAA><![CDATA[fakeLunNaa]]></LUNNAA>
<LUNTargetList>
<row>
<targetIndex><![CDATA[9]]></targetIndex>
<LUNNumber><![CDATA[1]]></LUNNumber>
<LUNEnable><![CDATA[1]]></LUNEnable>
</row>
</LUNTargetList>
</row>
</LUNInfo>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SNAPSHOT = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<SnapshotList>
<row>
<snapshot_id><![CDATA[fakeSnapshotId]]></snapshot_id>
</row>
</SnapshotList>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SNAPSHOT_WITHOUT_SNAPSHOT = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<SnapshotList>
<row>
<snapshot_id><![CDATA[fakeSnapshotId]]></snapshot_id>
</row>
</SnapshotList>
<result><![CDATA[-206021]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SNAPSHOT_WITHOUT_LUN = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<SnapshotList>
<row>
<snapshot_id><![CDATA[fakeSnapshotId]]></snapshot_id>
</row>
</SnapshotList>
<result><![CDATA[-200005]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SNAPSHOT_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<SnapshotList>
<row>
<snapshot_id><![CDATA[fakeSnapshotId]]></snapshot_id>
</row>
</SnapshotList>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SPECIFIC_POOL_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<Pool_Index>
<row>
<poolIndex><![CDATA[fakePoolIndex]]></poolIndex>
<poolID><![CDATA[fakePoolId]]></poolID>
<pool_status><![CDATA[0]]></pool_status>
<capacity_bytes><![CDATA[930213412209]]></capacity_bytes>
<allocated_bytes><![CDATA[1480470528]]></allocated_bytes>
<freesize_bytes><![CDATA[928732941681]]></freesize_bytes>
<lun_meta_reserve_ratio><![CDATA[0.0315]]></lun_meta_reserve_ratio>
<pool_capacity><![CDATA[866 GB]]></pool_capacity>
<pool_allocated><![CDATA[1.38 GB]]></pool_allocated>
<pool_freesize><![CDATA[865 GB]]></pool_freesize>
<pool_threshold><![CDATA[80 %]]></pool_threshold>
<pool_used><![CDATA[0 %]]></pool_used>
<pool_available><![CDATA[100 %]]></pool_available>
<pool_owner><![CDATA[SCA]]></pool_owner>
<pool_type><![CDATA[mirror]]></pool_type>
<pool_dedup><![CDATA[1.00]]></pool_dedup>
<pool_bound><![CDATA[0]]></pool_bound>
<pool_progress><![CDATA[0]]></pool_progress>
<pool_scrub><![CDATA[0]]></pool_scrub>
</row>
</Pool_Index>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_SPECIFIC_POOL_INFO_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<Pool_Index>
<row>
<poolIndex><![CDATA[fakePoolIndex]]></poolIndex>
<poolID><![CDATA[fakePoolId]]></poolID>
<pool_status><![CDATA[0]]></pool_status>
<capacity_bytes><![CDATA[930213412209]]></capacity_bytes>
<allocated_bytes><![CDATA[1480470528]]></allocated_bytes>
<freesize_bytes><![CDATA[928732941681]]></freesize_bytes>
<lun_meta_reserve_ratio><![CDATA[0.0315]]></lun_meta_reserve_ratio>
<pool_capacity><![CDATA[866 GB]]></pool_capacity>
<pool_allocated><![CDATA[1.38 GB]]></pool_allocated>
<pool_freesize><![CDATA[865 GB]]></pool_freesize>
<pool_threshold><![CDATA[80 %]]></pool_threshold>
<pool_used><![CDATA[0 %]]></pool_used>
<pool_available><![CDATA[100 %]]></pool_available>
<pool_owner><![CDATA[SCA]]></pool_owner>
<pool_type><![CDATA[mirror]]></pool_type>
<pool_dedup><![CDATA[1.00]]></pool_dedup>
<pool_bound><![CDATA[0]]></pool_bound>
<pool_progress><![CDATA[0]]></pool_progress>
<pool_scrub><![CDATA[0]]></pool_scrub>
</row>
</Pool_Index>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_ISCSI_PORTAL_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<iSCSIPortal>
<servicePort><![CDATA[fakeServicePort]]></servicePort>
<targetIQNPrefix><![CDATA[fakeTargetIqnPrefix]]></targetIQNPrefix>
<targetIQNPostfix><![CDATA[fakeTargetIqnPostfix]]></targetIQNPostfix>
</iSCSIPortal>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_ETHERNET_IP = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<func>
<ownContent>
<IPInfo>
<interfaceSlotid><![CDATA[0]]></interfaceSlotid>
<isManagePort><![CDATA[1]]></isManagePort>
<IP>
<IP1><![CDATA[1]]></IP1>
<IP2><![CDATA[2]]></IP2>
<IP3><![CDATA[3]]></IP3>
<IP4><![CDATA[4]]></IP4>
</IP>
<status><![CDATA[1]]></status>
</IPInfo>
<IPInfo>
<interfaceSlotid><![CDATA[0]]></interfaceSlotid>
<isManagePort><![CDATA[0]]></isManagePort>
<IP>
<IP1><![CDATA[1]]></IP1>
<IP2><![CDATA[2]]></IP2>
<IP3><![CDATA[3]]></IP3>
<IP4><![CDATA[4]]></IP4>
</IP>
<status><![CDATA[1]]></status>
</IPInfo>
<IPInfo>
<interfaceSlotid><![CDATA[0]]></interfaceSlotid>
<isManagePort><![CDATA[1]]></isManagePort>
<IP>
<IP1><![CDATA[1]]></IP1>
<IP2><![CDATA[2]]></IP2>
<IP3><![CDATA[3]]></IP3>
<IP4><![CDATA[4]]></IP4>
</IP>
<status><![CDATA[0]]></status>
</IPInfo>
</ownContent>
</func>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_CREATE_LUN = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<result><![CDATA[fakeLunIndex]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_CREATE_LUN_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_CREATE_LUN_BUSY = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<result><![CDATA[-205041]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_CREATE_TARGET = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<result><![CDATA[fakeTargetIndex]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_CREATE_TARGET_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GETHOSTIDLISTBYINITIQN = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<content>
<host_list total="4">
<host>
<index><![CDATA[fakeIndex]]></index>
<hostid><![CDATA[fakeHostId]]></hostid>
<name><![CDATA[fakeHostName]]></name>
<iqns>
<iqn><![CDATA[fakeIqn]]></iqn>
</iqns>
</host>
</host_list>
</content>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_GET_ALL_ISCSI_PORTAL_SETTING = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<targetACL>
<row>
<targetIndex><![CDATA[fakeTargeIndex]]></targetIndex>
<targetIQN><![CDATA[fakeTargetIqn]]></targetIQN>
<targetInitListCnt><![CDATA[0]]></targetInitListCnt>
<targetInitInfo>
<initiatorIndex><![CDATA[2]]></initiatorIndex>
<initiatorAlias><![CDATA[fakeInitiatorAlias]]></initiatorAlias>
<initiatorIQN><![CDATA[fakeInitiatorIqn]]></initiatorIQN>
<bCHAPEnable><![CDATA[0]]></bCHAPEnable>
<bMutualCHAPEnable><![CDATA[0]]></bMutualCHAPEnable>
</targetInitInfo>
</row>
</targetACL>
<iSCSITargetList>
<targetInfo>
<targetIndex><![CDATA[fakeTargeIndex]]></targetIndex>
<targetName><![CDATA[fakeTargetName]]></targetName>
<targetIQN active="1"><![CDATA[fakeTargetIqn]]></targetIQN>
<targetStatus><![CDATA[1]]></targetStatus>
</targetInfo>
</iSCSITargetList>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_TARGET_INFO = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<targetInfo>
<row>
<targetIndex><![CDATA[fakeTargetIndex]]></targetIndex>
<targetName><![CDATA[fakeTargetName]]></targetName>
<targetIQN active="1"><![CDATA[fakeTargetIqn]]></targetIQN>
<targetStatus><![CDATA[1]]></targetStatus>
</row>
</targetInfo>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_TARGET_INFO_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<targetInfo>
<row>
<targetIndex><![CDATA[fakeTargetIndex]]></targetIndex>
<targetName><![CDATA[fakeTargetName]]></targetName>
<targetIQN active="1"><![CDATA[fakeTargetIqn]]></targetIQN>
<targetStatus><![CDATA[1]]></targetStatus>
</row>
</targetInfo>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_TARGET_INFO_BY_INITIATOR = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<targetACL>
<row>
<targetIndex><![CDATA[fakeTargetIndex]]></targetIndex>
<targetName><![CDATA[fakeTargetName]]></targetName>
<targetIQN><![CDATA[fakeTargetIqn]]></targetIQN>
<targetAlias><![CDATA[fakeTargetAlias]]></targetAlias>
<targetStatus><![CDATA[1]]></targetStatus>
</row>
</targetACL>
<result><![CDATA[0]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_DATA_TARGET_INFO_BY_INITIATOR_FAIL = """
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed>
<targetACL>
<row>
<targetIndex><![CDATA[fakeTargetIndex]]></targetIndex>
<targetName><![CDATA[fakeTargetName]]></targetName>
<targetIQN><![CDATA[fakeTargetIqn]]></targetIQN>
<targetAlias><![CDATA[fakeTargetAlias]]></targetAlias>
<targetStatus><![CDATA[1]]></targetStatus>
</row>
</targetACL>
<result><![CDATA[-1]]></result>
</QDocRoot>"""
FAKE_RES_DETAIL_GET_ALL_ISCSI_PORTAL_SETTING = {
'data': FAKE_RES_DETAIL_DATA_GET_ALL_ISCSI_PORTAL_SETTING,
'error': None,
'http_status': 'fackStatus'
}
FAKE_RES_DETAIL_ISCSI_PORTAL_INFO = {
'data': FAKE_RES_DETAIL_DATA_ISCSI_PORTAL_INFO,
'error': None,
'http_status': 'fackStatus'
}
def create_configuration(
username,
password,
management_url,
san_iscsi_ip,
poolname,
thin_provision=True,
compression=True,
deduplication=False,
ssd_cache=False,
verify_ssl=True):
"""Create configuration."""
configuration = mock.Mock()
configuration.san_login = username
configuration.san_password = password
configuration.qnap_management_url = management_url
configuration.san_thin_provision = thin_provision
configuration.qnap_compression = compression
configuration.qnap_deduplication = deduplication
configuration.qnap_ssd_cache = ssd_cache
configuration.san_iscsi_ip = san_iscsi_ip
configuration.qnap_poolname = poolname
configuration.safe_get.return_value = 'QNAP'
configuration.target_ip_address = '1.2.3.4'
configuration.qnap_storage_protocol = 'iscsi'
configuration.reserved_percentage = 0
configuration.use_chap_auth = False
configuration.driver_ssl_cert_verify = verify_ssl
return configuration
class QnapDriverBaseTestCase(test.TestCase):
"""Base Class for the QnapDriver Tests."""
def setUp(self):
"""Setup the Qnap Driver Base TestCase."""
super(QnapDriverBaseTestCase, self).setUp()
self.driver = None
self.mock_session = None
@staticmethod
def sanitize(params):
sanitized = {_key: six.text_type(_value)
for _key, _value in six.iteritems(params)
if _value is not None}
sanitized = utils.create_ordereddict(sanitized)
return urllib.parse.urlencode(sanitized)
class SnapshotClass(object):
"""Snapshot Class."""
volume = {}
name = ''
volume_name = ''
volume_size = 0
metadata = {}
def __init__(self, volume, volume_size):
"""Init."""
self.volume = volume
self.volume_size = volume_size
self.metadata = {'snapshot_id': 'fakeSnapshotId'}
def __getitem__(self, arg):
"""Getitem."""
return {
'display_name': 'fakeSnapshotDisplayName',
'id': 'fakeSnapshotId',
'volume_size': self.volume_size,
'metadata': self.metadata
}[arg]
def __contains__(self, arg):
"""Getitem."""
return {
'display_name': 'fakeSnapshotDisplayName',
'id': 'fakeSnapshotId',
'volume_size': self.volume_size,
'metadata': self.metadata
}[arg]
class VolumeClass(object):
"""Volume Class."""
display_name = ''
id = ''
size = 0
name = ''
volume_metadata = []
def __init__(self, display_name, id, size, name):
"""Init."""
self.display_name = display_name
self.id = id
self.size = size
self.name = name
self.volume_metadata = [{'key': 'LUNNAA', 'value': 'fakeLunNaa'},
{'key': 'LUNIndex', 'value': 'fakeLunIndex'}]
self.metadata = {'LUNNAA': 'fakeLunNaa',
'LUNIndex': 'fakeLunIndex'}
self.provider_location = '%(host)s:%(port)s,1 %(name)s %(tgt_lun)s' % {
'host': '1.2.3.4',
'port': '3260',
'name': 'fakeTargetIqn',
'tgt_lun': '1'
}
self.volume_type = {
'extra_specs': {
'qnap_thin_provision': 'True',
'qnap_compression': 'True',
'qnap_deduplication': 'False',
'qnap_ssd_cache': 'False'
}
}
def __getitem__(self, arg):
"""Getitem."""
return {
'display_name': self.display_name,
'size': self.size,
'id': self.id,
'name': self.name,
'volume_metadata': self.volume_metadata,
'metadata': self.metadata,
'provider_location': self.provider_location,
'volume_type': self.volume_type
}[arg]
def __contains__(self, arg):
"""Getitem."""
return {
'display_name': self.display_name,
'size': self.size,
'id': self.id,
'name': self.name,
'volume_metadata': self.volume_metadata,
'metadata': self.metadata,
'provider_location': self.provider_location,
'volume_type': self.volume_type
}[arg]
def __setitem__(self, key, value):
"""Setitem."""
if key == 'display_name':
self.display_name = value
class HostClass(object):
"""Host Class."""
def __init__(self, host):
"""Init."""
self.host = host
def __getitem__(self, arg):
"""Getitem."""
return {
'host': 'fakeHost',
}[arg]
class FakeLoginResponse(object):
"""Fake login response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_LOGIN
class FakeNoAuthPassedResponse(object):
"""Fake no auth passed response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_NO_AUTHPASSED
class FakeGetBasicInfoResponse(object):
"""Fake GetBasicInfo response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO
class FakeGetBasicInfo114Response(object):
"""Fake GetBasicInfo114 response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_114
class FakeGetBasicInfoTsResponse(object):
"""Fake GetBasicInfoTs response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_TS
class FakeGetBasicInfoTesResponse(object):
"""Fake GetBasicInfoTes response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_TES
class FakeGetBasicInfoTes433Response(object):
"""Fake GetBasicInfoTes response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_TES_433
class FakeGetBasicInfoUnsupportResponse(object):
"""Fake GetBasicInfoUnsupport response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_UNSUPPORT
class FakeGetBasicInfoUnsupportTsResponse(object):
"""Fake GetBasicInfoUnsupportTs response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_UNSUPPORT_TS
class FakeGetBasicInfoUnsupportTesResponse(object):
"""Fake GetBasicInfoUnsupportTes response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_GETBASIC_INFO_UNSUPPORT_TES
class FakeLunInfoResponse(object):
"""Fake lun info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_LUN_INFO
class FakeLunInfoFailResponse(object):
"""Fake lun info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_LUN_INFO_FAIL
class FakeSnapshotInfoResponse(object):
"""Fake snapshot info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_SNAPSHOT_INFO
class FakeSnapshotInfoFailResponse(object):
"""Fake snapshot info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_SNAPSHOT_INFO_FAIL
class FakeOneLunInfoResponse(object):
"""Fake one lun info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.read."""
return FAKE_RES_DETAIL_DATA_ONE_LUN_INFO
class FakeMappedOneLunInfoResponse(object):
"""Fake one lun info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_MAPPED_ONE_LUN_INFO
class FakePoolInfoResponse(object):
"""Fake pool info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_SPECIFIC_POOL_INFO
class FakePoolInfoFailResponse(object):
"""Fake pool info response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_SPECIFIC_POOL_INFO_FAIL
class FakeCreateLunResponse(object):
"""Fake create lun response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_CREATE_LUN
class FakeCreateLunFailResponse(object):
"""Fake create lun response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_CREATE_LUN_FAIL
class FakeCreateLunBusyResponse(object):
"""Fake create lun response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_CREATE_LUN_BUSY
class FakeCreateTargetResponse(object):
"""Fake create target response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_CREATE_TARGET
class FakeCreateTargetFailResponse(object):
"""Fake create target response."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_CREATE_TARGET_FAIL
class FakeGetIscsiPortalInfoResponse(object):
"""Fake get iscsi portal inforesponse."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_ISCSI_PORTAL_INFO
def __repr__(self):
"""Repr."""
return six.StringIO(FAKE_RES_DETAIL_DATA_ISCSI_PORTAL_INFO)
class FakeCreateSnapshotResponse(object):
"""Fake Create snapshot inforesponse."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_SNAPSHOT
class FakeCreateSnapshotWithoutSnapshotResponse(object):
"""Fake Create snapshot inforesponse."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_SNAPSHOT_WITHOUT_SNAPSHOT
class FakeCreateSnapshotWithoutLunResponse(object):
"""Fake Create snapshot inforesponse."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_SNAPSHOT_WITHOUT_LUN
class FakeCreateSnapshotFailResponse(object):
"""Fake Create snapshot inforesponse."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_SNAPSHOT_FAIL
class FakeGetAllIscsiPortalSetting(object):
"""Fake get all iSCSI portal setting."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_GET_ALL_ISCSI_PORTAL_SETTING
class FakeGetAllEthernetIp(object):
"""Fake get all ethernet ip setting."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_ETHERNET_IP
class FakeTargetInfo(object):
"""Fake target info setting."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_TARGET_INFO
class FakeTargetInfoFail(object):
"""Fake target info setting."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_TARGET_INFO_FAIL
class FakeTargetInfoByInitiator(object):
"""Fake target info setting."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_TARGET_INFO_BY_INITIATOR
class FakeTargetInfoByInitiatorFail(object):
"""Fake target info setting."""
status_code = 'fackStatus'
@property
def text(self):
"""Mock response.text."""
return FAKE_RES_DETAIL_DATA_TARGET_INFO_BY_INITIATOR_FAIL
@ddt
class QnapDriverLoginTestCase(QnapDriverBaseTestCase):
"""Tests do_setup api."""
def setUp(self):
"""Setup the Qnap Share Driver login TestCase."""
super(QnapDriverLoginTestCase, self).setUp()
self.mock_object(requests, 'request')
@data({'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False,
'get_basic_info_response': FakeGetBasicInfoResponse()},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True,
'get_basic_info_response': FakeGetBasicInfoResponse()},
{'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False,
'get_basic_info_response': FakeGetBasicInfoTsResponse()},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True,
'get_basic_info_response': FakeGetBasicInfoTsResponse()},
{'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False,
'get_basic_info_response': FakeGetBasicInfoTesResponse()},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True,
'get_basic_info_response': FakeGetBasicInfoTesResponse()},
{'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False,
'get_basic_info_response': FakeGetBasicInfoTes433Response()},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True,
'get_basic_info_response': FakeGetBasicInfoTes433Response()}
)
@unpack
def test_do_setup_positive(self, mng_url, port,
ssl, get_basic_info_response):
"""Test do_setup with http://1.2.3.4:8080."""
fake_login_response = FakeLoginResponse()
fake_get_basic_info_response = get_basic_info_response
mock_request = requests.request
mock_request.side_effect = ([
fake_login_response,
fake_get_basic_info_response,
fake_login_response])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin', 'qnapadmin', mng_url,
'1.2.3.4', 'Storage Pool 1', True, verify_ssl=ssl))
self.driver.do_setup('context')
self.assertEqual('fakeSid', self.driver.api_executor.sid)
self.assertEqual('admin', self.driver.api_executor.username)
self.assertEqual('qnapadmin', self.driver.api_executor.password)
self.assertEqual('1.2.3.4', self.driver.api_executor.ip)
self.assertEqual(port, self.driver.api_executor.port)
self.assertEqual(ssl, self.driver.api_executor.ssl)
@data({'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True})
@unpack
def test_do_setup_negative_with_configuration_not_set(self, mng_url,
port, ssl):
"""Test do_setup with http://1.2.3.4:8080."""
fake_login_response = FakeLoginResponse()
fake_get_basic_info_response = FakeGetBasicInfoResponse()
mock_request = requests.request
mock_request.side_effect = ([
fake_login_response,
fake_get_basic_info_response,
fake_login_response])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin', 'qnapadmin', mng_url,
'1.2.3.4', 'Storage Pool 1', True, verify_ssl=ssl))
del self.driver.configuration.qnap_management_url
self.assertRaises(exception.InvalidInput,
self.driver.do_setup, 'context')
@data({'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False,
'get_basic_info_response': FakeGetBasicInfoUnsupportTsResponse()},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True,
'get_basic_info_response': FakeGetBasicInfoUnsupportTsResponse()})
@unpack
def test_do_setup_negative_with_unsupport_nas(self, mng_url, port, ssl,
get_basic_info_response):
"""Test do_setup with http://1.2.3.4:8080."""
fake_login_response = FakeLoginResponse()
fake_get_basic_info_response = get_basic_info_response
mock_request = requests.request
mock_request.side_effect = ([
fake_login_response,
fake_get_basic_info_response,
fake_login_response])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin', 'qnapadmin', mng_url,
'1.2.3.4', 'Storage Pool 1', True, verify_ssl=ssl))
self.assertRaises(exception.VolumeDriverException,
self.driver.do_setup, 'context')
@data({'mng_url': 'http://1.2.3.4:8080', 'port': '8080', 'ssl': False},
{'mng_url': 'https://1.2.3.4:443', 'port': '443', 'ssl': True})
@unpack
def test_check_for_setup_error(self, mng_url, port, ssl):
"""Test check_for_setup_error."""
fake_login_response = FakeLoginResponse()
fake_get_basic_info_response = FakeGetBasicInfoResponse()
mock_request = requests.request
mock_request.side_effect = ([
fake_login_response,
fake_get_basic_info_response,
fake_login_response])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin', 'qnapadmin', mng_url,
'1.2.3.4', 'Storage Pool 1', True, verify_ssl=ssl))
self.driver.do_setup('context')
self.driver.check_for_setup_error()
self.assertEqual('fakeSid', self.driver.api_executor.sid)
self.assertEqual('admin', self.driver.api_executor.username)
self.assertEqual('qnapadmin', self.driver.api_executor.password)
self.assertEqual('1.2.3.4', self.driver.api_executor.ip)
self.assertEqual(port, self.driver.api_executor.port)
self.assertEqual(ssl, self.driver.api_executor.ssl)
@ddt
class QnapDriverVolumeTestCase(QnapDriverBaseTestCase):
"""Tests volume related api's."""
def get_lun_info_return_value(self):
"""Return the lun form get_lun_info method."""
root = ET.fromstring(FAKE_RES_DETAIL_DATA_LUN_INFO)
lun_list = root.find('iSCSILUNList')
lun_info_tree = lun_list.findall('LUNInfo')
for lun in lun_info_tree:
return lun
def get_mapped_lun_info_return_value(self):
"""Return the lun form get_lun_info method."""
root = ET.fromstring(FAKE_RES_DETAIL_DATA_MAPPED_LUN_INFO)
lun_list = root.find('iSCSILUNList')
lun_info_tree = lun_list.findall('LUNInfo')
for lun in lun_info_tree:
return lun
def get_one_lun_info_return_value(self):
"""Return the lun form get_one_lun_info method."""
fake_one_lun_info_response = FakeOneLunInfoResponse()
ret = {'data': fake_one_lun_info_response.text,
'error': None,
'http_status': fake_one_lun_info_response.status_code}
return ret
def get_mapped_one_lun_info_return_value(self):
"""Return the lun form get_one_lun_info method."""
fake_mapped_one_lun_info_response = FakeMappedOneLunInfoResponse()
ret = {'data': fake_mapped_one_lun_info_response.text,
'error': None,
'http_status': fake_mapped_one_lun_info_response.status_code}
return ret
def get_snapshot_info_return_value(self):
"""Return the lun form get_lun_info method."""
root = ET.fromstring(FAKE_RES_DETAIL_DATA_SNAPSHOT)
snapshot_list = root.find('SnapshotList')
snapshot_info_tree = snapshot_list.findall('row')
for snapshot in snapshot_info_tree:
return snapshot
def get_target_info_return_value(self):
"""Return the target form get_target_info method."""
root = ET.fromstring(FAKE_RES_DETAIL_DATA_TARGET_INFO)
target_info = root.find('targetInfo/row')
return target_info
@mock.patch.object(qnap.QnapISCSIDriver, '_get_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_volume_positive(
self,
mock_api_executor,
mock_gen_random_name,
mock_get_volume_metadata):
"""Test create_volume with fake_volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.side_effect = [
None,
self.get_lun_info_return_value()]
mock_gen_random_name.return_value = 'fakeLun'
mock_api_return.create_lun.return_value = 'fakeIndex'
mock_get_volume_metadata.return_value = {}
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
self.driver.create_volume(fake_volume)
mock_api_return.create_lun.assert_called_once_with(
fake_volume,
self.driver.configuration.qnap_poolname,
'fakeLun',
True, False, True, False)
expected_call_list = [
mock.call(LUNName='fakeLun'),
mock.call(LUNIndex='fakeIndex')]
self.assertEqual(
expected_call_list,
mock_api_return.get_lun_info.call_args_list)
@mock.patch.object(
qnap.QnapISCSIDriver, '_get_lun_naa_from_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_delete_volume_positive_without_mapped_lun(
self,
mock_api_executor,
mock_get_lun_naa_from_volume_metadata):
"""Test delete_volume with fake_volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return = mock_api_executor.return_value
mock_api_return.get_one_lun_info.return_value = (
self.get_one_lun_info_return_value())
mock_api_return.delete_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.delete_volume(fake_volume)
mock_api_return.delete_lun.assert_called_once_with(
'fakeLunIndex')
@mock.patch.object(
qnap.QnapISCSIDriver, '_get_lun_naa_from_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_delete_volume_positive_with_mapped_lun(
self,
mock_api_executor,
mock_get_lun_naa_from_volume_metadata):
"""Test delete_volume with fake_volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return = mock_api_executor.return_value
mock_api_return.get_one_lun_info.return_value = (
self.get_mapped_one_lun_info_return_value())
mock_api_return.delete_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.delete_volume(fake_volume)
mock_api_return.delete_lun.assert_called_once_with(
'fakeLunIndex')
@mock.patch.object(
qnap.QnapISCSIDriver, '_get_lun_naa_from_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_delete_volume_negative_without_lun_naa(
self,
mock_api_executor,
mock_get_lun_naa_from_volume_metadata):
"""Test delete_volume with fake_volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_get_lun_naa_from_volume_metadata.return_value = ''
mock_api_return = mock_api_executor.return_value
mock_api_return.get_one_lun_info.return_value = (
self.get_one_lun_info_return_value())
mock_api_return.delete_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.delete_volume(fake_volume)
@mock.patch.object(
qnap.QnapISCSIDriver, '_get_lun_naa_from_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_create_snapshot_name')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch.object(qnap.QnapISCSIDriver, '_get_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_cloned_volume_volume_size_less_src_verf(
self,
mock_api_executor,
mock_get_volume_metadata,
mock_gen_random_name,
mock_create_snapshot_name,
mock_get_lun_naa_from_volume_metadata):
"""Test create cloned volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 90, 'fakeLunName')
fake_src_vref = VolumeClass(
'fakeSrcVrefName', 'fakeId', 100, 'fakeSrcVref')
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_get_volume_metadata.return_value = {}
mock_api_executor.return_value.get_lun_info.side_effect = [
self.get_lun_info_return_value(),
None,
self.get_lun_info_return_value()]
mock_gen_random_name.return_value = 'fakeLun'
mock_create_snapshot_name.return_value = 'fakeSnapshot'
mock_api_executor.return_value.get_snapshot_info.return_value = (
self.get_snapshot_info_return_value())
mock_api_executor.return_value.create_snapshot_api.return_value = (
'fakeSnapshotId')
mock_api_executor.return_value.clone_snapshot.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'Pool1',
True))
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
self.driver.create_cloned_volume(fake_volume, fake_src_vref)
expected_call_list = [
mock.call(LUNNAA='fakeLunNaa'),
mock.call(LUNName='fakeLun'),
mock.call(LUNName='fakeLun')]
self.assertEqual(
expected_call_list,
mock_api_executor.return_value.get_lun_info.call_args_list)
expected_call_list = [
mock.call(lun_index='fakeLunIndex', snapshot_name='fakeSnapshot')]
self.assertEqual(
expected_call_list,
mock_api_executor.return_value.get_snapshot_info.call_args_list)
mock_api_return = mock_api_executor.return_value
mock_api_return.create_snapshot_api.assert_called_once_with(
'fakeLunIndex', 'fakeSnapshot')
mock_api_return.clone_snapshot.assert_called_once_with(
'fakeSnapshotId', 'fakeLun')
@mock.patch.object(
qnap.QnapISCSIDriver, '_get_lun_naa_from_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_extend_lun')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch.object(qnap.QnapISCSIDriver, '_get_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_cloned_volume_volume_size_morethan_src_verf(
self,
mock_api_executor,
mock_get_volume_metadata,
mock_gen_random_name,
mock_extend_lun,
mock_get_lun_naa_from_volume_metadata):
"""Test create cloned volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_src_vref = VolumeClass(
'fakeSrcVrefName', 'fakeId', 90, 'fakeSrcVref')
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_get_volume_metadata.return_value = FAKE_LUNNAA
mock_api_executor.return_value.get_lun_info.side_effect = [
self.get_lun_info_return_value(),
None,
self.get_lun_info_return_value()]
mock_gen_random_name.side_effect = ['fakeSnapshot', 'fakeLun']
mock_api_executor.return_value.get_snapshot_info.side_effect = [
None, self.get_snapshot_info_return_value()]
mock_api_executor.return_value.create_snapshot_api.return_value = (
'fakeSnapshotId')
mock_api_executor.return_value.clone_snapshot.return_value = None
mock_extend_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
self.driver.create_cloned_volume(fake_volume, fake_src_vref)
mock_extend_lun.assert_called_once_with(fake_volume, 'fakeLunNaa')
@mock.patch.object(qnap.QnapISCSIDriver, '_create_snapshot_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_snapshot_positive(
self,
mock_api_executor,
mock_create_snapshot_name):
"""Test create snapshot."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
snapshot = SnapshotClass(fake_volume, 100)
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_executor.return_value.get_lun_info.return_value = (
self.get_lun_info_return_value())
mock_create_snapshot_name.return_value = 'fakeSnapshot'
mock_api_executor.return_value.get_snapshot_info.side_effect = [
None, self.get_snapshot_info_return_value()]
mock_api_executor.return_value.create_snapshot_api.return_value = (
'fakeSnapshotId')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
self.driver.create_snapshot(snapshot)
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.assert_called_once_with(
LUNNAA='fakeLunNaa')
expected_call_list = [
mock.call(lun_index='fakeLunIndex', snapshot_name='fakeSnapshot'),
mock.call(lun_index='fakeLunIndex', snapshot_name='fakeSnapshot')]
self.assertEqual(
expected_call_list,
mock_api_return.get_snapshot_info.call_args_list)
mock_api_return.create_snapshot_api.assert_called_once_with(
'fakeLunIndex', 'fakeSnapshot')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_delete_snapshot_positive(
self,
mock_api_executor):
"""Test delete snapshot."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_snapshot = SnapshotClass(fake_volume, 100)
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.delete_snapshot_api.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.delete_snapshot(fake_snapshot)
mock_api_return.delete_snapshot_api.assert_called_once_with(
'fakeSnapshotId')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_delete_snapshot_negative(
self,
mock_api_executor):
"""Test delete snapshot."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_snapshot = SnapshotClass(fake_volume, 100)
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.delete_snapshot_api.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_snapshot.metadata.pop('snapshot_id', None)
self.driver.delete_snapshot(fake_snapshot)
@mock.patch.object(qnap.QnapISCSIDriver, '_get_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_extend_lun')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_volume_from_snapshot_positive_volsize_more_snapshotvolsize(
self,
mock_api_executor,
mock_gen_random_name,
mock_extend_lun,
mock_get_volume_metadata):
"""Test create volume from snapshot positive."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_snapshot = SnapshotClass(fake_volume, 90)
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_gen_random_name.return_value = 'fakeLun'
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.side_effect = [
None,
self.get_lun_info_return_value()]
mock_api_return.clone_snapshot.return_value = None
mock_api_return.create_snapshot_api.return_value = (
'fakeSnapshotId')
mock_extend_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
self.driver.create_volume_from_snapshot(fake_volume, fake_snapshot)
expected_call_list = [
mock.call(LUNName='fakeLun'),
mock.call(LUNName='fakeLun')]
self.assertEqual(
expected_call_list,
mock_api_return.get_lun_info.call_args_list)
mock_api_return.clone_snapshot.assert_called_once_with(
'fakeSnapshotId', 'fakeLun')
mock_extend_lun.assert_called_once_with(fake_volume, 'fakeLunNaa')
@mock.patch.object(qnap.QnapISCSIDriver, '_get_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_extend_lun')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_volume_from_snapshot_negative(
self,
mock_api_executor,
mock_gen_random_name,
mock_extend_lun,
mock_get_volume_metadata):
"""Test create volume from snapshot positive."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_snapshot = SnapshotClass(fake_volume, 90)
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_gen_random_name.return_value = 'fakeLun'
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.side_effect = [
None,
self.get_lun_info_return_value()]
mock_api_return.clone_snapshot.return_value = None
mock_api_return.create_snapshot_api.return_value = (
'fakeSnapshotId')
mock_extend_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_snapshot.metadata.pop('snapshot_id', None)
self.assertRaises(exception.VolumeDriverException,
self.driver.create_volume_from_snapshot,
fake_volume, fake_snapshot)
def get_specific_poolinfo_return_value(self):
"""Get specific pool info."""
root = ET.fromstring(FAKE_RES_DETAIL_DATA_SPECIFIC_POOL_INFO)
pool_list = root.find('Pool_Index')
pool_info_tree = pool_list.findall('row')
for pool in pool_info_tree:
return pool
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_get_volume_stats(
self,
mock_api_executor):
"""Get volume stats."""
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_specific_poolinfo.return_value = (
self.get_specific_poolinfo_return_value())
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.VERSION = 'fakeVersion'
expected_res = {'volume_backend_name': 'QNAP',
'vendor_name': 'QNAP',
'driver_version': 'fakeVersion',
'storage_protocol': 'iscsi'}
single_pool = dict(
pool_name=self.driver.configuration.qnap_poolname,
total_capacity_gb=930213412209 / units.Gi,
free_capacity_gb=928732941681 / units.Gi,
provisioned_capacity_gb=1480470528 / units.Gi,
reserved_percentage=self.driver.configuration.reserved_percentage,
QoS_support=False,
qnap_thin_provision=['True', 'False'],
qnap_compression=['True', 'False'],
qnap_deduplication=['True', 'False'],
qnap_ssd_cache=['True', 'False'])
expected_res['pools'] = [single_pool]
self.assertEqual(
expected_res,
self.driver.get_volume_stats(refresh=True))
mock_api_return.get_specific_poolinfo.assert_called_once_with(
self.driver.configuration.qnap_poolname)
@mock.patch.object(qnap.QnapISCSIDriver, '_extend_lun')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_extend_volume(
self,
mock_api_executor,
mock_extend_lun):
"""Test extend volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.extend_volume(fake_volume, 'fakeSize')
mock_extend_lun.assert_called_once_with(fake_volume, '')
@mock.patch.object(
qnap.QnapISCSIDriver, '_get_lun_naa_from_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_extend_lun(
self,
mock_api_executor,
mock_get_lun_naa_from_volume_metadata):
"""Test _extend_lun method."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.return_value = (
self.get_lun_info_return_value())
mock_api_return.edit_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver._extend_lun(fake_volume, '')
mock_api_return.get_lun_info.assert_called_once_with(
LUNNAA='fakeLunNaa')
expect_lun = {
'LUNName': 'fakeLunName',
'LUNCapacity': fake_volume['size'],
'LUNIndex': 'fakeLunIndex',
'LUNThinAllocate': 'fakeLunThinAllocate',
'LUNPath': 'fakeLunPath',
'LUNStatus': '1'}
mock_api_return.edit_lun.assert_called_once_with(expect_lun)
@mock.patch.object(qnap.QnapISCSIDriver,
'_get_lun_naa_from_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_export_positive_without_multipath(
self,
mock_api_executor,
mock_gen_random_name,
mock_get_lun_naa_from_volume_metadata):
"""Test create export."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.return_value = (
self.get_lun_info_return_value())
mock_api_return.get_iscsi_portal_info.return_value = (
FAKE_RES_DETAIL_ISCSI_PORTAL_INFO)
mock_gen_random_name.return_value = 'fakeTargetName'
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return.create_target.return_value = 'fakeTargetIndex'
mock_api_return.get_target_info.return_value = (
self.get_target_info_return_value())
mock_api_return.map_lun.return_value = None
mock_api_return.get_ethernet_ip.return_value = ['1.2.3.4'], None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.configuration.use_chap_auth = False
self.driver.configuration.chap_username = ''
self.driver.configuration.chap_password = ''
self.driver.iscsi_port = 'fakeServicePort'
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
expected_properties = '%(host)s:%(port)s,1 %(name)s %(tgt_lun)s' % {
'host': '1.2.3.4',
'port': 'fakeServicePort',
'name': 'fakeTargetIqn',
'tgt_lun': '1'}
expected_return = {
'provider_location': expected_properties, 'provider_auth': None}
self.assertEqual(expected_return, self.driver.create_export(
'context', fake_volume, fake_connector))
@mock.patch.object(qnap.QnapISCSIDriver,
'_get_lun_naa_from_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_export_positive_with_multipath(
self,
mock_api_executor,
mock_gen_random_name,
mock_get_lun_naa_from_volume_metadata):
"""Test create export."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn', 'multipath': True}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.return_value = (
self.get_lun_info_return_value())
mock_api_return.get_iscsi_portal_info.return_value = (
FAKE_RES_DETAIL_ISCSI_PORTAL_INFO)
mock_gen_random_name.return_value = 'fakeTargetName'
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return.create_target.return_value = 'fakeTargetIndex'
mock_api_return.get_target_info.return_value = (
self.get_target_info_return_value())
mock_api_return.map_lun.return_value = None
mock_api_return.get_ethernet_ip.return_value = ['1.2.3.4'], None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.configuration.use_chap_auth = False
self.driver.configuration.chap_username = ''
self.driver.configuration.chap_password = ''
self.driver.iscsi_port = 'fakeServicePort'
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
expected_properties = '%(host)s:%(port)s,1 %(name)s %(tgt_lun)s' % {
'host': '1.2.3.4',
'port': 'fakeServicePort',
'name': 'fakeTargetIqn',
'tgt_lun': '1'}
expected_return = {
'provider_location': expected_properties, 'provider_auth': None}
self.assertEqual(expected_return, self.driver.create_export(
'context', fake_volume, fake_connector))
@mock.patch.object(qnap.QnapISCSIDriver,
'_get_lun_naa_from_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_export_114(
self,
mock_api_executor,
mock_gen_random_name,
mock_get_lun_naa_from_volume_metadata):
"""Test create export."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.4')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_one_lun_info.return_value = (
self.get_mapped_one_lun_info_return_value())
mock_api_return.get_iscsi_portal_info.return_value = (
FAKE_RES_DETAIL_ISCSI_PORTAL_INFO)
mock_gen_random_name.return_value = 'fakeTargetName'
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return.create_target.return_value = 'fakeTargetIndex'
mock_api_return.get_target_info.return_value = (
self.get_target_info_return_value())
mock_api_return.add_target_init.return_value = None
mock_api_return.map_lun.return_value = None
mock_api_return.get_ethernet_ip.return_value = ['1.2.3.4'], None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.configuration.use_chap_auth = False
self.driver.configuration.chap_username = ''
self.driver.configuration.chap_password = ''
self.driver.iscsi_port = 'fakeServicePort'
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
expected_properties = '%(host)s:%(port)s,1 %(name)s %(tgt_lun)s' % {
'host': '1.2.3.4',
'port': 'fakeServicePort',
'name': 'fakeTargetIqn',
'tgt_lun': '1'}
expected_return = {
'provider_location': expected_properties, 'provider_auth': None}
self.assertEqual(expected_return, self.driver.create_export(
'context', fake_volume, fake_connector))
@mock.patch.object(qnap.QnapISCSIDriver,
'_get_lun_naa_from_volume_metadata')
@mock.patch.object(qnap.QnapISCSIDriver, '_gen_random_name')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutorTS')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_export_positive_ts(
self,
mock_api_executor,
mock_api_executor_ts,
mock_gen_random_name,
mock_get_lun_naa_from_volume_metadata):
"""Test create export."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'TS-870U-RP ', 'TS-870U-RP ', '4.3.0')
mock_api_executor_ts.return_value.get_basic_info.return_value = (
'TS-870U-RP ', 'TS-870U-RP ', '4.3.0')
mock_api_return = mock_api_executor_ts.return_value
mock_api_return.get_one_lun_info.return_value = (
self.get_mapped_one_lun_info_return_value())
mock_api_return.get_iscsi_portal_info.return_value = (
FAKE_RES_DETAIL_ISCSI_PORTAL_INFO)
mock_gen_random_name.return_value = 'fakeTargetName'
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return.create_target.return_value = 'fakeTargetIndex'
mock_api_return.get_target_info.return_value = (
self.get_target_info_return_value())
mock_api_return.map_lun.return_value = None
mock_api_return.get_ethernet_ip.return_value = ['1.2.3.4'], None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.configuration.use_chap_auth = False
self.driver.configuration.chap_username = ''
self.driver.configuration.chap_password = ''
self.driver.iscsi_port = 'fakeServicePort'
self.mock_object(eventlet, 'sleep')
self.driver.do_setup('context')
expected_properties = '%(host)s:%(port)s,1 %(name)s %(tgt_lun)s' % {
'host': '1.2.3.4',
'port': 'fakeServicePort',
'name': 'fakeTargetIqn',
'tgt_lun': '1'}
expected_return = {
'provider_location': expected_properties, 'provider_auth': None}
self.assertEqual(expected_return, self.driver.create_export(
'context', fake_volume, fake_connector))
@mock.patch.object(qnap.QnapISCSIDriver,
'_get_lun_naa_from_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_create_export_negative_without_lun_naa(
self,
mock_api_executor,
mock_get_lun_naa_from_volume_metadata):
"""Test create export."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
# mock_api_return = mock_api_executor.return_value
mock_get_lun_naa_from_volume_metadata.return_value = ''
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.iscsi_port = 'fakeServicePort'
self.driver.do_setup('context')
self.assertRaises(exception.VolumeDriverException,
self.driver.create_export,
'context', fake_volume, fake_connector)
@mock.patch.object(qnap.QnapISCSIDriver,
'_get_lun_naa_from_volume_metadata')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_initialize_connection_with_target_exist(
self,
mock_api_executor,
mock_get_lun_naa_from_volume_metadata):
"""Test initialize connection."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_iscsi_portal_info.return_value = (
FAKE_RES_DETAIL_ISCSI_PORTAL_INFO)
mock_get_lun_naa_from_volume_metadata.return_value = 'fakeLunNaa'
mock_api_return.get_lun_info.side_effect = [
self.get_lun_info_return_value(),
self.get_lun_info_return_value()]
mock_api_return.get_all_iscsi_portal_setting.return_value = (
FAKE_RES_DETAIL_GET_ALL_ISCSI_PORTAL_SETTING)
mock_api_return.map_lun.return_value = None
mock_api_return.get_ethernet_ip.return_value = ['1.2.3.4'], None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.configuration.use_chap_auth = False
self.driver.configuration.chap_username = ''
self.driver.configuration.chap_password = ''
self.driver.iscsi_port = 'fakeServicePort'
self.driver.do_setup('context')
expected_properties = {
'target_discovered': False,
'target_portal': '1.2.3.4:fakeServicePort',
'target_iqn': 'fakeTargetIqn',
'target_lun': 1,
'volume_id': fake_volume['id']}
expected_return = {
'driver_volume_type': 'iscsi', 'data': expected_properties}
self.assertEqual(expected_return, self.driver.initialize_connection(
fake_volume, fake_connector))
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_initialize_connection_with_target_exist_negative_no_provider(
self,
mock_api_executor):
"""Test initialize connection."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_volume.provider_location = None
self.assertRaises(exception.InvalidParameterValue,
self.driver.initialize_connection,
fake_volume, fake_connector)
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_initialize_connection_with_target_exist_negative_wrong_provider_1(
self,
mock_api_executor):
"""Test initialize connection."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_volume.provider_location = (
'%(host)s:%(port)s,1%(name)s%(tgt_lun)s' % {
'host': '1.2.3.4',
'port': '3260',
'name': 'fakeTargetIqn',
'tgt_lun': '1'
})
self.assertRaises(exception.InvalidInput,
self.driver.initialize_connection,
fake_volume, fake_connector)
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_initialize_connection_with_target_exist_negative_wrong_provider_2(
self, mock_api_executor):
"""Test initialize connection."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiatorIqn'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_volume.provider_location = (
'%(host)s:%(port)s1 %(name)s %(tgt_lun)s' % {
'host': '1.2.3.4',
'port': '3260',
'name': 'fakeTargetIqn',
'tgt_lun': '1'
})
self.assertRaises(exception.InvalidInput,
self.driver.initialize_connection,
fake_volume, fake_connector)
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_terminate_connection_positive_with_lun_mapped(
self,
mock_api_executor):
"""Test terminate connection."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiator'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.return_value = (
self.get_mapped_lun_info_return_value())
mock_api_return.unmap_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.terminate_connection(fake_volume, fake_connector)
mock_api_return.get_lun_info.assert_called_once_with(
LUNIndex='fakeLunIndex')
mock_api_return.unmap_lun.assert_called_once_with(
'fakeLunIndex', '9')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_terminate_connection_positive_without_lun_mapped(
self,
mock_api_executor):
"""Test terminate connection."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_connector = {'initiator': 'fakeInitiator'}
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
mock_api_return = mock_api_executor.return_value
mock_api_return.get_lun_info.return_value = (
self.get_lun_info_return_value())
mock_api_return.unmap_lun.return_value = None
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.terminate_connection(fake_volume, fake_connector)
mock_api_return.get_lun_info.assert_called_once_with(
LUNIndex='fakeLunIndex')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_update_migrated_volume(
self,
mock_api_executor):
"""Test update migrated volume."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
fake_new_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.update_migrated_volume('context',
fake_volume, fake_new_volume,
'fakeOriginalVolumeStatus')
@data({
'fake_spec': {},
'expect_spec': {
'force': False,
'ignore_errors': False,
'remote': False
}
}, {
'fake_spec': {
'force': mock.sentinel.force,
'ignore_errors': mock.sentinel.ignore_errors,
'remote': mock.sentinel.remote
},
'expect_spec': {
'force': mock.sentinel.force,
'ignore_errors': mock.sentinel.ignore_errors,
'remote': mock.sentinel.remote
}
})
@unpack
@mock.patch.object(driver.BaseVD, '_detach_volume')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_detach_volume(
self,
mock_api_executor,
mock_detach_volume,
fake_spec, expect_spec):
"""Test detach volume."""
mock_detach_volume.return_value = None
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver._detach_volume('context',
'attach_info', 'volume',
'property', **fake_spec)
mock_detach_volume.assert_called_once_with(
'context', 'attach_info', 'volume', 'property', **expect_spec)
@mock.patch.object(driver.BaseVD, '_attach_volume')
@mock.patch('cinder.volume.drivers.qnap.QnapAPIExecutor')
def test_attach_volume(
self,
mock_api_executor,
mock_attach_volume):
"""Test attach volume."""
mock_attach_volume.return_value = None
mock_api_executor.return_value.get_basic_info.return_value = (
'ES1640dc ', 'ES1640dc ', '1.1.3')
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver._attach_volume('context', 'volume', 'properties')
mock_attach_volume.assert_called_once_with(
'context', 'volume', 'properties', False)
class QnapAPIExecutorEsTestCase(QnapDriverBaseTestCase):
"""Tests QnapAPIExecutor."""
@mock.patch('requests.request')
def test_create_lun_positive_with_thin_allocate(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertEqual(
'fakeLunIndex',
self.driver.api_executor.create_lun(
fake_volume, 'fakepool', 'fakeLun', True, False, True, False))
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['FileIO'] = 'no'
fake_params['LUNThinAllocate'] = '1'
fake_params['LUNName'] = 'fakeLun'
fake_params['LUNPath'] = 'fakeLun'
fake_params['poolID'] = 'fakepool'
fake_params['lv_ifssd'] = 'no'
fake_params['compression'] = '1'
fake_params['dedup'] = 'off'
fake_params['LUNCapacity'] = 100
fake_params['lv_threshold'] = '80'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_lun_positive_without_thin_allocate(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertEqual(
'fakeLunIndex',
self.driver.api_executor.create_lun(
fake_volume, 'fakepool', 'fakeLun', False, False, True, False))
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['FileIO'] = 'no'
fake_params['LUNThinAllocate'] = '0'
fake_params['LUNName'] = 'fakeLun'
fake_params['LUNPath'] = 'fakeLun'
fake_params['poolID'] = 'fakepool'
fake_params['lv_ifssd'] = 'no'
fake_params['compression'] = '1'
fake_params['dedup'] = 'off'
fake_params['LUNCapacity'] = 100
fake_params['lv_threshold'] = '80'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_lun_negative(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_lun,
fake_volume, 'fakepool', 'fakeLun', 'False',
'False', 'True', 'False')
@mock.patch('requests.request')
def test_create_lun_negative_with_wrong_result(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_lun,
fake_volume, 'fakepool', 'fakeLun', 'False',
'False', 'True', 'False')
@mock.patch('requests.request')
def test_delete_lun(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_lun('fakeLunIndex')
fake_params = {}
fake_params['func'] = 'remove_lun'
fake_params['run_background'] = '1'
fake_params['ha_sync'] = '1'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
delete_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', delete_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_delete_lun_negative(self, mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.delete_lun,
'fakeLunIndex')
@mock.patch('requests.request')
def test_delete_lun_negative_with_wrong_result(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.delete_lun,
'fakeLunIndex')
@mock.patch('requests.request')
def test_delete_lun_positive_with_busy_result(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunBusyResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_lun('fakeLunIndex')
fake_params = {}
fake_params['func'] = 'remove_lun'
fake_params['run_background'] = '1'
fake_params['ha_sync'] = '1'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
delete_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', delete_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_specific_poolinfo(
self,
mock_request):
"""Test get specific pool info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakePoolInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_specific_poolinfo('fakePoolId')
fake_params = {}
fake_params['store'] = 'poolInfo'
fake_params['func'] = 'extra_get'
fake_params['poolID'] = 'fakePoolId'
fake_params['Pool_Info'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_specific_poolinfo_url = (
'http://1.2.3.4:8080/cgi-bin/disk/disk_manage.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_specific_poolinfo_url, data=None,
headers=None, verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_specific_poolinfo_negative(
self,
mock_request):
"""Test get specific pool info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_specific_poolinfo,
'Pool1')
@mock.patch('requests.request')
def test_get_specific_poolinfo_negative_with_wrong_result(
self,
mock_request):
"""Test get specific pool info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakePoolInfoFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_specific_poolinfo,
'Pool1')
@mock.patch('requests.request')
def test_create_target(
self,
mock_request):
"""Test create target."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateTargetResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.create_target('fakeTargetName', 'sca')
fake_params = {}
fake_params['func'] = 'add_target'
fake_params['targetName'] = 'fakeTargetName'
fake_params['targetAlias'] = 'fakeTargetName'
fake_params['bTargetDataDigest'] = '0'
fake_params['bTargetHeaderDigest'] = '0'
fake_params['bTargetClusterEnable'] = '1'
fake_params['controller_name'] = 'sca'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_target_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_target_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_target_negative(
self,
mock_request):
"""Test create target."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_target,
'fakeTargetName', 'sca')
@mock.patch('requests.request')
def test_create_target_negative_with_wrong_result(
self,
mock_request):
"""Test create target."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateTargetFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_target,
'fakeTargetName', 'sca')
@mock.patch('requests.request')
def test_add_target_init(self, mock_request):
"""Test add target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.add_target_init(
'fakeTargetIqn', 'fakeInitiatorIqn', False, '', '')
fake_params = {}
fake_params['func'] = 'add_init'
fake_params['targetIQN'] = 'fakeTargetIqn'
fake_params['initiatorIQN'] = 'fakeInitiatorIqn'
fake_params['initiatorAlias'] = 'fakeInitiatorIqn'
fake_params['bCHAPEnable'] = '0'
fake_params['CHAPUserName'] = ''
fake_params['CHAPPasswd'] = ''
fake_params['bMutualCHAPEnable'] = '0'
fake_params['mutualCHAPUserName'] = ''
fake_params['mutualCHAPPasswd'] = ''
fake_params['ha_sync'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
add_target_init_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', add_target_init_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_add_target_init_negative(
self,
mock_request):
"""Test add target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.add_target_init,
'fakeTargetIqn', 'fakeInitiatorIqn', False, '', '')
@mock.patch('requests.request')
def test_add_target_init_negative_with_wrong_result(
self,
mock_request):
"""Test add target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.add_target_init,
'fakeTargetIqn', 'fakeInitiatorIqn', False, '', '')
@mock.patch('requests.request')
def test_remove_target_init(
self,
mock_request):
"""Test add target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.remove_target_init(
'fakeTargetIqn', 'fakeInitiatorIqn')
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_map_lun(
self,
mock_request):
"""Test map lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.map_lun(
'fakeLunIndex', 'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
map_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', map_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_map_lun_negative(
self,
mock_request):
"""Test map lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.map_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_map_lun_negative_with_wrong_result(
self,
mock_request):
"""Test map lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.map_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_disable_lun(
self,
mock_request):
"""Test disable lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.disable_lun(
'fakeLunIndex', 'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'edit_lun'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['LUNEnable'] = 0
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
unmap_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', unmap_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_disable_lun_negative(self, mock_request):
"""Test disable lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.disable_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_disable_lun_negative_with_wrong_result(
self,
mock_request):
"""Test disable lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.disable_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_unmap_lun(
self,
mock_request):
"""Test unmap lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.unmap_lun(
'fakeLunIndex', 'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'remove_lun'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
unmap_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', unmap_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_unmap_lun_negative(
self,
mock_request):
"""Test unmap lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.unmap_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_unmap_lun_negative_with_wrong_result(
self,
mock_request):
"""Test unmap lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.unmap_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_get_iscsi_portal_info(
self,
mock_request):
"""Test get iscsi portal info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_iscsi_portal_info()
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['iSCSI_portal'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_iscsi_portal_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_iscsi_portal_info_url, data=None,
headers=None, verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_iscsi_portal_info_negative(
self,
mock_request):
"""Test get iscsi portal info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_iscsi_portal_info)
@mock.patch('requests.request')
def test_get_lun_info(self, mock_request):
"""Test get lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_lun_info()
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['lunList'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_lun_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_lun_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_lun_info_positive_with_lun_index(
self,
mock_request):
"""Test get lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_lun_info(LUNIndex='fakeLunIndex')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['lunList'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_lun_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_lun_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_lun_info_positive_with_lun_name(
self,
mock_request):
"""Test get lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_lun_info(LUNName='fakeLunName')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['lunList'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_lun_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_lun_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_lun_info_positive_with_lun_naa(
self,
mock_request):
"""Test get lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_lun_info(LUNNAA='fakeLunNaa')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['lunList'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_lun_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_lun_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_lun_info_negative(
self,
mock_request):
"""Test get lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_lun_info)
@mock.patch('requests.request')
def test_get_one_lun_info(
self,
mock_request):
"""Test get one lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeOneLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_one_lun_info('fakeLunId')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['lun_info'] = '1'
fake_params['lunID'] = 'fakeLunId'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_lun_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_lun_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_one_lun_info_negative(
self,
mock_request):
"""Test get one lun info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_one_lun_info,
'fakeLunId')
@mock.patch('requests.request')
def test_get_snapshot_info(
self,
mock_request):
"""Test get snapshot info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeSnapshotInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_snapshot_info(
lun_index='fakeLunIndex', snapshot_name='fakeSnapshotName')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['snapshot_list'] = '1'
fake_params['snap_start'] = '0'
fake_params['snap_count'] = '100'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_snapshot_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_snapshot_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_snapshot_info_negative(
self,
mock_request):
"""Test get snapshot info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_snapshot_info,
lun_index='fakeLunIndex',
snapshot_name='fakeSnapshotName')
@mock.patch('requests.request')
def test_get_snapshot_info_negative_with_wrong_result(
self,
mock_request):
"""Test get snapshot info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeSnapshotInfoFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_snapshot_info,
lun_index='fakeLunIndex',
snapshot_name='fakeSnapshotName')
@mock.patch('requests.request')
def test_create_snapshot_api(
self,
mock_request):
"""Test create snapshot api."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.create_snapshot_api(
'fakeLunIndex', 'fakeSnapshotName')
fake_params = {}
fake_params['func'] = 'create_snapshot'
fake_params['lunID'] = 'fakeLunIndex'
fake_params['snapshot_name'] = 'fakeSnapshotName'
fake_params['expire_min'] = '0'
fake_params['vital'] = '1'
fake_params['snapshot_type'] = '0'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_snapshot_api_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_snapshot_api_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_snapshot_api_negative(
self,
mock_request):
"""Test create snapshot api."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_snapshot_api,
'fakeLunIndex', 'fakeSnapshotName')
@mock.patch('requests.request')
def test_create_snapshot_api_negative_with_wrong_result(
self,
mock_request):
"""Test create snapshot api."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_snapshot_api,
'fakeLunIndex', 'fakeSnapshotName')
@mock.patch('requests.request')
def test_delete_snapshot_api(
self,
mock_request):
"""Test api delete snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_snapshot_api(
'fakeSnapshotId')
fake_params = {}
fake_params['func'] = 'del_snapshots'
fake_params['snapshotID'] = 'fakeSnapshotId'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
api_delete_snapshot_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', api_delete_snapshot_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_delete_snapshot_api_positive_without_snapshot(
self,
mock_request):
"""Test api de;ete snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotWithoutSnapshotResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_snapshot_api(
'fakeSnapshotId')
fake_params = {}
fake_params['func'] = 'del_snapshots'
fake_params['snapshotID'] = 'fakeSnapshotId'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
api_delete_snapshot_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', api_delete_snapshot_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_delete_snapshot_api_positive_without_lun(
self,
mock_request):
"""Test api de;ete snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotWithoutLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_snapshot_api(
'fakeSnapshotId')
fake_params = {}
fake_params['func'] = 'del_snapshots'
fake_params['snapshotID'] = 'fakeSnapshotId'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
api_delete_snapshot_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', api_delete_snapshot_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_delete_snapshot_api_negative(
self,
mock_request):
"""Test api de;ete snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.delete_snapshot_api,
'fakeSnapshotId')
@mock.patch('requests.request')
def test_delete_snapshot_api_negative_with_wrong_result(
self,
mock_request):
"""Test api de;ete snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.delete_snapshot_api,
'fakeSnapshotId')
@mock.patch('requests.request')
def test_clone_snapshot(
self,
mock_request):
"""Test clone snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.clone_snapshot(
'fakeSnapshotId', 'fakeLunName')
fake_params = {}
fake_params['func'] = 'clone_qsnapshot'
fake_params['by_lun'] = '1'
fake_params['snapshotID'] = 'fakeSnapshotId'
fake_params['new_name'] = 'fakeLunName'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
clone_snapshot_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', clone_snapshot_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_clone_snapshot_negative(
self,
mock_request):
"""Test clone snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.clone_snapshot,
'fakeSnapshotId', 'fakeLunName')
@mock.patch('requests.request')
def test_clone_snapshot_negative_with_wrong_result(
self,
mock_request):
"""Test clone snapshot."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeCreateSnapshotFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.clone_snapshot,
'fakeSnapshotId', 'fakeLunName')
@mock.patch('requests.request')
def test_edit_lun(
self,
mock_request):
"""Test edit lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_lun = {'LUNName': 'fakeLunName',
'LUNCapacity': 100,
'LUNIndex': 'fakeLunIndex',
'LUNThinAllocate': False,
'LUNPath': 'fakeLunPath',
'LUNStatus': 'fakeLunStatus'}
self.driver.api_executor.edit_lun(fake_lun)
fake_params = {}
fake_params['func'] = 'edit_lun'
fake_params['LUNName'] = 'fakeLunName'
fake_params['LUNCapacity'] = 100
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['LUNThinAllocate'] = False
fake_params['LUNPath'] = 'fakeLunPath'
fake_params['LUNStatus'] = 'fakeLunStatus'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
edit_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', edit_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_edit_lun_negative(
self,
mock_request):
"""Test edit lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_lun = {'LUNName': 'fakeLunName',
'LUNCapacity': 100,
'LUNIndex': 'fakeLunIndex',
'LUNThinAllocate': False,
'LUNPath': 'fakeLunPath',
'LUNStatus': 'fakeLunStatus'}
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.edit_lun,
fake_lun)
@mock.patch('requests.request')
def test_edit_lun_negative_with_wrong_result(
self,
mock_request):
"""Test edit lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
fake_lun = {'LUNName': 'fakeLunName',
'LUNCapacity': 100,
'LUNIndex': 'fakeLunIndex',
'LUNThinAllocate': False,
'LUNPath': 'fakeLunPath',
'LUNStatus': 'fakeLunStatus'}
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.edit_lun,
fake_lun)
@mock.patch('requests.request')
def test_get_all_iscsi_portal_setting(
self,
mock_request):
"""Test get all iscsi portal setting."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeLunInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_all_iscsi_portal_setting()
fake_params = {}
fake_params['func'] = 'get_all'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_all_iscsi_portal_setting_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_all_iscsi_portal_setting_url, data=None,
headers=None, verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_ethernet_ip_with_type_data(
self,
mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeGetAllEthernetIp()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_ethernet_ip(type='data')
fake_params = {}
fake_params['subfunc'] = 'net_setting'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_ethernet_ip_url = (
'http://1.2.3.4:8080/cgi-bin/sys/sysRequest.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_ethernet_ip_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_ethernet_ip_with_type_manage(
self,
mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeGetAllEthernetIp()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_ethernet_ip(type='manage')
fake_params = {}
fake_params['subfunc'] = 'net_setting'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_ethernet_ip_url = (
'http://1.2.3.4:8080/cgi-bin/sys/sysRequest.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_ethernet_ip_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_ethernet_ip_with_type_all(self, mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeGetAllEthernetIp()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_ethernet_ip(type='all')
fake_params = {}
fake_params['subfunc'] = 'net_setting'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_ethernet_ip_url = (
'http://1.2.3.4:8080/cgi-bin/sys/sysRequest.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_ethernet_ip_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_ethernet_ip_negative(
self,
mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_ethernet_ip,
type='data')
@mock.patch('requests.request')
def test_get_target_info(
self,
mock_request):
"""Test get target info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeTargetInfo()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_target_info('fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['targetInfo'] = 1
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_target_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_target_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_target_info_negative(
self,
mock_request):
"""Test get target info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_target_info,
'fakeTargetIndex')
@mock.patch('requests.request')
def test_get_target_info_negative_with_wrong_result(
self,
mock_request):
"""Test get target info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoResponse(),
FakeLoginResponse(),
FakeTargetInfoFail()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_target_info,
'fakeTargetIndex')
@mock.patch('requests.request')
def test_get_target_info_by_initiator(
self,
mock_request):
"""Test get target info by initiator."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfo114Response(),
FakeLoginResponse(),
FakeTargetInfoByInitiator()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_target_info_by_initiator(
'fakeInitiatorIQN')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['initiatorIQN'] = 'fakeInitiatorIQN'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_target_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_target_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_target_info_by_initiator_negative(
self,
mock_request):
"""Test get target info by initiator."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfo114Response(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.
get_target_info_by_initiator,
'fakeInitiatorIQN')
@mock.patch('requests.request')
def test_get_target_info_by_initiator_with_wrong_result(
self,
mock_request):
"""Test get target info by initiator."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfo114Response(),
FakeLoginResponse(),
FakeTargetInfoByInitiatorFail()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_target_info_by_initiator(
'fakeInitiatorIQN')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['initiatorIQN'] = 'fakeInitiatorIQN'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_target_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_target_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
class QnapAPIExecutorTsTestCase(QnapDriverBaseTestCase):
"""Tests QnapAPIExecutorTS."""
@mock.patch('requests.request')
def test_create_lun_positive_with_thin_allocate(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertEqual(
'fakeLunIndex',
self.driver.api_executor.create_lun(
fake_volume, 'fakepool', 'fakeLun', True, False, True, False))
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['FileIO'] = 'no'
fake_params['LUNThinAllocate'] = '1'
fake_params['LUNName'] = 'fakeLun'
fake_params['LUNPath'] = 'fakeLun'
fake_params['poolID'] = 'fakepool'
fake_params['lv_ifssd'] = 'no'
fake_params['LUNCapacity'] = 100
fake_params['LUNSectorSize'] = '512'
fake_params['lv_threshold'] = '80'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_lun_positive_without_thin_allocate(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertEqual(
'fakeLunIndex',
self.driver.api_executor.create_lun(
fake_volume, 'fakepool', 'fakeLun', False, False, True, False))
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['FileIO'] = 'no'
fake_params['LUNThinAllocate'] = '0'
fake_params['LUNName'] = 'fakeLun'
fake_params['LUNPath'] = 'fakeLun'
fake_params['poolID'] = 'fakepool'
fake_params['lv_ifssd'] = 'no'
fake_params['LUNCapacity'] = 100
fake_params['LUNSectorSize'] = '512'
fake_params['lv_threshold'] = '80'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_lun_negative(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_lun,
fake_volume, 'fakepool', 'fakeLun', 'False',
'False', 'True', 'False')
@mock.patch('requests.request')
def test_create_lun_negative_with_wrong_result(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_lun,
fake_volume, 'fakepool', 'fakeLun', 'False',
'False', 'True', 'False')
@mock.patch('requests.request')
def test_delete_lun(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_lun('fakeLunIndex')
fake_params = {}
fake_params['func'] = 'remove_lun'
fake_params['run_background'] = '1'
fake_params['ha_sync'] = '1'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
delete_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', delete_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_delete_lun_negative(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.delete_lun,
'fakeLunIndex')
@mock.patch('requests.request')
def test_delete_lun_negative_with_wrong_result(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.delete_lun,
'fakeLunIndex')
@mock.patch('requests.request')
def test_delete_lun_positive_with_busy_result(
self,
mock_request):
"""Test delete lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunBusyResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.delete_lun('fakeLunIndex')
fake_params = {}
fake_params['func'] = 'remove_lun'
fake_params['run_background'] = '1'
fake_params['ha_sync'] = '1'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
delete_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', delete_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_map_lun(
self,
mock_request):
"""Test map lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.map_lun(
'fakeLunIndex', 'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
map_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', map_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_map_lun_negative(
self,
mock_request):
"""Test map lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.map_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_map_lun_negative_with_wrong_result(
self,
mock_request):
"""Test map lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.map_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_disable_lun(
self,
mock_request):
"""Test disable lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.disable_lun(
'fakeLunIndex', 'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'edit_lun'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['LUNEnable'] = 0
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
unmap_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', unmap_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_disable_lun_negative(
self,
mock_request):
"""Test disable lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.disable_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_disable_lun_negative_with_wrong_result(
self,
mock_request):
"""Test disable lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.disable_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_unmap_lun(
self,
mock_request):
"""Test unmap lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.unmap_lun(
'fakeLunIndex', 'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'remove_lun'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
unmap_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', unmap_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_unmap_lun_negative(
self,
mock_request):
"""Test unmap lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.unmap_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_unmap_lun_negative_with_wrong_result(
self,
mock_request):
"""Test unmap lun."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.unmap_lun,
'fakeLunIndex', 'fakeTargetIndex')
@mock.patch('requests.request')
def test_remove_target_init(
self,
mock_request):
"""Test remove target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeTargetInfo()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.remove_target_init(
'fakeTargetIqn', 'fakeDefaultAcl')
fake_params = {}
fake_params['func'] = 'remove_init'
fake_params['targetIQN'] = 'fakeTargetIqn'
fake_params['initiatorIQN'] = 'fakeDefaultAcl'
fake_params['ha_sync'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
remove_target_init_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', remove_target_init_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_remove_target_init_negative(
self,
mock_request):
"""Test remove target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.remove_target_init,
'fakeTargetIqn', 'fakeDefaultAcl')
@mock.patch('requests.request')
def test_remove_target_init_negative_with_wrong_result(
self, mock_request):
"""Test remove target init."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeTargetInfoFail()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.remove_target_init,
'fakeTargetIqn', 'fakeDefaultAcl')
@mock.patch('requests.request')
def test_get_target_info(
self, mock_request):
"""Test get get target info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeTargetInfo()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_target_info(
'fakeTargetIndex')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['targetInfo'] = 1
fake_params['targetIndex'] = 'fakeTargetIndex'
fake_params['ha_sync'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_target_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_portal_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_target_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_target_info_negative(
self,
mock_request):
"""Test get get target info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_target_info,
'fakeTargetIndex')
@mock.patch('requests.request')
def test_get_target_info_negative_with_wrong_result(
self,
mock_request):
"""Test get get target info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeTargetInfoFail()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_target_info,
'fakeTargetIndex')
@mock.patch('requests.request')
def test_get_ethernet_ip_with_type(
self,
mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeGetAllEthernetIp()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_ethernet_ip(
type='data')
fake_post_parm = 'sid=fakeSid&subfunc=net_setting'
get_ethernet_ip_url = (
'http://1.2.3.4:8080/cgi-bin/sys/sysRequest.cgi?' + fake_post_parm)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_ethernet_ip_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_ethernet_ip_negative(self, mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_ethernet_ip,
type='data')
@mock.patch('requests.request')
def test_get_snapshot_info(
self,
mock_request):
"""Test get snapshot info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeSnapshotInfoResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_snapshot_info(
lun_index='fakeLunIndex', snapshot_name='fakeSnapshotName')
fake_params = {}
fake_params['func'] = 'extra_get'
fake_params['LUNIndex'] = 'fakeLunIndex'
fake_params['smb_snapshot_list'] = '1'
fake_params['smb_snapshot'] = '1'
fake_params['snapshot_list'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
get_snapshot_info_url = (
'http://1.2.3.4:8080/cgi-bin/disk/snapshot.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_snapshot_info_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_snapshot_info_negative(
self,
mock_request):
"""Test get snapshot info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_snapshot_info,
lun_index='fakeLunIndex',
snapshot_name='fakeSnapshotName')
@mock.patch('requests.request')
def test_get_snapshot_info_negative_with_wrong_result(
self,
mock_request):
"""Test get snapshot info."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeSnapshotInfoFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_snapshot_info,
lun_index='fakeLunIndex',
snapshot_name='fakeSnapshotName')
@mock.patch('requests.request')
def test_create_target(
self,
mock_request):
"""Test create target."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateTargetResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.driver.api_executor.create_target('fakeTargetName', 'sca')
fake_params = {}
fake_params['func'] = 'add_target'
fake_params['targetName'] = 'fakeTargetName'
fake_params['targetAlias'] = 'fakeTargetName'
fake_params['bTargetDataDigest'] = '0'
fake_params['bTargetHeaderDigest'] = '0'
fake_params['bTargetClusterEnable'] = '1'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_target_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_target_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_target_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_target_negative(
self,
mock_request):
"""Test create target."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_target,
'fakeTargetName', 'sca')
@mock.patch('requests.request')
def test_create_target_negative_with_wrong_result(
self,
mock_request):
"""Test create target."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTsResponse(),
FakeLoginResponse(),
FakeCreateTargetFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Storage Pool 1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_target,
'fakeTargetName', 'sca')
class QnapAPIExecutorTesTestCase(QnapDriverBaseTestCase):
"""Tests QnapAPIExecutorTES."""
@mock.patch('requests.request')
def test_create_lun_positive_with_thin_allocate(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTesResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertEqual(
'fakeLunIndex',
self.driver.api_executor.create_lun(
fake_volume, 'fakepool', 'fakeLun', True, False, True, False))
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['FileIO'] = 'no'
fake_params['LUNThinAllocate'] = '1'
fake_params['LUNName'] = 'fakeLun'
fake_params['LUNPath'] = 'fakeLun'
fake_params['poolID'] = 'fakepool'
fake_params['lv_ifssd'] = 'no'
fake_params['compression'] = '1'
fake_params['dedup'] = 'off'
fake_params['sync'] = 'disabled'
fake_params['LUNCapacity'] = 100
fake_params['lv_threshold'] = '80'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_lun_positive_without_thin_allocate(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTesResponse(),
FakeLoginResponse(),
FakeCreateLunResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertEqual(
'fakeLunIndex',
self.driver.api_executor.create_lun(
fake_volume, 'fakepool', 'fakeLun', False, False, True, False))
fake_params = {}
fake_params['func'] = 'add_lun'
fake_params['FileIO'] = 'no'
fake_params['LUNThinAllocate'] = '0'
fake_params['LUNName'] = 'fakeLun'
fake_params['LUNPath'] = 'fakeLun'
fake_params['poolID'] = 'fakepool'
fake_params['lv_ifssd'] = 'no'
fake_params['compression'] = '1'
fake_params['dedup'] = 'off'
fake_params['sync'] = 'disabled'
fake_params['LUNCapacity'] = 100
fake_params['lv_threshold'] = '80'
fake_params['sid'] = 'fakeSid'
fake_post_params = self.sanitize(fake_params)
create_lun_url = (
'http://1.2.3.4:8080/cgi-bin/disk/iscsi_lun_setting.cgi?' +
fake_post_params)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', create_lun_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_create_lun_negative(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTesResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_lun,
fake_volume, 'fakepool', 'fakeLun', 'False',
'False', 'True', 'False')
@mock.patch('requests.request')
def test_create_lun_negative_with_wrong_result(
self,
mock_request):
"""Test create lun."""
fake_volume = VolumeClass(
'fakeDisplayName', 'fakeId', 100, 'fakeLunName')
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTesResponse(),
FakeLoginResponse(),
FakeCreateLunFailResponse()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.create_lun,
fake_volume, 'fakepool', 'fakeLun', 'False',
'False', 'True', 'False')
@mock.patch('requests.request')
def test_get_ethernet_ip_with_type(
self,
mock_request):
"""Test get ehternet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTesResponse(),
FakeLoginResponse(),
FakeGetAllEthernetIp()])
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.driver.api_executor.get_ethernet_ip(
type='data')
fake_post_parm = 'sid=fakeSid&subfunc=net_setting'
get_ethernet_ip_url = (
'http://1.2.3.4:8080/cgi-bin/sys/sysRequest.cgi?' + fake_post_parm)
expected_call_list = [
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', fake_get_basic_info_url, data=None, headers=None,
verify=False),
mock.call('POST', fake_login_url, data=global_sanitized_params,
headers=header, verify=False),
mock.call('GET', get_ethernet_ip_url, data=None, headers=None,
verify=False)]
self.assertEqual(expected_call_list, mock_request.call_args_list)
@mock.patch('requests.request')
def test_get_ethernet_ip_negative(
self,
mock_request):
"""Test get ethernet ip."""
mock_request.side_effect = ([
FakeLoginResponse(),
FakeGetBasicInfoTesResponse(),
FakeLoginResponse(),
FakeNoAuthPassedResponse()] + [
FakeLoginResponse(),
FakeNoAuthPassedResponse()] * 4)
self.driver = qnap.QnapISCSIDriver(
configuration=create_configuration(
'admin',
'qnapadmin',
'http://1.2.3.4:8080',
'1.2.3.4',
'Pool1',
True))
self.driver.do_setup('context')
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.api_executor.get_ethernet_ip,
type='data')