cinder/cinder/tests/unit/volume/drivers/netapp/eseries/fakes.py

1341 lines
43 KiB
Python

# Copyright (c) - 2015, Alex Meade
# Copyright (c) - 2015, Yogesh Kshirsagar
# Copyright (c) - 2015, Michael Price
# 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 copy
import json
import mock
from cinder.tests.unit import fake_constants as fake
from cinder.volume import configuration as conf
from cinder.volume.drivers.netapp.eseries import utils
import cinder.volume.drivers.netapp.options as na_opts
import cinder.volume.drivers.netapp.utils as na_utils
FAKE_CINDER_VOLUME = {
'id': fake.volume_id,
'size': 1,
'volume_name': 'lun1',
'host': 'hostname@backend#DDP',
'os_type': 'linux',
'provider_location': 'lun1',
'name_id': fake.volume2_id,
'provider_auth': 'provider a b',
'project_id': fake.project_id,
'display_name': None,
'display_description': 'lun1',
'volume_type_id': None,
'migration_status': None,
'attach_status': "detached"
}
FAKE_CINDER_SNAPSHOT = {
'id': fake.snapshot_id,
'volume': FAKE_CINDER_VOLUME,
'provider_id': '3400000060080E500023BB3400631F335294A5A8',
}
FAKE_CINDER_CG = {
'id': fake.consistency_group_id,
}
FAKE_CINDER_CG_SNAPSHOT = {
'id': fake.cgsnapshot_id,
'consistencygroup_id': FAKE_CINDER_CG['id'],
}
MULTIATTACH_HOST_GROUP = {
'clusterRef': '8500000060080E500023C7340036035F515B78FC',
'label': utils.MULTI_ATTACH_HOST_GROUP_NAME,
}
FOREIGN_HOST_GROUP = {
'clusterRef': '8500000060080E500023C7340036035F515B78FD',
'label': 'FOREIGN HOST GROUP',
}
HOST_GROUPS = [MULTIATTACH_HOST_GROUP, FOREIGN_HOST_GROUP]
SSC_POOLS = [
{
"poolId": "0400000060080E5000290D8000009C9955828DD2",
"name": "DDP",
"pool": {
"sequenceNum": 2,
"offline": False,
"raidLevel": "raidDiskPool",
"worldWideName": "60080E5000290D8000009C9955828DD2",
"volumeGroupRef": "0400000060080E5000290D8000009C9955828DD2",
"reserved1": "000000000000000000000000",
"reserved2": "",
"trayLossProtection": False,
"label": "DDP",
"state": "complete",
"spindleSpeedMatch": True,
"spindleSpeed": 7200,
"isInaccessible": False,
"securityType": "none",
"drawerLossProtection": True,
"protectionInformationCapable": False,
"protectionInformationCapabilities": {
"protectionInformationCapable": True,
"protectionType": "type2Protection"
},
"volumeGroupData": {
"type": "diskPool",
"diskPoolData": {
"reconstructionReservedDriveCount": 1,
"reconstructionReservedAmt": "2992518463488",
"reconstructionReservedDriveCountCurrent": 1,
"poolUtilizationWarningThreshold": 100,
"poolUtilizationCriticalThreshold": 100,
"poolUtilizationState": "utilizationOptimal",
"unusableCapacity": "0",
"degradedReconstructPriority": "high",
"criticalReconstructPriority": "highest",
"backgroundOperationPriority": "low",
"allocGranularity": "4294967296"
}
},
"usage": "standard",
"driveBlockFormat": "allNative",
"reservedSpaceAllocated": True,
"usedSpace": "13653701033984",
"totalRaidedSpace": "23459111370752",
"extents": [
{
"sectorOffset": "0",
"rawCapacity": "9805410336768",
"raidLevel": "raidDiskPool",
"volumeGroupRef":
"0400000060080E5000290D8000009C9955828DD2",
"freeExtentRef":
"0301000060080E5000290D8000009C9955828DD2",
"reserved1": "000000000000000000000000",
"reserved2": ""
}
],
"largestFreeExtentSize": "9805410336768",
"raidStatus": "optimal",
"freeSpace": "9805410336768",
"drivePhysicalType": "sas",
"driveMediaType": "hdd",
"normalizedSpindleSpeed": "spindleSpeed7200",
"id": "0400000060080E5000290D8000009C9955828DD2",
"diskPool": True,
"name": "DDP"
},
"flashCacheCapable": True,
"dataAssuranceCapable": True,
"encrypted": False,
"thinProvisioningCapable": True,
"spindleSpeed": "spindleSpeed7200",
"raidLevel": "raidDiskPool",
"availableFreeExtentCapacities": [
"9805410336768"
]
},
{
"poolId": "0400000060080E5000290D8000009CBA55828E96",
"name": "pool_raid1",
"pool": {
"sequenceNum": 6,
"offline": False,
"raidLevel": "raid1",
"worldWideName": "60080E5000290D8000009CBA55828E96",
"volumeGroupRef": "0400000060080E5000290D8000009CBA55828E96",
"reserved1": "000000000000000000000000",
"reserved2": "",
"trayLossProtection": False,
"label": "pool_raid1",
"state": "complete",
"spindleSpeedMatch": True,
"spindleSpeed": 10000,
"isInaccessible": False,
"securityType": "none",
"drawerLossProtection": True,
"protectionInformationCapable": False,
"protectionInformationCapabilities": {
"protectionInformationCapable": True,
"protectionType": "type2Protection"
},
"volumeGroupData": {
"type": "unknown",
"diskPoolData": None
},
"usage": "standard",
"driveBlockFormat": "allNative",
"reservedSpaceAllocated": True,
"usedSpace": "2978559819776",
"totalRaidedSpace": "6662444097536",
"extents": [
{
"sectorOffset": "387891200",
"rawCapacity": "3683884277760",
"raidLevel": "raid1",
"volumeGroupRef":
"0400000060080E5000290D8000009CBA55828E96",
"freeExtentRef":
"030000B360080E5000290D8000009CBA55828E96",
"reserved1": "000000000000000000000000",
"reserved2": ""
}
],
"largestFreeExtentSize": "3683884277760",
"raidStatus": "optimal",
"freeSpace": "3683884277760",
"drivePhysicalType": "sas",
"driveMediaType": "hdd",
"normalizedSpindleSpeed": "spindleSpeed10k",
"id": "0400000060080E5000290D8000009CBA55828E96",
"diskPool": False,
"name": "pool_raid1"
},
"flashCacheCapable": False,
"dataAssuranceCapable": True,
"encrypted": False,
"thinProvisioningCapable": False,
"spindleSpeed": "spindleSpeed10k",
"raidLevel": "raid1",
"availableFreeExtentCapacities": [
"3683884277760"
]
},
{
"poolId": "0400000060080E5000290D8000009CAB55828E51",
"name": "pool_raid6",
"pool": {
"sequenceNum": 3,
"offline": False,
"raidLevel": "raid6",
"worldWideName": "60080E5000290D8000009CAB55828E51",
"volumeGroupRef": "0400000060080E5000290D8000009CAB55828E51",
"reserved1": "000000000000000000000000",
"reserved2": "",
"trayLossProtection": False,
"label": "pool_raid6",
"state": "complete",
"spindleSpeedMatch": True,
"spindleSpeed": 15000,
"isInaccessible": False,
"securityType": "enabled",
"drawerLossProtection": False,
"protectionInformationCapable": False,
"protectionInformationCapabilities": {
"protectionInformationCapable": True,
"protectionType": "type2Protection"
},
"volumeGroupData": {
"type": "unknown",
"diskPoolData": None
},
"usage": "standard",
"driveBlockFormat": "allNative",
"reservedSpaceAllocated": True,
"usedSpace": "16413217521664",
"totalRaidedSpace": "16637410312192",
"extents": [
{
"sectorOffset": "1144950784",
"rawCapacity": "224192790528",
"raidLevel": "raid6",
"volumeGroupRef":
"0400000060080E5000290D8000009CAB55828E51",
"freeExtentRef":
"0300005960080E5000290D8000009CAB55828E51",
"reserved1": "000000000000000000000000",
"reserved2": ""
}
],
"largestFreeExtentSize": "224192790528",
"raidStatus": "optimal",
"freeSpace": "224192790528",
"drivePhysicalType": "sas",
"driveMediaType": "hdd",
"normalizedSpindleSpeed": "spindleSpeed15k",
"id": "0400000060080E5000290D8000009CAB55828E51",
"diskPool": False,
"name": "pool_raid6"
},
"flashCacheCapable": False,
"dataAssuranceCapable": True,
"encrypted": True,
"thinProvisioningCapable": False,
"spindleSpeed": "spindleSpeed15k",
"raidLevel": "raid6",
"availableFreeExtentCapacities": [
"224192790528"
]
}
]
STORAGE_POOLS = [ssc_pool['pool'] for ssc_pool in SSC_POOLS]
VOLUMES = [
{
"offline": False,
"extremeProtection": False,
"volumeHandle": 2,
"raidLevel": "raid0",
"sectorOffset": "0",
"worldWideName": "60080E50002998A00000945355C37C19",
"label": "1",
"blkSize": 512,
"capacity": "10737418240",
"reconPriority": 1,
"segmentSize": 131072,
"action": "initializing",
"cache": {
"cwob": False,
"enterpriseCacheDump": False,
"mirrorActive": True,
"mirrorEnable": True,
"readCacheActive": True,
"readCacheEnable": True,
"writeCacheActive": True,
"writeCacheEnable": True,
"cacheFlushModifier": "flush10Sec",
"readAheadMultiplier": 1
},
"mediaScan": {
"enable": False,
"parityValidationEnable": False
},
"volumeRef": "0200000060080E50002998A00000945355C37C19",
"status": "optimal",
"volumeGroupRef": "0400000060080E50002998A00000945255C37C14",
"currentManager": "070000000000000000000001",
"preferredManager": "070000000000000000000001",
"perms": {
"mapToLUN": True,
"snapShot": True,
"format": True,
"reconfigure": True,
"mirrorPrimary": True,
"mirrorSecondary": True,
"copySource": True,
"copyTarget": True,
"readable": True,
"writable": True,
"rollback": True,
"mirrorSync": True,
"newImage": True,
"allowDVE": True,
"allowDSS": True,
"concatVolumeMember": True,
"flashReadCache": True,
"asyncMirrorPrimary": True,
"asyncMirrorSecondary": True,
"pitGroup": True,
"cacheParametersChangeable": True,
"allowThinManualExpansion": False,
"allowThinGrowthParametersChange": False,
"allowVaulting": False,
"allowRestore": False
},
"mgmtClientAttribute": 0,
"dssPreallocEnabled": True,
"dssMaxSegmentSize": 2097152,
"preReadRedundancyCheckEnabled": False,
"protectionInformationCapable": False,
"protectionType": "type1Protection",
"applicationTagOwned": False,
"untrustworthy": 0,
"volumeUse": "standardVolume",
"volumeFull": False,
"volumeCopyTarget": False,
"volumeCopySource": False,
"pitBaseVolume": False,
"asyncMirrorTarget": False,
"asyncMirrorSource": False,
"remoteMirrorSource": False,
"remoteMirrorTarget": False,
"diskPool": False,
"flashCached": False,
"increasingBy": "0",
"metadata": [],
"dataAssurance": True,
"name": "1",
"id": "0200000060080E50002998A00000945355C37C19",
"wwn": "60080E50002998A00000945355C37C19",
"objectType": "volume",
"mapped": False,
"preferredControllerId": "070000000000000000000001",
"totalSizeInBytes": "10737418240",
"onlineVolumeCopy": False,
"listOfMappings": [],
"currentControllerId": "070000000000000000000001",
"cacheSettings": {
"cwob": False,
"enterpriseCacheDump": False,
"mirrorActive": True,
"mirrorEnable": True,
"readCacheActive": True,
"readCacheEnable": True,
"writeCacheActive": True,
"writeCacheEnable": True,
"cacheFlushModifier": "flush10Sec",
"readAheadMultiplier": 1
},
"thinProvisioned": False
},
{
"volumeHandle": 16385,
"worldWideName": "60080E500029347000001D7B55C3791E",
"label": "2",
"allocationGranularity": 128,
"capacity": "53687091200",
"reconPriority": 1,
"volumeRef": "3A00000060080E500029347000001D7B55C3791E",
"status": "optimal",
"repositoryRef": "3600000060080E500029347000001D7955C3791D",
"currentManager": "070000000000000000000002",
"preferredManager": "070000000000000000000002",
"perms": {
"mapToLUN": True,
"snapShot": False,
"format": True,
"reconfigure": False,
"mirrorPrimary": False,
"mirrorSecondary": False,
"copySource": True,
"copyTarget": False,
"readable": True,
"writable": True,
"rollback": True,
"mirrorSync": True,
"newImage": True,
"allowDVE": True,
"allowDSS": True,
"concatVolumeMember": False,
"flashReadCache": True,
"asyncMirrorPrimary": True,
"asyncMirrorSecondary": True,
"pitGroup": True,
"cacheParametersChangeable": True,
"allowThinManualExpansion": False,
"allowThinGrowthParametersChange": False,
"allowVaulting": False,
"allowRestore": False
},
"mgmtClientAttribute": 0,
"preReadRedundancyCheckEnabled": False,
"protectionType": "type0Protection",
"applicationTagOwned": True,
"maxVirtualCapacity": "69269232549888",
"initialProvisionedCapacity": "4294967296",
"currentProvisionedCapacity": "4294967296",
"provisionedCapacityQuota": "55834574848",
"growthAlertThreshold": 85,
"expansionPolicy": "automatic",
"volumeCache": {
"cwob": False,
"enterpriseCacheDump": False,
"mirrorActive": True,
"mirrorEnable": True,
"readCacheActive": True,
"readCacheEnable": True,
"writeCacheActive": True,
"writeCacheEnable": True,
"cacheFlushModifier": "flush10Sec",
"readAheadMultiplier": 0
},
"offline": False,
"volumeFull": False,
"volumeGroupRef": "0400000060080E50002998A00000945155C37C08",
"blkSize": 512,
"storageVolumeRef": "0200000060080E500029347000001D7855C3791D",
"volumeCopyTarget": False,
"volumeCopySource": False,
"pitBaseVolume": False,
"asyncMirrorTarget": False,
"asyncMirrorSource": False,
"remoteMirrorSource": False,
"remoteMirrorTarget": False,
"flashCached": False,
"mediaScan": {
"enable": False,
"parityValidationEnable": False
},
"metadata": [],
"dataAssurance": False,
"name": "2",
"id": "3A00000060080E500029347000001D7B55C3791E",
"wwn": "60080E500029347000001D7B55C3791E",
"objectType": "thinVolume",
"mapped": False,
"diskPool": True,
"preferredControllerId": "070000000000000000000002",
"totalSizeInBytes": "53687091200",
"onlineVolumeCopy": False,
"listOfMappings": [],
"currentControllerId": "070000000000000000000002",
"segmentSize": 131072,
"cacheSettings": {
"cwob": False,
"enterpriseCacheDump": False,
"mirrorActive": True,
"mirrorEnable": True,
"readCacheActive": True,
"readCacheEnable": True,
"writeCacheActive": True,
"writeCacheEnable": True,
"cacheFlushModifier": "flush10Sec",
"readAheadMultiplier": 0
},
"thinProvisioned": True
}
]
VOLUME = VOLUMES[0]
STORAGE_POOL = {
'label': 'DDP',
'id': 'fakevolgroupref',
'volumeGroupRef': 'fakevolgroupref',
'raidLevel': 'raidDiskPool',
'usedSpace': '16413217521664',
'totalRaidedSpace': '16637410312192',
}
INITIATOR_NAME = 'iqn.1998-01.com.vmware:localhost-28a58148'
INITIATOR_NAME_2 = 'iqn.1998-01.com.vmware:localhost-28a58149'
INITIATOR_NAME_3 = 'iqn.1998-01.com.vmware:localhost-28a58150'
WWPN = '20130080E5322230'
WWPN_2 = '20230080E5322230'
FC_TARGET_WWPNS = [
'500a098280feeba5',
'500a098290feeba5',
'500a098190feeba5',
'500a098180feeba5'
]
FC_I_T_MAP = {
'20230080E5322230': [
'500a098280feeba5',
'500a098290feeba5'
],
'20130080E5322230': [
'500a098190feeba5',
'500a098180feeba5'
]
}
FC_FABRIC_MAP = {
'fabricB': {
'target_port_wwn_list': [
'500a098190feeba5',
'500a098180feeba5'
],
'initiator_port_wwn_list': [
'20130080E5322230'
]
},
'fabricA': {
'target_port_wwn_list': [
'500a098290feeba5',
'500a098280feeba5'
],
'initiator_port_wwn_list': [
'20230080E5322230'
]
}
}
HOST = {
'isSAControlled': False,
'confirmLUNMappingCreation': False,
'label': 'stlrx300s7-55',
'isLargeBlockFormatHost': False,
'clusterRef': '8500000060080E500023C7340036035F515B78FC',
'protectionInformationCapableAccessMethod': False,
'ports': [],
'hostRef': '8400000060080E500023C73400300381515BFBA3',
'hostTypeIndex': 6,
'hostSidePorts': [{
'label': 'NewStore',
'type': 'iscsi',
'address': INITIATOR_NAME}]
}
HOST_2 = {
'isSAControlled': False,
'confirmLUNMappingCreation': False,
'label': 'stlrx300s7-55',
'isLargeBlockFormatHost': False,
'clusterRef': utils.NULL_REF,
'protectionInformationCapableAccessMethod': False,
'ports': [],
'hostRef': '8400000060080E500023C73400300381515BFBA5',
'hostTypeIndex': 6,
'hostSidePorts': [{
'label': 'NewStore', 'type': 'iscsi',
'address': INITIATOR_NAME_2}]
}
# HOST_3 has all lun_ids in use.
HOST_3 = {
'isSAControlled': False,
'confirmLUNMappingCreation': False,
'label': 'stlrx300s7-55',
'isLargeBlockFormatHost': False,
'clusterRef': '8500000060080E500023C73400360351515B78FC',
'protectionInformationCapableAccessMethod': False,
'ports': [],
'hostRef': '8400000060080E501023C73400800381515BFBA5',
'hostTypeIndex': 6,
'hostSidePorts': [{
'label': 'NewStore', 'type': 'iscsi',
'address': INITIATOR_NAME_3}],
}
VOLUME_MAPPING = {
'lunMappingRef': '8800000000000000000000000000000000000000',
'lun': 0,
'ssid': 16384,
'perms': 15,
'volumeRef': VOLUME['volumeRef'],
'type': 'all',
'mapRef': HOST['hostRef']
}
# VOLUME_MAPPING_3 corresponding to HOST_3 has all lun_ids in use.
VOLUME_MAPPING_3 = {
'lunMappingRef': '8800000000000000000000000000000000000000',
'lun': range(255),
'ssid': 16384,
'perms': 15,
'volumeRef': VOLUME['volumeRef'],
'type': 'all',
'mapRef': HOST_3['hostRef'],
}
VOLUME_MAPPING_TO_MULTIATTACH_GROUP = copy.deepcopy(VOLUME_MAPPING)
VOLUME_MAPPING_TO_MULTIATTACH_GROUP.update(
{'mapRef': MULTIATTACH_HOST_GROUP['clusterRef']}
)
STORAGE_SYSTEM = {
'chassisSerialNumber': 1,
'fwVersion': '08.10.15.00',
'freePoolSpace': 11142431623168,
'driveCount': 24,
'hostSparesUsed': 0, 'id':
'1fa6efb5-f07b-4de4-9f0e-52e5f7ff5d1b',
'hotSpareSizeAsString': '0', 'wwn':
'60080E500023C73400000000515AF323',
'passwordStatus': 'valid',
'parameters': {
'minVolSize': 1048576, 'maxSnapshotsPerBase': 16,
'maxDrives': 192,
'maxVolumes': 512,
'maxVolumesPerGroup': 256,
'maxMirrors': 0,
'maxMappingsPerVolume': 1,
'maxMappableLuns': 256,
'maxVolCopys': 511,
'maxSnapshots': 256
}, 'hotSpareCount': 0,
'hostSpareCountInStandby': 0,
'status': 'needsattn',
'trayCount': 1,
'usedPoolSpaceAsString': '5313000380416',
'ip2': '10.63.165.216',
'ip1': '10.63.165.215',
'freePoolSpaceAsString': '11142431623168',
'types': 'SAS',
'name': 'stle2600-7_8',
'hotSpareSize': 0,
'usedPoolSpace': 5313000380416,
'driveTypes': ['sas'],
'unconfiguredSpaceByDriveType': {},
'unconfiguredSpaceAsStrings': '0',
'model': '2650',
'unconfiguredSpace': 0
}
SNAPSHOT_GROUP = {
'id': '3300000060080E500023C7340000098D5294AC9A',
'status': 'optimal',
'autoDeleteLimit': 0,
'maxRepositoryCapacity': '-65536',
'rollbackStatus': 'none',
'unusableRepositoryCapacity': '0',
'pitGroupRef': '3300000060080E500023C7340000098D5294AC9A',
'clusterSize': 65536,
'label': 'C6JICISVHNG2TFZX4XB5ZWL7F',
'maxBaseCapacity': '476187142128128',
'repositoryVolume': '3600000060080E500023BB3400001FA952CEF12C',
'fullWarnThreshold': 99,
'repFullPolicy': 'purgepit',
'action': 'none',
'rollbackPriority': 'medium',
'creationPendingStatus': 'none',
'consistencyGroupRef': '0000000000000000000000000000000000000000',
'volumeHandle': 49153,
'consistencyGroup': False,
'baseVolume': '0200000060080E500023C734000009825294A534',
'snapshotCount': 32
}
SNAPSHOT_IMAGE = {
'id': fake.snapshot_id,
'baseVol': '0200000060080E500023C734000009825294A534',
'status': 'optimal',
'pitCapacity': '2147483648',
'pitTimestamp': '1389315375',
'pitGroupRef': '3300000060080E500023C7340000098D5294AC9A',
'creationMethod': 'user',
'repositoryCapacityUtilization': '2818048',
'activeCOW': True,
'isRollbackSource': False,
'pitRef': '3400000060080E500023BB3400631F335294A5A8',
'pitSequenceNumber': '19',
'consistencyGroupId': '0000000000000000000000000000000000000000',
}
SNAPSHOT_VOLUME = {
'id': '35000000600A0980006077F80000F8BF566581AA',
'viewRef': '35000000600A0980006077F80000F8BF566581AA',
'worldWideName': '600A0980006077F80000F8BF566581AA',
'baseVol': '02000000600A0980006077F80000F89B56657E26',
'basePIT': '0000000000000000000000000000000000000000',
'boundToPIT': False,
'accessMode': 'readOnly',
'label': 'UZJ45SLUKNGWRF3QZHBTOG4C4E_DEL',
'status': 'stopped',
'currentManager': '070000000000000000000001',
'preferredManager': '070000000000000000000001',
'repositoryVolume': '0000000000000000000000000000000000000000',
'fullWarnThreshold': 0,
'viewTime': '1449453419',
'viewSequenceNumber': '2104',
'volumeHandle': 16510,
'clusterSize': 0,
'maxRepositoryCapacity': '0',
'unusableRepositoryCapacity': '0',
'membership': {
'viewType': 'individual',
'cgViewRef': None
},
'mgmtClientAttribute': 0,
'offline': False,
'volumeFull': False,
'repositoryCapacity': '0',
'baseVolumeCapacity': '1073741824',
'totalSizeInBytes': '0',
'consistencyGroupId': None,
'volumeCopyTarget': False,
'cloneCopy': False,
'volumeCopySource': False,
'pitBaseVolume': False,
'asyncMirrorTarget': False,
'asyncMirrorSource': False,
'protectionType': 'type0Protection',
'remoteMirrorSource': False,
'remoteMirrorTarget': False,
'wwn': '600A0980006077F80000F8BF566581AA',
'listOfMappings': [],
'mapped': False,
'currentControllerId': '070000000000000000000001',
'preferredControllerId': '070000000000000000000001',
'onlineVolumeCopy': False,
'objectType': 'pitView',
'name': 'UZJ45SLUKNGWRF3QZHBTOG4C4E',
}
FAKE_BACKEND_STORE = {
'key': 'cinder-snapshots',
'value': '{"3300000060080E50003416400000E90D56B047E5":"2"}'
}
HARDWARE_INVENTORY_SINGLE_CONTROLLER = {
'controllers': [
{
'modelName': '2752',
'serialNumber': '021436001321'
}
]
}
HARDWARE_INVENTORY = {
'controllers': [
{
'modelName': '2752',
'serialNumber': '021436000943'
},
{
'modelName': '2752',
'serialNumber': '021436001321'
}
],
'iscsiPorts': [
{
'controllerId':
'070000000000000000000002',
'ipv4Enabled': True,
'ipv4Data': {
'ipv4Address': '0.0.0.0',
'ipv4AddressConfigMethod':
'configStatic',
'ipv4VlanId': {
'isEnabled': False,
'value': 0
},
'ipv4AddressData': {
'ipv4Address': '172.20.123.66',
'ipv4SubnetMask': '255.255.255.0',
'configState': 'configured',
'ipv4GatewayAddress': '0.0.0.0'
}
},
'tcpListenPort': 3260,
'interfaceRef': '2202040000000000000000000000000000000000',
'iqn': 'iqn.1992-01.com.lsi:2365.60080e500023c73400000000515af323'
}
],
'fibrePorts': [
{
"channel": 1,
"loopID": 126,
"speed": 800,
"hardAddress": 6,
"nodeName": "20020080E5322230",
"portName": "20130080E5322230",
"portId": "011700",
"topology": "fabric",
"part": "PM8032 ",
"revision": 8,
"chanMiswire": False,
"esmMiswire": False,
"linkStatus": "up",
"isDegraded": False,
"speedControl": "auto",
"maxSpeed": 800,
"speedNegError": False,
"reserved1": "000000000000000000000000",
"reserved2": "",
"ddsChannelState": 0,
"ddsStateReason": 0,
"ddsStateWho": 0,
"isLocal": True,
"channelPorts": [],
"currentInterfaceSpeed": "speed8gig",
"maximumInterfaceSpeed": "speed8gig",
"interfaceRef": "2202020000000000000000000000000000000000",
"physicalLocation": {
"trayRef": "0000000000000000000000000000000000000000",
"slot": 0,
"locationParent": {
"refType": "generic",
"controllerRef": None,
"symbolRef": "0000000000000000000000000000000000000000",
"typedReference": None
},
"locationPosition": 0
},
"isTrunkCapable": False,
"trunkMiswire": False,
"protectionInformationCapable": True,
"controllerId": "070000000000000000000002",
"interfaceId": "2202020000000000000000000000000000000000",
"addressId": "20130080E5322230",
"niceAddressId": "20:13:00:80:E5:32:22:30"
},
{
"channel": 2,
"loopID": 126,
"speed": 800,
"hardAddress": 7,
"nodeName": "20020080E5322230",
"portName": "20230080E5322230",
"portId": "011700",
"topology": "fabric",
"part": "PM8032 ",
"revision": 8,
"chanMiswire": False,
"esmMiswire": False,
"linkStatus": "up",
"isDegraded": False,
"speedControl": "auto",
"maxSpeed": 800,
"speedNegError": False,
"reserved1": "000000000000000000000000",
"reserved2": "",
"ddsChannelState": 0,
"ddsStateReason": 0,
"ddsStateWho": 0,
"isLocal": True,
"channelPorts": [],
"currentInterfaceSpeed": "speed8gig",
"maximumInterfaceSpeed": "speed8gig",
"interfaceRef": "2202030000000000000000000000000000000000",
"physicalLocation": {
"trayRef": "0000000000000000000000000000000000000000",
"slot": 0,
"locationParent": {
"refType": "generic",
"controllerRef": None,
"symbolRef": "0000000000000000000000000000000000000000",
"typedReference": None
},
"locationPosition": 0
},
"isTrunkCapable": False,
"trunkMiswire": False,
"protectionInformationCapable": True,
"controllerId": "070000000000000000000002",
"interfaceId": "2202030000000000000000000000000000000000",
"addressId": "20230080E5322230",
"niceAddressId": "20:23:00:80:E5:32:22:30"
},
]
}
FAKE_POOL_ACTION_PROGRESS = [
{
"volumeRef": "0200000060080E50002998A00000945355C37C19",
"progressPercentage": 55,
"estimatedTimeToCompletion": 1,
"currentAction": "initializing"
},
{
"volumeRef": "0200000060080E50002998A00000945355C37C18",
"progressPercentage": 0,
"estimatedTimeToCompletion": 0,
"currentAction": "progressDve"
},
]
FAKE_RESOURCE_URL = '/devmgr/v2/devmgr/utils/about'
FAKE_APP_VERSION = '2015.2|2015.2.dev59|vendor|Linux-3.13.0-24-generic'
FAKE_BACKEND = 'eseriesiSCSI'
FAKE_CINDER_HOST = 'ubuntu-1404'
FAKE_SERIAL_NUMBERS = ['021436000943', '021436001321']
FAKE_SERIAL_NUMBER = ['021436001321']
FAKE_DEFAULT_SERIAL_NUMBER = ['unknown', 'unknown']
FAKE_DEFAULT_MODEL = 'unknown'
FAKE_ABOUT_RESPONSE = {
'runningAsProxy': True,
'version': '01.53.9010.0005',
'systemId': 'a89355ab-692c-4d4a-9383-e249095c3c0',
}
FAKE_CONTROLLERS = [
{'serialNumber': FAKE_SERIAL_NUMBERS[0], 'modelName': '2752'},
{'serialNumber': FAKE_SERIAL_NUMBERS[1], 'modelName': '2752'}]
FAKE_SINGLE_CONTROLLER = [{'serialNumber': FAKE_SERIAL_NUMBERS[1]}]
FAKE_KEY = ('openstack-%s-%s-%s' % (FAKE_CINDER_HOST, FAKE_SERIAL_NUMBERS[0],
FAKE_SERIAL_NUMBERS[1]))
FAKE_ASUP_DATA = {
'category': 'provisioning',
'app-version': FAKE_APP_VERSION,
'event-source': 'Cinder driver NetApp_iSCSI_ESeries',
'event-description': 'OpenStack Cinder connected to E-Series proxy',
'system-version': '08.10.15.00',
'computer-name': FAKE_CINDER_HOST,
'model': FAKE_CONTROLLERS[0]['modelName'],
'controller2-serial': FAKE_CONTROLLERS[1]['serialNumber'],
'controller1-serial': FAKE_CONTROLLERS[0]['serialNumber'],
'chassis-serial-number': FAKE_SERIAL_NUMBER[0],
'operating-mode': 'proxy',
}
GET_ASUP_RETURN = {
'model': FAKE_CONTROLLERS[0]['modelName'],
'serial_numbers': FAKE_SERIAL_NUMBERS,
'firmware_version': FAKE_ASUP_DATA['system-version'],
'chassis_sn': FAKE_ASUP_DATA['chassis-serial-number'],
}
FAKE_POST_INVOKE_DATA = ('POST', '/key-values/%s' % FAKE_KEY,
json.dumps(FAKE_ASUP_DATA))
VOLUME_COPY_JOB = {
"status": "complete",
"cloneCopy": True,
"pgRef": "3300000060080E500023C73400000ACA52D29454",
"volcopyHandle": 49160,
"idleTargetWriteProt": True,
"copyPriority": "priority2",
"volcopyRef": "1800000060080E500023C73400000ACF52D29466",
"worldWideName": "60080E500023C73400000ACF52D29466",
"copyCompleteTime": "0",
"sourceVolume": "3500000060080E500023C73400000ACE52D29462",
"currentManager": "070000000000000000000002",
"copyStartTime": "1389551671",
"reserved1": "00000000",
"targetVolume": "0200000060080E500023C73400000A8C52D10675",
}
FAKE_ENDPOINT_HTTP = 'http://host:80/endpoint'
FAKE_ENDPOINT_HTTPS = 'https://host:8443/endpoint'
FAKE_INVOC_MSG = 'success'
FAKE_CLIENT_PARAMS = {
'scheme': 'http',
'host': '127.0.0.1',
'port': 8080,
'service_path': '/devmgr/vn',
'username': 'rw',
'password': 'rw',
}
FAKE_CONSISTENCY_GROUP = {
'cgRef': '2A000000600A0980006077F8008702F45480F41A',
'label': '5BO5GPO4PFGRPMQWEXGTILSAUI',
'repFullPolicy': 'failbasewrites',
'fullWarnThreshold': 75,
'autoDeleteLimit': 0,
'rollbackPriority': 'medium',
'uniqueSequenceNumber': [8940, 8941, 8942],
'creationPendingStatus': 'none',
'name': '5BO5GPO4PFGRPMQWEXGTILSAUI',
'id': '2A000000600A0980006077F8008702F45480F41A'
}
FAKE_CONSISTENCY_GROUP_MEMBER = {
'consistencyGroupId': '2A000000600A0980006077F8008702F45480F41A',
'volumeId': '02000000600A0980006077F8000002F55480F421',
'volumeWwn': '600A0980006077F8000002F55480F421',
'baseVolumeName': 'I5BHHNILUJGZHEUD4S36GCOQYA',
'clusterSize': 65536,
'totalRepositoryVolumes': 1,
'totalRepositoryCapacity': '4294967296',
'usedRepositoryCapacity': '5636096',
'fullWarnThreshold': 75,
'totalSnapshotImages': 3,
'totalSnapshotVolumes': 2,
'autoDeleteSnapshots': False,
'autoDeleteLimit': 0,
'pitGroupId': '33000000600A0980006077F8000002F85480F435',
'repositoryVolume': '36000000600A0980006077F8000002F75480F435'
}
FAKE_CONSISTENCY_GROUP_SNAPSHOT_VOLUME = {
'id': '2C00000060080E500034194F002C96A256BD50F9',
'name': '6TRZHKDG75DVLBC2JU5J647RME',
'cgViewRef': '2C00000060080E500034194F002C96A256BD50F9',
'groupRef': '2A00000060080E500034194F0087969856BD2D67',
'label': '6TRZHKDG75DVLBC2JU5J647RME',
'viewTime': '1455221060',
'viewSequenceNumber': '10',
}
def list_snapshot_groups(numGroups):
snapshots = []
for n in range(0, numGroups):
s = copy.deepcopy(SNAPSHOT_GROUP)
s['label'] = s['label'][:-1] + str(n)
snapshots.append(s)
return snapshots
def create_configuration_eseries():
config = conf.Configuration(None)
config.append_config_values(na_opts.netapp_connection_opts)
config.append_config_values(na_opts.netapp_transport_opts)
config.append_config_values(na_opts.netapp_basicauth_opts)
config.append_config_values(na_opts.netapp_provisioning_opts)
config.append_config_values(na_opts.netapp_eseries_opts)
config.netapp_storage_protocol = 'iscsi'
config.netapp_login = 'rw'
config.netapp_password = 'rw'
config.netapp_server_hostname = '127.0.0.1'
config.netapp_transport_type = 'http'
config.netapp_server_port = '8080'
config.netapp_storage_pools = 'DDP'
config.netapp_storage_family = 'eseries'
config.netapp_sa_password = 'saPass'
config.netapp_controller_ips = '10.11.12.13,10.11.12.14'
config.netapp_webservice_path = '/devmgr/v2'
config.netapp_enable_multiattach = False
return config
def deepcopy_return_value_method_decorator(fn):
"""Returns a deepcopy of the returned value of the wrapped function."""
def decorator(*args, **kwargs):
return copy.deepcopy(fn(*args, **kwargs))
return decorator
def deepcopy_return_value_class_decorator(cls):
"""Wraps 'non-protected' methods of a class with decorator.
Wraps all 'non-protected' methods of a class with the
deepcopy_return_value_method_decorator decorator.
"""
class NewClass(cls):
def __getattribute__(self, attr_name):
obj = super(NewClass, self).__getattribute__(attr_name)
if (hasattr(obj, '__call__') and not attr_name.startswith('_')
and not isinstance(obj, mock.Mock)):
return deepcopy_return_value_method_decorator(obj)
return obj
return NewClass
@deepcopy_return_value_class_decorator
class FakeEseriesClient(object):
features = na_utils.Features()
def __init__(self, *args, **kwargs):
self.features.add_feature('AUTOSUPPORT')
self.features.add_feature('SSC_API_V2')
self.features.add_feature('REST_1_3_RELEASE')
self.features.add_feature('REST_1_4_RELEASE')
def list_storage_pools(self):
return STORAGE_POOLS
def register_storage_system(self, *args, **kwargs):
return {
'freePoolSpace': '17055871480319',
'driveCount': 24,
'wwn': '60080E500023C73400000000515AF323',
'id': '1',
'hotSpareSizeAsString': '0',
'hostSparesUsed': 0,
'types': '',
'hostSpareCountInStandby': 0,
'status': 'optimal',
'trayCount': 1,
'usedPoolSpaceAsString': '37452115456',
'ip2': '10.63.165.216',
'ip1': '10.63.165.215',
'freePoolSpaceAsString': '17055871480319',
'hotSpareCount': 0,
'hotSpareSize': '0',
'name': 'stle2600-7_8',
'usedPoolSpace': '37452115456',
'driveTypes': ['sas'],
'unconfiguredSpaceByDriveType': {},
'unconfiguredSpaceAsStrings': '0',
'model': '2650',
'unconfiguredSpace': '0'
}
def list_volume(self, volume_id):
return VOLUME
def list_volumes(self):
return [VOLUME]
def delete_volume(self, vol):
pass
def create_host_group(self, name):
return MULTIATTACH_HOST_GROUP
def get_host_group(self, ref):
return MULTIATTACH_HOST_GROUP
def list_host_groups(self):
return [MULTIATTACH_HOST_GROUP, FOREIGN_HOST_GROUP]
def get_host_group_by_name(self, name, *args, **kwargs):
host_groups = self.list_host_groups()
return [host_group for host_group in host_groups
if host_group['label'] == name][0]
def set_host_group_for_host(self, *args, **kwargs):
pass
def create_host_with_ports(self, *args, **kwargs):
return HOST
def list_hosts(self):
return [HOST, HOST_2]
def get_host(self, *args, **kwargs):
return HOST
def create_volume(self, *args, **kwargs):
return VOLUME
def create_volume_mapping(self, *args, **kwargs):
return VOLUME_MAPPING
def get_volume_mappings(self):
return [VOLUME_MAPPING]
def get_volume_mappings_for_volume(self, volume):
return [VOLUME_MAPPING]
def get_volume_mappings_for_host(self, host_ref):
return [VOLUME_MAPPING]
def get_volume_mappings_for_host_group(self, hg_ref):
return [VOLUME_MAPPING]
def delete_volume_mapping(self):
return
def move_volume_mapping_via_symbol(self, map_ref, to_ref, lun_id):
return {'lun': lun_id}
def list_storage_system(self):
return STORAGE_SYSTEM
def list_storage_systems(self):
return [STORAGE_SYSTEM]
def list_snapshot_groups(self):
return [SNAPSHOT_GROUP]
def list_snapshot_images(self):
return [SNAPSHOT_IMAGE]
def list_snapshot_image(self, *args, **kwargs):
return SNAPSHOT_IMAGE
def create_cg_snapshot_view(self, *args, **kwargs):
return SNAPSHOT_VOLUME
def list_host_types(self):
return [
{
'id': '4',
'code': 'AIX',
'name': 'AIX',
'index': 4
},
{
'id': '5',
'code': 'IRX',
'name': 'IRX',
'index': 5
},
{
'id': '6',
'code': 'LnxALUA',
'name': 'LnxALUA',
'index': 6
}
]
def list_hardware_inventory(self):
return HARDWARE_INVENTORY
def get_eseries_api_info(self, verify=False):
return 'Proxy', '1.53.9010.0005'
def set_counter(self, key, value):
pass
def add_autosupport_data(self, *args):
pass
def get_serial_numbers(self):
return FAKE_ASUP_DATA.get('controller1-serial'), FAKE_ASUP_DATA.get(
'controller2-serial')
def get_model_name(self):
pass
def api_operating_mode(self):
pass
def get_firmware_version(self):
return FAKE_ASUP_DATA['system-version']
def create_volume_copy_job(self, *args, **kwargs):
return VOLUME_COPY_JOB
def list_vol_copy_job(self, *args, **kwargs):
return VOLUME_COPY_JOB
def delete_vol_copy_job(self, *args, **kwargs):
pass
def create_snapshot_image(self, *args, **kwargs):
return SNAPSHOT_IMAGE
def create_snapshot_volume(self, *args, **kwargs):
return SNAPSHOT_VOLUME
def list_snapshot_volumes(self, *args, **kwargs):
return [SNAPSHOT_VOLUME]
def list_snapshot_volume(self, *args, **kwargs):
return SNAPSHOT_IMAGE
def create_snapshot_group(self, *args, **kwargs):
return SNAPSHOT_GROUP
def list_snapshot_group(self, *args, **kwargs):
return SNAPSHOT_GROUP
def delete_snapshot_volume(self, *args, **kwargs):
pass
def list_target_wwpns(self, *args, **kwargs):
return [WWPN_2]
def update_stored_system_password(self, *args, **kwargs):
pass
def update_snapshot_volume(self, *args, **kwargs):
return SNAPSHOT_VOLUME
def delete_snapshot_image(self, *args, **kwargs):
pass
def delete_snapshot_group(self, *args, **kwargs):
pass
def restart_snapshot_volume(self, *args, **kwargs):
pass
def create_consistency_group(self, *args, **kwargs):
return FAKE_CONSISTENCY_GROUP
def delete_consistency_group(self, *args, **kwargs):
pass
def list_consistency_groups(self, *args, **kwargs):
return [FAKE_CONSISTENCY_GROUP]
def remove_consistency_group_member(self, *args, **kwargs):
pass
def add_consistency_group_member(self, *args, **kwargs):
pass
def list_backend_store(self, key):
return {}
def save_backend_store(self, key, val):
pass
def create_consistency_group_snapshot(self, *args, **kwargs):
return [SNAPSHOT_IMAGE]
def get_consistency_group_snapshots(self, *args, **kwargs):
return [SNAPSHOT_IMAGE]
def delete_consistency_group_snapshot(self, *args, **kwargs):
pass