cinder/cinder/tests/unit/test_infortrend_cli.py

2311 lines
70 KiB
Python

# Copyright (c) 2015 Infortrend Technology, 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 mock
from cinder import test
from cinder.volume.drivers.infortrend.eonstor_ds_cli import cli_factory as cli
class InfortrendCLITestData(object):
"""CLI Test Data."""
# Infortrend entry
fake_lv_id = ['5DE94FF775D81C30', '1234567890']
fake_partition_id = ['6A41315B0EDC8EB7', '51B4283E4E159173',
'987654321', '123456789',
'2667FE351FC505AE', '53F3E98141A2E871']
fake_pair_id = ['55D790F8350B036B', '095A184B0ED2DB10']
fake_snapshot_id = ['2C7A8D211F3B1E36', '60135EE53C14D5EB']
fake_data_port_ip = ['172.27.0.1', '172.27.0.2',
'172.27.0.3', '172.27.0.4',
'172.27.0.5', '172.27.0.6']
fake_model = ['DS S12F-G2852-6']
fake_manage_port_ip = ['172.27.0.10']
fake_system_id = ['DEEC']
fake_host_ip = ['172.27.0.2']
fake_target_wwnns = ['100123D02300DEEC', '100123D02310DEEC']
fake_target_wwpns = ['110123D02300DEEC', '120123D02300DEEC',
'110123D02310DEEC', '120123D02310DEEC']
fake_initiator_wwnns = ['2234567890123456', '2234567890543216']
fake_initiator_wwpns = ['1234567890123456', '1234567890543216']
fake_initiator_iqn = ['iqn.1991-05.com.infortrend:pc123',
'iqn.1991-05.com.infortrend:pc456']
fake_lun_map = [0, 1, 2]
# cinder entry
test_provider_location = [(
'system_id^%s@partition_id^%s') % (
int(fake_system_id[0], 16), fake_partition_id[0]),
]
test_volume = {
'id': '5aa119a8-d25b-45a7-8d1b-88e127885635',
'size': 1,
'name': 'Part-1',
'host': 'infortrend-server1@backend_1#LV-1',
'name_id': '5aa119a8-d25b-45a7-8d1b-88e127885635',
'provider_auth': None,
'project_id': 'project',
'display_name': None,
'display_description': 'Part-1',
'volume_type_id': None,
'provider_location': test_provider_location[0],
'volume_attachment': [],
}
test_dst_volume = {
'id': '6bb119a8-d25b-45a7-8d1b-88e127885666',
'size': 1,
'name': 'Part-1-Copy',
'host': 'infortrend-server1@backend_1',
'name_id': '6bb119a8-d25b-45a7-8d1b-88e127885666',
'provider_auth': None,
'project_id': 'project',
'display_name': None,
'_name_id': '6bb119a8-d25b-45a7-8d1b-88e127885666',
'display_description': 'Part-1-Copy',
'volume_type_id': None,
'provider_location': '',
'volume_attachment': [],
}
test_ref_volume = {
'source-id': '6bb119a8-d25b-45a7-8d1b-88e127885666',
'size': 1,
}
test_ref_volume_with_import = {
'source-name': 'import_into_openstack',
'size': 1,
}
test_snapshot = {
'id': 'ffa9bc5e-1172-4021-acaf-cdcd78a9584d',
'volume_id': test_volume['id'],
'size': 2,
'volume_name': test_volume['name'],
'volume_size': 2,
'project_id': 'project',
'display_name': None,
'display_description': 'SI-1',
'volume_type_id': None,
'provider_location': fake_snapshot_id[0],
}
test_iqn = [(
'iqn.2002-10.com.infortrend:raid.uid%s.%s%s%s') % (
int(fake_system_id[0], 16), 1, 0, 1), (
'iqn.2002-10.com.infortrend:raid.uid%s.%s%s%s') % (
int(fake_system_id[0], 16), 1, 0, 1),
]
test_iscsi_properties = {
'driver_volume_type': 'iscsi',
'data': {
'target_discovered': True,
'target_portal': '%s:3260' % fake_data_port_ip[2],
'target_iqn': test_iqn[0],
'target_lun': fake_lun_map[0],
'volume_id': test_volume['id'],
},
}
test_iscsi_properties_with_mcs = {
'driver_volume_type': 'iscsi',
'data': {
'target_discovered': True,
'target_portal': '%s:3260' % fake_data_port_ip[0],
'target_iqn': test_iqn[1],
'target_lun': fake_lun_map[2],
'volume_id': test_volume['id'],
},
}
test_iqn_empty_map = [(
'iqn.2002-10.com.infortrend:raid.uid%s.%s%s%s') % (
int(fake_system_id[0], 16), 0, 0, 1),
]
test_iscsi_properties_empty_map = {
'driver_volume_type': 'iscsi',
'data': {
'target_discovered': True,
'target_portal': '%s:3260' % fake_data_port_ip[0],
'target_iqn': test_iqn_empty_map[0],
'target_lun': fake_lun_map[0],
'volume_id': test_volume['id'],
},
}
test_initiator_target_map = {
fake_initiator_wwpns[0]: fake_target_wwpns[0:2],
fake_initiator_wwpns[1]: fake_target_wwpns[0:2],
}
test_fc_properties = {
'driver_volume_type': 'fibre_channel',
'data': {
'target_discovered': True,
'target_lun': fake_lun_map[0],
'target_wwn': fake_target_wwpns[0:2],
'initiator_target_map': test_initiator_target_map,
},
}
test_initiator_target_map_specific_channel = {
fake_initiator_wwpns[0]: [fake_target_wwpns[1]],
fake_initiator_wwpns[1]: [fake_target_wwpns[1]],
}
test_fc_properties_with_specific_channel = {
'driver_volume_type': 'fibre_channel',
'data': {
'target_discovered': True,
'target_lun': fake_lun_map[0],
'target_wwn': [fake_target_wwpns[1]],
'initiator_target_map': test_initiator_target_map_specific_channel,
},
}
test_target_wwpns_map_multipath_r_model = [
fake_target_wwpns[0],
fake_target_wwpns[2],
fake_target_wwpns[1],
fake_target_wwpns[3],
]
test_initiator_target_map_multipath_r_model = {
fake_initiator_wwpns[0]: test_target_wwpns_map_multipath_r_model[:],
fake_initiator_wwpns[1]: test_target_wwpns_map_multipath_r_model[:],
}
test_fc_properties_multipath_r_model = {
'driver_volume_type': 'fibre_channel',
'data': {
'target_discovered': True,
'target_lun': fake_lun_map[0],
'target_wwn': test_target_wwpns_map_multipath_r_model[:],
'initiator_target_map':
test_initiator_target_map_multipath_r_model,
},
}
test_initiator_target_map_zoning = {
fake_initiator_wwpns[0].lower():
[x.lower() for x in fake_target_wwpns[0:2]],
fake_initiator_wwpns[1].lower():
[x.lower() for x in fake_target_wwpns[0:2]],
}
test_fc_properties_zoning = {
'driver_volume_type': 'fibre_channel',
'data': {
'target_discovered': True,
'target_lun': fake_lun_map[0],
'target_wwn': [x.lower() for x in fake_target_wwpns[0:2]],
'initiator_target_map': test_initiator_target_map_zoning,
},
}
test_initiator_target_map_zoning_r_model = {
fake_initiator_wwpns[0].lower():
[x.lower() for x in fake_target_wwpns[1:3]],
fake_initiator_wwpns[1].lower():
[x.lower() for x in fake_target_wwpns[1:3]],
}
test_fc_properties_zoning_r_model = {
'driver_volume_type': 'fibre_channel',
'data': {
'target_discovered': True,
'target_lun': fake_lun_map[0],
'target_wwn': [x.lower() for x in fake_target_wwpns[1:3]],
'initiator_target_map': test_initiator_target_map_zoning_r_model,
},
}
test_fc_terminate_conn_info = {
'driver_volume_type': 'fibre_channel',
'data': {
'initiator_target_map': test_initiator_target_map_zoning,
},
}
test_connector_iscsi = {
'ip': fake_host_ip[0],
'initiator': fake_initiator_iqn[0],
'host': 'infortrend-server1@backend_1',
}
test_connector_fc = {
'wwpns': fake_initiator_wwpns,
'wwnns': fake_initiator_wwnns,
'host': 'infortrend-server1@backend_1',
}
fake_pool = {
'pool_name': 'LV-2',
'pool_id': fake_lv_id[1],
'total_capacity_gb': 1000,
'free_capacity_gb': 1000,
'reserved_percentage': 0,
'QoS_support': False,
'thin_provisioning_support': False,
}
test_pools = [{
'pool_name': 'LV-1',
'pool_id': fake_lv_id[0],
'total_capacity_gb': round(857982.0 / 1024, 2),
'free_capacity_gb': round(841978.0 / 1024, 2),
'reserved_percentage': 0,
'QoS_support': False,
'max_over_subscription_ratio': 20.0,
'thin_provisioning_support': False,
'thick_provisioning_support': True,
'provisioned_capacity_gb':
round((400) / 1024, 2),
'infortrend_provisioning': 'full',
}]
test_volume_states = {
'volume_backend_name': 'infortrend_backend_1',
'vendor_name': 'Infortrend',
'driver_version': '99.99',
'storage_protocol': 'iSCSI',
'pools': test_pools,
}
test_host = {
'host': 'infortrend-server1@backend_1',
'capabilities': test_volume_states,
}
test_migrate_volume_states = {
'volume_backend_name': 'infortrend_backend_1',
'vendor_name': 'Infortrend',
'driver_version': '99.99',
'storage_protocol': 'iSCSI',
'pool_name': 'LV-1',
'pool_id': fake_lv_id[1],
'total_capacity_gb': round(857982.0 / 1024, 2),
'free_capacity_gb': round(841978.0 / 1024, 2),
'reserved_percentage': 0,
'QoS_support': False,
'infortrend_provisioning': 'full',
}
test_migrate_host = {
'host': 'infortrend-server1@backend_1#LV-2',
'capabilities': test_migrate_volume_states,
}
test_migrate_volume_states_2 = {
'volume_backend_name': 'infortrend_backend_1',
'vendor_name': 'Infortrend',
'driver_version': '99.99',
'storage_protocol': 'iSCSI',
'pool_name': 'LV-1',
'pool_id': fake_lv_id[1],
'total_capacity_gb': round(857982.0 / 1024, 2),
'free_capacity_gb': round(841978.0 / 1024, 2),
'reserved_percentage': 0,
'QoS_support': False,
'infortrend_provisioning': 'full',
}
test_migrate_host_2 = {
'host': 'infortrend-server1@backend_1#LV-1',
'capabilities': test_migrate_volume_states_2,
}
fake_host = {
'host': 'infortrend-server1@backend_1',
'capabilities': {},
}
fake_volume_id = [test_volume['id'], test_dst_volume['id']]
fake_lookup_map = {
'12345678': {
'initiator_port_wwn_list':
[x.lower() for x in fake_initiator_wwpns],
'target_port_wwn_list':
[x.lower() for x in fake_target_wwpns[0:2]],
},
}
fake_lookup_map_r_model = {
'12345678': {
'initiator_port_wwn_list':
[x.lower() for x in fake_initiator_wwpns[:]],
'target_port_wwn_list':
[x.lower() for x in fake_target_wwpns[1:3]],
},
}
test_new_type = {
'name': 'type0',
'qos_specs_id': None,
'deleted': False,
'extra_specs': {'infortrend_provisioning': 'thin'},
'id': '28c8f82f-416e-148b-b1ae-2556c032d3c0',
}
test_diff = {'extra_specs': {'infortrend_provisioning': ('full', 'thin')}}
def get_fake_cli_failed(self):
return """
CLI: Failed
Return: 0x0001
CLI: No selected device
Return: 0x000c
"""
def get_fake_cli_failed_with_network(self):
return """
CLI: Failed
Return: 0x0001
CLI: No network
Return: 0x000b
"""
def get_fake_cli_succeed(self):
return """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
CLI: Successful: 0 mapping(s) shown
Return: 0x0000
"""
def get_test_show_empty_list(self):
return (0, [])
def get_test_show_snapshot(self, partition_id=None, snapshot_id=None):
if partition_id and snapshot_id:
return (0, [{
'Map': 'No',
'Partition-ID': partition_id,
'SI-ID': snapshot_id,
'Name': '---',
'Activated-time': 'Thu, Jan 09 01:33:11 2020',
'Index': '1',
}])
else:
return (0, [{
'Map': 'No',
'Partition-ID': self.fake_partition_id[0],
'SI-ID': self.fake_snapshot_id[0],
'Name': '---',
'Activated-time': 'Thu, Jan 09 01:33:11 2020',
'Index': '1',
}, {
'Map': 'No',
'Partition-ID': self.fake_partition_id[0],
'SI-ID': self.fake_snapshot_id[1],
'Name': '---',
'Activated-time': 'Thu, Jan 09 01:35:50 2020',
'Index': '2',
}])
def get_fake_show_snapshot(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
\/\/\/-
\
/
-
\
/
-
\/-\/- Index SI-ID Name Partition-ID Map Activated-time
---------------------------------------------------------------------------------
1 %s --- %s No Thu, Jan 09 01:33:11 2020
2 %s --- %s No Thu, Jan 09 01:35:50 2020
CLI: Successful: 2 snapshot image(s) shown
Return: 0x0000
"""
return msg % (self.fake_snapshot_id[0],
self.fake_partition_id[0],
self.fake_snapshot_id[1],
self.fake_partition_id[0])
def get_test_show_snapshot_detail_filled_block(self):
return (0, [{
'Mapped': 'Yes',
'Created-time': 'Wed, Jun 10 10:57:16 2015',
'ID': self.fake_snapshot_id[0],
'Last-modification-time': 'Wed, Jun 10 10:57:16 2015',
'Description': '---',
'Total-filled-block': '1',
'LV-ID': self.fake_lv_id[0],
'Activation-schedule-time': 'Not Actived',
'Mapping': 'CH:0/ID:0/LUN:1',
'Index': '1',
'Used': '0',
'Name': '---',
'Valid-filled-block': '0',
'Partition-ID': self.fake_partition_id[0],
}])
def get_test_show_snapshot_detail(self):
return (0, [{
'Mapped': 'Yes',
'Created-time': 'Wed, Jun 10 10:57:16 2015',
'ID': self.fake_snapshot_id[0],
'Last-modification-time': 'Wed, Jun 10 10:57:16 2015',
'Description': '---',
'Total-filled-block': '0',
'LV-ID': self.fake_lv_id[0],
'Activation-schedule-time': 'Not Actived',
'Mapping': 'CH:0/ID:0/LUN:1',
'Index': '1',
'Used': '0',
'Name': '---',
'Valid-filled-block': '0',
'Partition-ID': self.fake_partition_id[0],
}])
def get_fake_show_snapshot_detail(self):
msg = """
CLI: Successful: Device(UID:25090, Name:, Model:DS 1016RE) selected.
Return: 0x0000
ID: %s
Index: 1
Name: ---
Partition-ID: %s
LV-ID: %s
Created-time: Wed, Jun 10 10:57:16 2015
Last-modification-time: Wed, Jun 10 10:57:16 2015
Activation-schedule-time: Not Actived
Used: 0
Valid-filled-block: 0
Total-filled-block: 0
Description: ---
Mapped: Yes
Mapping: CH:0/ID:0/LUN:1
CLI: Successful: 1 snapshot image(s) shown
Return: 0x0000
"""
return msg % (self.fake_snapshot_id[0],
self.fake_partition_id[0],
self.fake_lv_id[0])
def get_test_show_net(self):
return (0, [{
'Slot': 'slotA',
'MAC': '10D02380DEEC',
'ID': '1',
'IPv4': self.fake_data_port_ip[0],
'Mode': 'Disabled',
'IPv6': '---',
}, {
'Slot': 'slotB',
'MAC': '10D02390DEEC',
'ID': '1',
'IPv4': self.fake_data_port_ip[1],
'Mode': 'Disabled',
'IPv6': '---',
}, {
'Slot': 'slotA',
'MAC': '10D02340DEEC',
'ID': '2',
'IPv4': self.fake_data_port_ip[2],
'Mode': 'Disabled',
'IPv6': '---',
}, {
'Slot': 'slotB',
'MAC': '10D02350DEEC',
'ID': '2',
'IPv4': self.fake_data_port_ip[3],
'Mode': 'Disabled',
'IPv6': '---',
}, {
'Slot': 'slotA',
'MAC': '10D02310DEEC',
'ID': '4',
'IPv4': self.fake_data_port_ip[4],
'Mode': 'Disabled',
'IPv6': '---',
}, {
'Slot': 'slotB',
'MAC': '10D02320DEEC',
'ID': '4',
'IPv4': self.fake_data_port_ip[5],
'Mode': 'Disabled',
'IPv6': '---',
}, {
'Slot': '---',
'MAC': '10D023077124',
'ID': '32',
'IPv4': '172.27.1.1',
'Mode': 'Disabled',
'IPv6': '---',
}])
def get_fake_show_net(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
ID MAC Mode IPv4 Mode IPv6 Slot
---------------------------------------------------------------
1 10D02380DEEC DHCP %s Disabled --- slotA
1 10D02390DEEC DHCP %s Disabled --- slotB
2 10D02340DEEC DHCP %s Disabled --- slotA
2 10D02350DEEC DHCP %s Disabled --- slotB
4 10D02310DEEC DHCP %s Disabled --- slotA
4 10D02320DEEC DHCP %s Disabled --- slotB
32 10D023077124 DHCP 172.27.1.1 Disabled --- ---
CLI: Successful: 2 record(s) found
Return: 0x0000
"""
return msg % (self.fake_data_port_ip[0], self.fake_data_port_ip[1],
self.fake_data_port_ip[2], self.fake_data_port_ip[3],
self.fake_data_port_ip[4], self.fake_data_port_ip[5])
def get_test_show_net_detail(self):
return (0, [{
'Slot': 'slotA',
'IPv4-mode': 'DHCP',
'ID': '1',
'IPv6-address': '---',
'Net-mask': '---',
'IPv4-address': '---',
'Route': '---',
'Gateway': '---',
'IPv6-mode': 'Disabled',
'MAC': '00D023877124',
'Prefix-length': '---',
}, {
'Slot': '---',
'IPv4-mode': 'DHCP',
'ID': '32',
'IPv6-address': '---',
'Net-mask': '255.255.240.0',
'IPv4-address': '172.27.112.245',
'Route': '---',
'Gateway': '172.27.127.254',
'IPv6-mode': 'Disabled',
'MAC': '00D023077124',
'Prefix-length': '---',
}])
def get_fake_show_net_detail(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
ID: 1
MAC: 00D023877124
IPv4-mode: DHCP
IPv4-address: ---
Net-mask: ---
Gateway: ---
IPv6-mode: Disabled
IPv6-address: ---
Prefix-length: ---
Route: ---
Slot: slotA
ID: 32
MAC: 00D023077124
IPv4-mode: DHCP
IPv4-address: 172.27.112.245
Net-mask: 255.255.240.0
Gateway: 172.27.127.254
IPv6-mode: Disabled
IPv6-address: ---
Prefix-length: ---
Route: ---
Slot: ---
CLI: Successful: 3 record(s) found
Return: 0x0000
"""
return msg
def get_test_show_partition(self, volume_id=None, pool_id=None):
result = [{
'ID': self.fake_partition_id[0],
'Used': '200',
'Name': self.fake_volume_id[0].replace('-', ''),
'Size': '200',
'Min-reserve': '200',
'LV-ID': self.fake_lv_id[0],
}, {
'ID': self.fake_partition_id[1],
'Used': '200',
'Name': self.fake_volume_id[1].replace('-', ''),
'Size': '200',
'Min-reserve': '200',
'LV-ID': self.fake_lv_id[0],
}]
if volume_id and pool_id:
result.append({
'ID': self.fake_partition_id[2],
'Used': '200',
'Name': volume_id,
'Size': '200',
'Min-reserve': '200',
'LV-ID': pool_id,
})
return (0, result)
def get_fake_show_partition(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
ID Name LV-ID Size Used Min-reserve
---------------------------------------------------
%s %s %s 200 200 200
%s %s %s 200 200 200
CLI: Successful: 3 partition(s) shown
Return: 0x0000
"""
return msg % (self.fake_partition_id[0],
self.fake_volume_id[0].replace('-', ''),
self.fake_lv_id[0],
self.fake_partition_id[1],
self.fake_volume_id[1].replace('-', ''),
self.fake_lv_id[0])
def get_test_show_partition_detail_for_map(
self, partition_id, mapped='true'):
result = [{
'LV-ID': self.fake_lv_id[0],
'Mapping': 'CH:1/ID:0/LUN:0, CH:1/ID:0/LUN:1',
'Used': '200',
'Size': '200',
'ID': partition_id,
'Progress': '---',
'Min-reserve': '200',
'Last-modification-time': 'Wed, Jan 08 20:23:23 2020',
'Valid-filled-block': '100',
'Name': self.fake_volume_id[0].replace('-', ''),
'Mapped': mapped,
'Total-filled-block': '100',
'Creation-time': 'Wed, Jan 08 20:23:23 2020',
}]
return (0, result)
def get_test_show_partition_detail(self, volume_id=None, pool_id=None):
result = [{
'LV-ID': self.fake_lv_id[0],
'Mapping': 'CH:1/ID:0/LUN:0, CH:1/ID:0/LUN:1, CH:4/ID:0/LUN:0',
'Used': '200',
'Size': '200',
'ID': self.fake_partition_id[0],
'Progress': '---',
'Min-reserve': '200',
'Last-modification-time': 'Wed, Jan 08 20:23:23 2020',
'Valid-filled-block': '100',
'Name': self.fake_volume_id[0].replace('-', ''),
'Mapped': 'true',
'Total-filled-block': '100',
'Creation-time': 'Wed, Jan 08 20:23:23 2020',
}, {
'LV-ID': self.fake_lv_id[0],
'Mapping': '---',
'Used': '200',
'Size': '200',
'ID': self.fake_partition_id[1],
'Progress': '---',
'Min-reserve': '200',
'Last-modification-time': 'Sat, Jan 11 22:18:40 2020',
'Valid-filled-block': '100',
'Name': self.fake_volume_id[1].replace('-', ''),
'Mapped': 'false',
'Total-filled-block': '100',
'Creation-time': 'Sat, Jan 11 22:18:40 2020',
}]
if volume_id and pool_id:
result.extend([{
'LV-ID': pool_id,
'Mapping': '---',
'Used': '200',
'Size': '200',
'ID': self.fake_partition_id[2],
'Progress': '---',
'Min-reserve': '200',
'Last-modification-time': 'Sat, Jan 15 22:18:40 2020',
'Valid-filled-block': '100',
'Name': volume_id,
'Mapped': 'false',
'Total-filled-block': '100',
'Creation-time': 'Sat, Jan 15 22:18:40 2020',
}, {
'LV-ID': '987654321',
'Mapping': '---',
'Used': '200',
'Size': '200',
'ID': '123123123123',
'Progress': '---',
'Min-reserve': '200',
'Last-modification-time': 'Sat, Jan 12 22:18:40 2020',
'Valid-filled-block': '100',
'Name': volume_id,
'Mapped': 'false',
'Total-filled-block': '100',
'Creation-time': 'Sat, Jan 15 22:18:40 2020',
}])
return (0, result)
def get_fake_show_partition_detail(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
ID: %s
Name: %s
LV-ID: %s
Size: 200
Used: 200
Min-reserve: 200
Creation-time: Wed, Jan 08 20:23:23 2020
Last-modification-time: Wed, Jan 08 20:23:23 2020
Valid-filled-block: 100
Total-filled-block: 100
Progress: ---
Mapped: true
Mapping: CH:1/ID:0/LUN:0, CH:1/ID:0/LUN:1, CH:4/ID:0/LUN:0
ID: %s
Name: %s
LV-ID: %s
Size: 200
Used: 200
Min-reserve: 200
Creation-time: Sat, Jan 11 22:18:40 2020
Last-modification-time: Sat, Jan 11 22:18:40 2020
Valid-filled-block: 100
Total-filled-block: 100
Progress: ---
Mapped: false
Mapping: ---
CLI: Successful: 3 partition(s) shown
Return: 0x0000
"""
return msg % (self.fake_partition_id[0],
self.fake_volume_id[0].replace('-', ''),
self.fake_lv_id[0],
self.fake_partition_id[1],
self.fake_volume_id[1].replace('-', ''),
self.fake_lv_id[0])
def get_test_show_replica_detail_for_migrate(
self, src_part_id, dst_part_id, volume_id, status='Completed'):
result = [{
'Pair-ID': self.fake_pair_id[0],
'Name': 'Cinder-Snapshot',
'Source-Device': 'DEEC',
'Source': src_part_id,
'Source-Type': 'LV-Partition',
'Source-Name': volume_id,
'Source-LV': '5DE94FF775D81C30',
'Source-VS': '2C482316298F7A4E',
'Source-Mapped': 'Yes',
'Target-Device': 'DEEC',
'Target': dst_part_id,
'Target-Type': 'LV-Partition',
'Target-Name': volume_id,
'Target-LV': '5DE94FF775D81C30',
'Target-VS': '033EA1FA4EA193EB',
'Target-Mapped': 'No',
'Type': 'Copy',
'Priority': 'Normal',
'Timeout': '---',
'Incremental': '---',
'Compression': '---',
'Status': status,
'Progress': '---',
'Created-time': '01/11/2020 22:20 PM',
'Sync-commence-time': '01/11/2020 22:20 PM',
'Split-time': '01/11/2020 22:20 PM',
'Completed-time': '01/11/2020 22:21 PM',
'Description': '---',
}]
return (0, result)
def get_test_show_replica_detail_for_si_sync_pair(self):
result = [{
'Pair-ID': self.fake_pair_id[0],
'Name': 'Cinder-Snapshot',
'Source-Device': 'DEEC',
'Source': self.fake_snapshot_id[0],
'Source-Type': 'LV-Partition',
'Source-Name': '',
'Source-LV': '5DE94FF775D81C30',
'Source-VS': '2C482316298F7A4E',
'Source-Mapped': 'Yes',
'Target-Device': 'DEEC',
'Target': self.fake_partition_id[1],
'Target-Type': 'LV-Partition',
'Target-Name': '',
'Target-LV': '5DE94FF775D81C30',
'Target-VS': '033EA1FA4EA193EB',
'Target-Mapped': 'No',
'Type': 'Copy',
'Priority': 'Normal',
'Timeout': '---',
'Incremental': '---',
'Compression': '---',
'Status': 'Copy',
'Progress': '---',
'Created-time': '01/11/2020 22:20 PM',
'Sync-commence-time': '01/11/2020 22:20 PM',
'Split-time': '01/11/2020 22:20 PM',
'Completed-time': '01/11/2020 22:21 PM',
'Description': '---',
}]
return (0, result)
def get_test_show_replica_detail_for_sync_pair(self):
result = [{
'Pair-ID': self.fake_pair_id[0],
'Name': 'Cinder-Snapshot',
'Source-Device': 'DEEC',
'Source': self.fake_partition_id[0],
'Source-Type': 'LV-Partition',
'Source-Name': self.fake_volume_id[0].replace('-', ''),
'Source-LV': '5DE94FF775D81C30',
'Source-VS': '2C482316298F7A4E',
'Source-Mapped': 'Yes',
'Target-Device': 'DEEC',
'Target': self.fake_partition_id[1],
'Target-Type': 'LV-Partition',
'Target-Name': self.fake_volume_id[1].replace('-', ''),
'Target-LV': '5DE94FF775D81C30',
'Target-VS': '033EA1FA4EA193EB',
'Target-Mapped': 'No',
'Type': 'Copy',
'Priority': 'Normal',
'Timeout': '---',
'Incremental': '---',
'Compression': '---',
'Status': 'Copy',
'Progress': '---',
'Created-time': '01/11/2020 22:20 PM',
'Sync-commence-time': '01/11/2020 22:20 PM',
'Split-time': '01/11/2020 22:20 PM',
'Completed-time': '01/11/2020 22:21 PM',
'Description': '---',
}]
return (0, result)
def get_test_show_replica_detail(self):
result = [{
'Pair-ID': '4BF246E26966F015',
'Name': 'Cinder-Snapshot',
'Source-Device': 'DEEC',
'Source': self.fake_partition_id[2],
'Source-Type': 'LV-Partition',
'Source-Name': 'Part-2',
'Source-LV': '5DE94FF775D81C30',
'Source-VS': '2C482316298F7A4E',
'Source-Mapped': 'No',
'Target-Device': 'DEEC',
'Target': self.fake_partition_id[3],
'Target-Type': 'LV-Partition',
'Target-Name': 'Part-1-Copy',
'Target-LV': '5DE94FF775D81C30',
'Target-VS': '714B80F0335F6E52',
'Target-Mapped': 'No',
'Type': 'Copy',
'Priority': 'Normal',
'Timeout': '---',
'Incremental': '---',
'Compression': '---',
'Status': 'Completed',
'Progress': '---',
'Created-time': '01/11/2020 22:20 PM',
'Sync-commence-time': '01/11/2020 22:20 PM',
'Split-time': '01/11/2020 22:20 PM',
'Completed-time': '01/11/2020 22:21 PM',
'Description': '---',
}, {
'Pair-ID': self.fake_pair_id[0],
'Name': 'Cinder-Migrate',
'Source-Device': 'DEEC',
'Source': self.fake_partition_id[0],
'Source-Type': 'LV-Partition',
'Source-Name': self.fake_volume_id[0].replace('-', ''),
'Source-LV': '5DE94FF775D81C30',
'Source-VS': '2C482316298F7A4E',
'Source-Mapped': 'Yes',
'Target-Device': 'DEEC',
'Target': self.fake_partition_id[1],
'Target-Type': 'LV-Partition',
'Target-Name': self.fake_volume_id[1].replace('-', ''),
'Target-LV': '5DE94FF775D81C30',
'Target-VS': '033EA1FA4EA193EB',
'Target-Mapped': 'No',
'Type': 'Mirror',
'Priority': 'Normal',
'Timeout': '---',
'Incremental': '---',
'Compression': '---',
'Status': 'Mirror',
'Progress': '---',
'Created-time': '01/11/2020 22:20 PM',
'Sync-commence-time': '01/11/2020 22:20 PM',
'Split-time': '01/11/2020 22:20 PM',
'Completed-time': '01/11/2020 22:21 PM',
'Description': '---',
}, {
'Pair-ID': self.fake_pair_id[1],
'Name': 'Cinder-Migrate',
'Source-Device': 'DEEC',
'Source': self.fake_partition_id[4],
'Source-Type': 'LV-Partition',
'Source-Name': self.fake_volume_id[0].replace('-', ''),
'Source-LV': '5DE94FF775D81C30',
'Source-VS': '2C482316298F7A4E',
'Source-Mapped': 'No',
'Target-Device': 'DEEC',
'Target': self.fake_partition_id[5],
'Target-Type': 'LV-Partition',
'Target-Name': self.fake_volume_id[1].replace('-', ''),
'Target-LV': '5DE94FF775D81C30',
'Target-VS': '714B80F0335F6E52',
'Target-Mapped': 'Yes',
'Type': 'Mirror',
'Priority': 'Normal',
'Timeout': '---',
'Incremental': '---',
'Compression': '---',
'Status': 'Mirror',
'Progress': '---',
'Created-time': '01/11/2020 22:20 PM',
'Sync-commence-time': '01/11/2020 22:20 PM',
'Split-time': '01/11/2020 22:20 PM',
'Completed-time': '01/11/2020 22:21 PM',
'Description': '---',
}]
return (0, result)
def get_fake_show_replica_detail(self):
msg = """
CLI: Successful: Device(UID:deec, Name:, Model:DS S16F-R2852-6) selected.
Return: 0x0000
Pair-ID: 4BF246E26966F015
Name: Cinder-Snapshot
Source-Device: DEEC
Source: %s
Source-Type: LV-Partition
Source-Name: Part-2
Source-LV: 5DE94FF775D81C30
Source-VS: 2C482316298F7A4E
Source-Mapped: No
Target-Device: DEEC
Target: %s
Target-Type: LV-Partition
Target-Name: Part-1-Copy
Target-LV: 5DE94FF775D81C30
Target-VS: 714B80F0335F6E52
Target-Mapped: No
Type: Copy
Priority: Normal
Timeout: ---
Incremental: ---
Compression: ---
Status: Completed
Progress: ---
Created-time: 01/11/2020 22:20 PM
Sync-commence-time: 01/11/2020 22:20 PM
Split-time: 01/11/2020 22:20 PM
Completed-time: 01/11/2020 22:21 PM
Description: ---
Pair-ID: %s
Name: Cinder-Migrate
Source-Device: DEEC
Source: %s
Source-Type: LV-Partition
Source-Name: %s
Source-LV: 5DE94FF775D81C30
Source-VS: 2C482316298F7A4E
Source-Mapped: Yes
Target-Device: DEEC
Target: %s
Target-Type: LV-Partition
Target-Name: %s
Target-LV: 5DE94FF775D81C30
Target-VS: 033EA1FA4EA193EB
Target-Mapped: No
Type: Mirror
Priority: Normal
Timeout: ---
Incremental: ---
Compression: ---
Status: Mirror
Progress: ---
Created-time: 01/11/2020 22:20 PM
Sync-commence-time: 01/11/2020 22:20 PM
Split-time: 01/11/2020 22:20 PM
Completed-time: 01/11/2020 22:21 PM
Description: ---
Pair-ID: %s
Name: Cinder-Migrate
Source-Device: DEEC
Source: %s
Source-Type: LV-Partition
Source-Name: %s
Source-LV: 5DE94FF775D81C30
Source-VS: 2C482316298F7A4E
Source-Mapped: No
Target-Device: DEEC
Target: %s
Target-Type: LV-Partition
Target-Name: %s
Target-LV: 5DE94FF775D81C30
Target-VS: 714B80F0335F6E52
Target-Mapped: Yes
Type: Mirror
Priority: Normal
Timeout: ---
Incremental: ---
Compression: ---
Status: Mirror
Progress: ---
Created-time: 01/11/2020 22:20 PM
Sync-commence-time: 01/11/2020 22:20 PM
Split-time: 01/11/2020 22:20 PM
Completed-time: 01/11/2020 22:21 PM
Description: ---
CLI: Successful: 3 replication job(s) shown
Return: 0x0000
"""
return msg % (self.fake_partition_id[2],
self.fake_partition_id[3],
self.fake_pair_id[0],
self.fake_partition_id[0],
self.fake_volume_id[0].replace('-', ''),
self.fake_partition_id[1],
self.fake_volume_id[1].replace('-', ''),
self.fake_pair_id[1],
self.fake_partition_id[4],
self.fake_volume_id[0].replace('-', ''),
self.fake_partition_id[5],
self.fake_volume_id[1].replace('-', ''))
def get_test_show_lv(self):
return (0, [{
'Name': 'LV-1',
'LD-amount': '1',
'Available': '841978 MB',
'ID': self.fake_lv_id[0],
'Progress': '---',
'Size': '857982 MB',
'Status': 'On-line',
}])
def get_fake_show_lv(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
ID Name LD-amount Size Available Progress Status
--------------------------------------------------------------
%s LV-1 1 857982 MB 841978 MB --- On-line
CLI: Successful: 1 Logical Volumes(s) shown
Return: 0x0000
"""
return msg % self.fake_lv_id[0]
def get_test_show_lv_detail(self):
return (0, [{
'Policy': 'Default',
'Status': 'On-line',
'ID': self.fake_lv_id[0],
'Available': '841978 MB',
'Expandable-size': '0 MB',
'Name': 'LV-1',
'Size': '857982 MB',
'LD-amount': '1',
'Progress': '---',
}])
def get_fake_show_lv_detail(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
ID: %s
Name: LV-1
LD-amount: 1
Size: 857982 MB
Available: 841978 MB
Expandable-size: 0 MB
Policy: Default
Progress: ---
Status: On-line
CLI: Successful: 1 Logical Volumes(s) shown
Return: 0x0000
"""
return msg % self.fake_lv_id[0]
def get_test_show_lv_tier_for_migration(self):
return (0, [{
'LV-Name': 'TierLV',
'LV-ID': self.fake_lv_id[1],
'Tier': '0',
'Size': '418.93 GB',
'Used': '10 GB(2.4%)',
'Data Service': '0 MB(0.0%)',
'Reserved Ratio': '10.0%',
}, {
'LV-Name': 'TierLV',
'LV-ID': self.fake_lv_id[1],
'Tier': '3',
'Size': '931.02 GB',
'Used': '0 MB(0.0%)',
'Data Service': '0 MB(0.0%)',
'Reserved Ratio': '0.0%',
}])
def get_test_show_lv_tier(self):
return (0, [{
'LV-Name': 'TierLV',
'LV-ID': self.fake_lv_id[0],
'Tier': '0',
'Size': '418.93 GB',
'Used': '10 GB(2.4%)',
'Data Service': '0 MB(0.0%)',
'Reserved Ratio': '10.0%',
}, {
'LV-Name': 'TierLV',
'LV-ID': self.fake_lv_id[0],
'Tier': '3',
'Size': '931.02 GB',
'Used': '0 MB(0.0%)',
'Data Service': '0 MB(0.0%)',
'Reserved Ratio': '0.0%',
}])
def get_fake_show_lv_tier(self):
msg = """
CLI: Successful: Device(UID:deec, Name:, Model:DS S16F-R2852-6) selected.
Return: 0x0000
LV-Name LV-ID Tier Size Used Data Service Reserved Ratio
------------------------------------------------------------------------------
TierLV %s 0 418.93 GB 10 GB(2.4%%) 0 MB(0.0%%) 10.0%%
TierLV %s 3 931.02 GB 0 MB(0.0%%) 0 MB(0.0%%) 0.0%%
CLI: Successful: 2 lv tiering(s) shown
Return: 0x0000
"""
return msg % (self.fake_lv_id[0],
self.fake_lv_id[0])
def get_test_show_device(self):
return (0, [{
'ID': self.fake_system_id[0],
'Connected-IP': self.fake_manage_port_ip[0],
'Name': '---',
'Index': '0*',
'JBOD-ID': 'N/A',
'Capacity': '1.22 TB',
'Model': self.fake_model[0],
'Service-ID': '8445676',
}])
def get_fake_show_device(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
Index ID Model Name Connected-IP JBOD-ID Capacity Service-ID
------------------------------------------------------------------------
0* %s %s --- %s N/A 1.22 TB 8445676
CLI: Successful: 1 device(s) found
Return: 0x0000
"""
return msg % (self.fake_system_id[0],
self.fake_model[0],
self.fake_manage_port_ip[0])
def get_test_show_channel_single(self):
return (0, [{
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '0',
'MCS': 'N/A',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '1',
'MCS': '0',
'curClock': '---',
}])
def get_test_show_channel_with_mcs(self):
return (0, [{
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '0',
'MCS': 'N/A',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '1',
'MCS': '1',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '2',
'MCS': '1',
'curClock': '---',
}, {
'ID': '---',
'defClock': '6.0 Gbps',
'Type': 'SAS',
'Mode': 'Drive',
'Width': 'SAS',
'Ch': '3',
'MCS': 'N/A',
'curClock': '6.0 Gbps',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '4',
'MCS': '2',
'curClock': '---',
}, {
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '5',
'MCS': 'N/A',
'curClock': '---',
}])
def get_test_show_channel_without_mcs(self):
return (0, [{
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '0',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '1',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '2',
'curClock': '---',
}, {
'ID': '---',
'defClock': '6.0 Gbps',
'Type': 'SAS',
'Mode': 'Drive',
'Width': 'SAS',
'Ch': '3',
'curClock': '6.0 Gbps',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '4',
'curClock': '---',
}, {
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '5',
'curClock': '---',
}])
def get_test_show_channel_with_diff_target_id(self):
return (0, [{
'ID': '32',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '0',
'MCS': 'N/A',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '1',
'MCS': '0',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '2',
'MCS': '1',
'curClock': '---',
}, {
'ID': '---',
'defClock': '6.0 Gbps',
'Type': 'SAS',
'Mode': 'Drive',
'Width': 'SAS',
'Ch': '3',
'MCS': 'N/A',
'curClock': '6.0 Gbps',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '4',
'MCS': '2',
'curClock': '---',
}, {
'ID': '48',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '5',
'MCS': 'N/A',
'curClock': '---',
}])
def get_test_show_channel(self):
return (0, [{
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '0',
'MCS': 'N/A',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '1',
'MCS': '0',
'curClock': '---',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '2',
'MCS': '1',
'curClock': '---',
}, {
'ID': '---',
'defClock': '6.0 Gbps',
'Type': 'SAS',
'Mode': 'Drive',
'Width': 'SAS',
'Ch': '3',
'MCS': 'N/A',
'curClock': '6.0 Gbps',
}, {
'ID': '0',
'defClock': 'Auto',
'Type': 'NETWORK',
'Mode': 'Host',
'Width': 'iSCSI',
'Ch': '4',
'MCS': '2',
'curClock': '---',
}, {
'ID': '112',
'defClock': 'Auto',
'Type': 'FIBRE',
'Mode': 'Host',
'Width': '---',
'Ch': '5',
'MCS': 'N/A',
'curClock': '---',
}])
def get_fake_show_channel(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
Ch Mode Type defClock curClock Width ID MCS
---------------------------------------------------------
0 Host FIBRE Auto --- --- 112 N/A
1 Host NETWORK Auto --- iSCSI 0 0
2 Host NETWORK Auto --- iSCSI 0 1
3 Drive SAS 6.0 Gbps 6.0 Gbps SAS --- N/A
4 Host NETWORK Auto --- iSCSI 0 2
5 Host FIBRE Auto --- --- 112 N/A
CLI: Successful: : 6 channel(s) shown
Return: 0x0000
"""
return msg
def get_test_show_channel_r_model_diff_target_id(self):
return (0, [{
'Mode': 'Host',
'AID': '32',
'defClock': 'Auto',
'MCS': 'N/A',
'Ch': '0',
'BID': '33',
'curClock': '---',
'Width': '---',
'Type': 'FIBRE',
}, {
'Mode': 'Host',
'AID': '0',
'defClock': 'Auto',
'MCS': '0',
'Ch': '1',
'BID': '1',
'curClock': '---',
'Width': 'iSCSI',
'Type': 'NETWORK',
}, {
'Mode': 'Host',
'AID': '0',
'defClock': 'Auto',
'MCS': '1',
'Ch': '2',
'BID': '1',
'curClock': '---',
'Width': 'iSCSI',
'Type': 'NETWORK',
}, {
'Mode': 'Drive',
'AID': '---',
'defClock': '6.0 Gbps',
'MCS': 'N/A',
'Ch': '3',
'BID': '---',
'curClock': '6.0 Gbps',
'Width': 'SAS',
'Type': 'SAS',
}, {
'Mode': 'Host',
'AID': '0',
'defClock': 'Auto',
'MCS': '2',
'Ch': '4',
'BID': '1',
'curClock': '---',
'Width': 'iSCSI',
'Type': 'NETWORK',
}, {
'Mode': 'Host',
'AID': '48',
'defClock': 'Auto',
'MCS': 'N/A',
'Ch': '5',
'BID': '49',
'curClock': '---',
'Width': '---',
'Type': 'FIBRE',
}])
def get_test_show_channel_r_model(self):
return (0, [{
'Mode': 'Host',
'AID': '112',
'defClock': 'Auto',
'MCS': 'N/A',
'Ch': '0',
'BID': '113',
'curClock': '---',
'Width': '---',
'Type': 'FIBRE',
}, {
'Mode': 'Host',
'AID': '0',
'defClock': 'Auto',
'MCS': '0',
'Ch': '1',
'BID': '1',
'curClock': '---',
'Width': 'iSCSI',
'Type': 'NETWORK',
}, {
'Mode': 'Host',
'AID': '0',
'defClock': 'Auto',
'MCS': '1',
'Ch': '2',
'BID': '1',
'curClock': '---',
'Width': 'iSCSI',
'Type': 'NETWORK',
}, {
'Mode': 'Drive',
'AID': '---',
'defClock': '6.0 Gbps',
'MCS': 'N/A',
'Ch': '3',
'BID': '---',
'curClock': '6.0 Gbps',
'Width': 'SAS',
'Type': 'SAS',
}, {
'Mode': 'Host',
'AID': '0',
'defClock': 'Auto',
'MCS': '2',
'Ch': '4',
'BID': '1',
'curClock': '---',
'Width': 'iSCSI',
'Type': 'NETWORK',
}, {
'Mode': 'Host',
'AID': '112',
'defClock': 'Auto',
'MCS': 'N/A',
'Ch': '5',
'BID': '113',
'curClock': '---',
'Width': '---',
'Type': 'FIBRE',
}])
def get_fake_show_channel_r_model(self):
msg = """
CLI: Successful: Device(UID:deec, Name:, Model:DS S16F-R2852-6) selected.
Return: 0x0000
Ch Mode Type defClock curClock Width AID BID MCS
----------------------------------------------------------------
0 Host FIBRE Auto --- --- 112 113 N/A
1 Host NETWORK Auto --- iSCSI 0 1 0
2 Host NETWORK Auto --- iSCSI 0 1 1
3 Drive SAS 6.0 Gbps 6.0 Gbps SAS --- --- N/A
4 Host NETWORK Auto --- iSCSI 0 1 2
5 Host FIBRE Auto --- --- 112 113 N/A
CLI: Successful: : 9 channel(s) shown
Return: 0x0000
"""
return msg
def get_show_map_with_lun_map_on_zoning(self):
return (0, [{
'Ch': '0',
'LUN': '0',
'Media': 'PART',
'Host-ID': self.fake_initiator_wwpns[0],
'Target': '112',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}])
def get_test_show_map(self, partition_id=None, channel_id=None):
if partition_id and channel_id:
return (0, [{
'Ch': channel_id,
'LUN': '0',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': partition_id,
}, {
'Ch': channel_id,
'LUN': '1',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': partition_id,
}])
else:
return (0, [{
'Ch': '1',
'LUN': '0',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}, {
'Ch': '1',
'LUN': '1',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}, {
'Ch': '4',
'LUN': '0',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}])
def get_test_show_map_multimap(self):
return (0, [{
'Ch': '1',
'LUN': '0',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}, {
'Ch': '1',
'LUN': '1',
'Media': 'PART',
'Host-ID': '---',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}, {
'Ch': '4',
'LUN': '0',
'Media': 'PART',
'Host-ID': '210000E08B0AADE1',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}, {
'Ch': '4',
'LUN': '0',
'Media': 'PART',
'Host-ID': '210000E08B0AADE2',
'Target': '0',
'Name': 'Part-1',
'ID': self.fake_partition_id[0],
}])
def get_fake_show_map(self):
msg = """
CLI: Successful: Device(UID:77124, Name:, Model:DS S12F-G2852-6) selected.
Return: 0x0000
Ch Target LUN Media Name ID Host-ID
-----------------------------------------------------------
1 0 0 PART Part-1 %s ---
1 0 1 PART Part-1 %s ---
4 0 0 PART Part-1 %s ---
CLI: Successful: 3 mapping(s) shown
Return: 0x0000
"""
return msg % (self.fake_partition_id[0],
self.fake_partition_id[0],
self.fake_partition_id[0])
def get_test_show_license(self):
return (0, {
'Local Volume Copy': {
'Support': False,
'Amount': '8/256',
},
'Synchronous Remote Mirror': {
'Support': False,
'Amount': '8/256',
},
'Snapshot': {
'Support': False,
'Amount': '1024/16384',
},
'Self-Encryption Drives': {
'Support': False,
'Amount': '---',
},
'Compression': {
'Support': False,
'Amount': '---',
},
'Local volume Mirror': {
'Support': False,
'Amount': '8/256',
},
'Storage Tiering': {
'Support': False,
'Amount': '---',
},
'Asynchronous Remote Mirror': {
'Support': False,
'Amount': '8/256',
},
'Scale-out': {
'Support': False,
'Amount': 'Not Support',
},
'Thin Provisioning': {
'Support': False,
'Amount': '---',
},
'Max JBOD': {
'Support': False,
'Amount': '15',
},
'EonPath': {
'Support': False,
'Amount': '---',
}
})
def get_fake_show_license(self):
msg = """
CLI: Successful: Device(UID:deec, Name:, Model:DS S16F-R2852-6) selected.
Return: 0x0000
License Amount(Partition/Subsystem) Expired
------------------------------------------------------------------
EonPath --- Expired
Scale-out Not Support ---
Snapshot 1024/16384 Expired
Local Volume Copy 8/256 Expired
Local volume Mirror 8/256 Expired
Synchronous Remote Mirror 8/256 Expired
Asynchronous Remote Mirror 8/256 Expired
Compression --- Expired
Thin Provisioning --- Expired
Storage Tiering --- Expired
Max JBOD 15 Expired
Self-Encryption Drives --- Expired
CLI: Successful
Return: 0x0000
"""
return msg
def get_test_show_wwn_with_g_model(self):
return (0, [{
'ID': 'ID:112',
'WWPN': self.fake_target_wwpns[0],
'CH': '0',
'WWNN': self.fake_target_wwnns[0],
}, {
'ID': 'ID:112',
'WWPN': self.fake_target_wwpns[1],
'CH': '5',
'WWNN': self.fake_target_wwnns[0],
}])
def get_test_show_wwn_with_diff_target_id(self):
return (0, [{
'ID': 'AID:32',
'WWPN': self.fake_target_wwpns[0],
'CH': '0',
'WWNN': self.fake_target_wwnns[0],
}, {
'ID': 'BID:33',
'WWPN': self.fake_target_wwpns[2],
'CH': '0',
'WWNN': self.fake_target_wwnns[1],
}, {
'ID': 'AID:48',
'WWPN': self.fake_target_wwpns[1],
'CH': '5',
'WWNN': self.fake_target_wwnns[0],
}, {
'ID': 'BID:49',
'WWPN': self.fake_target_wwpns[3],
'CH': '5',
'WWNN': self.fake_target_wwnns[1],
}])
def get_test_show_wwn(self):
return (0, [{
'ID': 'AID:112',
'WWPN': self.fake_target_wwpns[0],
'CH': '0',
'WWNN': self.fake_target_wwnns[0],
}, {
'ID': 'BID:113',
'WWPN': self.fake_target_wwpns[2],
'CH': '0',
'WWNN': self.fake_target_wwnns[1],
}, {
'ID': 'AID:112',
'WWPN': self.fake_target_wwpns[1],
'CH': '5',
'WWNN': self.fake_target_wwnns[0],
}, {
'ID': 'BID:113',
'WWPN': self.fake_target_wwpns[3],
'CH': '5',
'WWNN': self.fake_target_wwnns[1],
}])
def get_fake_show_wwn(self):
msg = """
CLI: Successful: Device(UID:deec, Name:, Model:DS S16F-R2852-6) selected.
Return: 0x0000
WWN entries in controller for host channels:
CH ID WWNN WWPN
-------------------------------------------------
0 AID:112 %s %s
0 BID:113 %s %s
5 AID:112 %s %s
5 BID:113 %s %s
CLI: Successful
Return: 0x0000
"""
return msg % (self.fake_target_wwnns[0], self.fake_target_wwpns[0],
self.fake_target_wwnns[1], self.fake_target_wwpns[2],
self.fake_target_wwnns[0], self.fake_target_wwpns[1],
self.fake_target_wwnns[1], self.fake_target_wwpns[3])
def get_test_show_iqn(self):
return (0, [{
'Name': self.fake_initiator_iqn[0][-16:],
'IQN': self.fake_initiator_iqn[0],
'User': '---',
'Password': '---',
'Target': '---',
'Target-Password': '---',
'IP': '0.0.0.0',
'Mask': '0.0.0.0',
}])
def get_fake_show_iqn(self):
msg = """
CLI: Successful: Device(UID:deec, Name:, Model:DS S16F-R2852-6) selected.
Return: 0x0000
Detected host IQN:
IQN
----------------------------------------
%s
List of initiator IQN(s):
--------------------------
Name: %s
IQN: %s
User: ---
Password: ---
Target: ---
Target-Password: ---
IP: 0.0.0.0
Mask: 0.0.0.0
CLI: Successful: 1 initiator iqn(s) shown
Return: 0x0000
"""
return msg % (self.fake_initiator_iqn[0],
self.fake_initiator_iqn[0][-16:],
self.fake_initiator_iqn[0])
def get_fake_discovery(self, target_iqns, target_portals):
template = '%s,1 %s'
if len(target_iqns) == 1:
result = template % (target_portals[0], target_iqns[0])
return (0, result)
result = []
for i in range(len(target_iqns)):
result.append(template % (
target_portals[i], target_iqns[i]))
return (0, '\n'.join(result))
class InfortrendCLITestCase(test.TestCase):
CommandList = ['CreateLD', 'CreateLV',
'CreatePartition', 'DeletePartition', 'SetPartition',
'CreateMap', 'DeleteMap',
'CreateSnapshot', 'DeleteSnapshot',
'CreateReplica', 'DeleteReplica',
'CreateIQN', 'DeleteIQN',
'ShowLD', 'ShowLV',
'ShowPartition', 'ShowSnapshot',
'ShowDevice', 'ShowChannel',
'ShowDisk', 'ShowMap',
'ShowNet', 'ShowLicense',
'ShowWWN', 'ShowReplica',
'ShowIQN']
def __init__(self, *args, **kwargs):
super(InfortrendCLITestCase, self).__init__(*args, **kwargs)
self.cli_data = InfortrendCLITestData()
def setUp(self):
super(InfortrendCLITestCase, self).setUp()
def _cli_set(self, cli, fake_result):
cli_conf = {
'path': '',
'password': '',
'ip': '',
'cli_retry_time': 1,
}
cli = cli(cli_conf)
cli._execute = mock.Mock(return_value=fake_result)
return cli
def _cli_multi_set(self, cli, fake_result_list):
cli_conf = {
'path': '',
'password': '',
'ip': '',
'cli_retry_time': 5,
}
cli = cli(cli_conf)
cli._execute = mock.Mock(side_effect=fake_result_list)
return cli
def _test_command_succeed(self, command):
fake_cli_succeed = self.cli_data.get_fake_cli_succeed()
test_command = self._cli_set(command, fake_cli_succeed)
rc, out = test_command.execute()
self.assertEqual(0, rc)
def _test_command_failed(self, command):
fake_cli_failed = self.cli_data.get_fake_cli_failed()
test_command = self._cli_set(command, fake_cli_failed)
rc, out = test_command.execute()
self.assertEqual(int('0x000c', 16), rc)
def _test_command_failed_retry_succeed(self, log_error, command):
log_error.reset_mock()
LOG_ERROR_STR = (
'Retry %(retry)s times: %(method)s Failed %(rc)s: %(reason)s'
)
fake_result_list = [
self.cli_data.get_fake_cli_failed(),
self.cli_data.get_fake_cli_failed_with_network(),
self.cli_data.get_fake_cli_succeed(),
]
test_command = self._cli_multi_set(command, fake_result_list)
rc, out = test_command.execute()
self.assertEqual(0, rc)
expect_log_error = [
mock.call(LOG_ERROR_STR, {
'retry': 1,
'method': test_command.__class__.__name__,
'rc': int('0x000c', 16),
'reason': 'No selected device',
}),
mock.call(LOG_ERROR_STR, {
'retry': 2,
'method': test_command.__class__.__name__,
'rc': int('0x000b', 16),
'reason': 'No network',
})
]
log_error.assert_has_calls(expect_log_error)
def _test_command_failed_retry_timeout(self, log_error, command):
log_error.reset_mock()
LOG_ERROR_STR = (
'Retry %(retry)s times: %(method)s Failed %(rc)s: %(reason)s'
)
fake_result_list = [
self.cli_data.get_fake_cli_failed(),
self.cli_data.get_fake_cli_failed_with_network(),
self.cli_data.get_fake_cli_failed_with_network(),
self.cli_data.get_fake_cli_failed(),
self.cli_data.get_fake_cli_failed_with_network(),
]
test_command = self._cli_multi_set(command, fake_result_list)
rc, out = test_command.execute()
self.assertEqual(int('0x000b', 16), rc)
self.assertEqual('No network', out)
expect_log_error = [
mock.call(LOG_ERROR_STR, {
'retry': 1,
'method': test_command.__class__.__name__,
'rc': int('0x000c', 16),
'reason': 'No selected device',
}),
mock.call(LOG_ERROR_STR, {
'retry': 2,
'method': test_command.__class__.__name__,
'rc': int('0x000b', 16),
'reason': 'No network',
}),
mock.call(LOG_ERROR_STR, {
'retry': 3,
'method': test_command.__class__.__name__,
'rc': int('0x000b', 16),
'reason': 'No network',
}),
mock.call(LOG_ERROR_STR, {
'retry': 4,
'method': test_command.__class__.__name__,
'rc': int('0x000c', 16),
'reason': 'No selected device',
}),
mock.call(LOG_ERROR_STR, {
'retry': 5,
'method': test_command.__class__.__name__,
'rc': int('0x000b', 16),
'reason': 'No network',
})
]
log_error.assert_has_calls(expect_log_error)
def _test_show_command(self, fake_data, test_data, command, *params):
test_command = self._cli_set(command, fake_data)
rc, out = test_command.execute(*params)
self.assertEqual(test_data[0], rc)
if isinstance(out, list):
for i in range(len(test_data[1])):
self.assertDictMatch(test_data[1][i], out[i])
else:
self.assertDictMatch(test_data[1], out)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_cli_all_command_execute(self):
for command in self.CommandList:
self._test_command_succeed(getattr(cli, command))
self._test_command_failed(getattr(cli, command))
@mock.patch.object(cli.LOG, 'error')
def test_cli_all_command_execute_retry_succeed(self, log_error):
for command in self.CommandList:
self._test_command_failed_retry_succeed(
log_error, getattr(cli, command))
@mock.patch.object(cli.LOG, 'error')
def test_cli_all_command_execute_retry_timeout(self, log_error):
for command in self.CommandList:
self._test_command_failed_retry_timeout(
log_error, getattr(cli, command))
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_snapshot(self):
self._test_show_command(
self.cli_data.get_fake_show_snapshot(),
self.cli_data.get_test_show_snapshot(),
cli.ShowSnapshot)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_snapshot_detail(self):
self._test_show_command(
self.cli_data.get_fake_show_snapshot_detail(),
self.cli_data.get_test_show_snapshot_detail(),
cli.ShowSnapshot, '-l')
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_net(self):
self._test_show_command(
self.cli_data.get_fake_show_net(),
self.cli_data.get_test_show_net(),
cli.ShowNet)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_detail_net(self):
self._test_show_command(
self.cli_data.get_fake_show_net_detail(),
self.cli_data.get_test_show_net_detail(),
cli.ShowNet, '-l')
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_partition(self):
self._test_show_command(
self.cli_data.get_fake_show_partition(),
self.cli_data.get_test_show_partition(),
cli.ShowPartition)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_partition_detail(self):
self._test_show_command(
self.cli_data.get_fake_show_partition_detail(),
self.cli_data.get_test_show_partition_detail(),
cli.ShowPartition, '-l')
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_lv(self):
self._test_show_command(
self.cli_data.get_fake_show_lv(),
self.cli_data.get_test_show_lv(),
cli.ShowLV)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_lv_detail(self):
self._test_show_command(
self.cli_data.get_fake_show_lv_detail(),
self.cli_data.get_test_show_lv_detail(),
cli.ShowLV, '-l')
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_lv_tier(self):
self._test_show_command(
self.cli_data.get_fake_show_lv_tier(),
self.cli_data.get_test_show_lv_tier(),
cli.ShowLV, 'tier')
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_device(self):
self._test_show_command(
self.cli_data.get_fake_show_device(),
self.cli_data.get_test_show_device(),
cli.ShowDevice)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_channel(self):
self._test_show_command(
self.cli_data.get_fake_show_channel(),
self.cli_data.get_test_show_channel(),
cli.ShowChannel)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_channel_with_r_model(self):
self._test_show_command(
self.cli_data.get_fake_show_channel_r_model(),
self.cli_data.get_test_show_channel_r_model(),
cli.ShowChannel)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_map(self):
self._test_show_command(
self.cli_data.get_fake_show_map(),
self.cli_data.get_test_show_map(),
cli.ShowMap)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_license(self):
self._test_show_command(
self.cli_data.get_fake_show_license(),
self.cli_data.get_test_show_license(),
cli.ShowLicense)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_replica_detail(self):
self._test_show_command(
self.cli_data.get_fake_show_replica_detail(),
self.cli_data.get_test_show_replica_detail(),
cli.ShowReplica, '-l')
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_wwn(self):
self._test_show_command(
self.cli_data.get_fake_show_wwn(),
self.cli_data.get_test_show_wwn(),
cli.ShowWWN)
@mock.patch.object(cli.LOG, 'debug', mock.Mock())
def test_show_iqn(self):
self._test_show_command(
self.cli_data.get_fake_show_iqn(),
self.cli_data.get_test_show_iqn(),
cli.ShowIQN)