pass
+class CIM_DeviceMaskingGroup(dict):
+ pass
+
+
+class EMC_LunMaskingSCSIProtocolController(dict):
+ pass
+
+
+class CIM_TargetMaskingGroup(dict):
+ pass
+
+
+class EMC_StorageHardwareID(dict):
+ pass
+
+
class Fake_CIMProperty():
def fake_getCIMProperty(self):
u'//10.10.10.10/root/emc: SE_DeviceMaskingGroup.InstanceID='
'"SYMMETRIX+000198700440+OS_default_GOLD1_SG"')
storage_system = 'SYMMETRIX+000195900551'
+ port_group = 'OS-portgroup-PG'
lunmaskctrl_id =\
'SYMMETRIX+000195900551+OS-fakehost-gold-MV'
lunmaskctrl_name =\
assoctierpolicy_creationclass = 'CIM_StorageTier'
storagepool_creationclass = 'Symm_VirtualProvisioningPool'
storagegroup_creationclass = 'CIM_DeviceMaskingGroup'
- hardwareid_creationclass = 'SE_StorageHardwareID'
+ hardwareid_creationclass = 'EMC_StorageHardwareID'
storagepoolid = 'SYMMETRIX+000195900551+U+gold'
storagegroupname = 'OS_default_GOLD1_SG'
storagevolume_creationclass = 'EMC_StorageVolume'
policyrule = 'gold'
poolname = 'gold'
+ totalmanagedspace_bits = '1000000000000'
+ subscribedcapacity_bits = '500000000000'
+ totalmanagedspace_gbs = 931
+ subscribedcapacity_gbs = 466
unit_creationclass = 'CIM_ProtocolControllerForUnit'
storage_type = 'gold'
'storage_protocol': 'ISCSI'}
test_host = {'capabilities': location_info,
'host': 'fake_host'}
+
+ initiatorNames = ["123456789012345", "123456789054321"]
test_ctxt = {}
new_type = {}
diff = {}
result = self._enum_hdwidmgmts()
elif name == 'SE_StorageHardwareID':
result = self._enum_storhdwids()
+ elif name == 'EMC_StorageSystem':
+ result = self._enum_storage_system()
+ elif name == 'Symm_TierPolicyRule':
+ result = self._enum_policyrules()
else:
result = self._default_enum()
return result
result = self._getinstance_initiatormaskinggroup(objectpath)
elif name == 'SE_StorageHardwareID':
result = self._getinstance_storagehardwareid(objectpath)
+ elif name == 'EMC_StorageHardwareID':
+ result = self._getinstance_storagehardwareid(objectpath)
+ elif name == 'Symm_VirtualProvisioningPool':
+ result = self._getinstance_pool(objectpath)
else:
result = self._default_getinstance(objectpath)
result = self._assoc_endpoint()
elif ResultClass == 'EMC_StorageVolume':
result = self._assoc_storagevolume(objectpath)
+ elif ResultClass == 'CIM_DeviceMaskingGroup':
+ result = self._assoc_storagegroup()
+ elif ResultClass == 'CIM_StorageExtent':
+ result = self._enum_storage_extent()
+ elif ResultClass == 'EMC_LunMaskingSCSIProtocolController':
+ result = self._assoc_lunmaskctrls()
+ elif ResultClass == 'CIM_TargetMaskingGroup':
+ result = self._assoc_portgroup()
else:
result = self._default_assoc(objectpath)
return result
result = self._enum_storagevolumes()
elif ResultClass == 'SE_InitiatorMaskingGroup':
result = self._enum_initiatorMaskingGroup()
+ elif ResultClass == 'CIM_InitiatorMaskingGroup':
+ result = self._enum_initiatorMaskingGroup()
elif ResultClass == 'CIM_StorageExtent':
result = self._enum_storage_extent()
elif ResultClass == 'SE_StorageHardwareID':
result = self._enum_storhdwids()
elif ResultClass == 'Symm_FCSCSIProtocolEndpoint':
result = self._enum_fcscsiendpoint()
+ elif ResultClass == 'CIM_TargetMaskingGroup':
+ result = self._assocnames_portgroup()
else:
result = self._default_assocnames(objectpath)
def _assoc_hdwid(self):
assocs = []
- assoc = {}
+ assoc = EMC_StorageHardwareID()
assoc['StorageID'] = self.data.connector['initiator']
+ assoc['SystemName'] = self.data.storage_system
+ assoc['CreationClassName'] = 'EMC_StorageHardwareID'
+ assoc.path = assoc
assocs.append(assoc)
for wwpn in self.data.connector['wwpns']:
- assoc2 = {}
+ assoc2 = EMC_StorageHardwareID()
assoc2['StorageID'] = wwpn
+ assoc2['SystemName'] = self.data.storage_system
+ assoc2['CreationClassName'] = 'EMC_StorageHardwareID'
+ assoc2.path = assoc2
assocs.append(assoc2)
+ assocs.append(assoc)
return assocs
def _assoc_endpoint(self):
assocs.append(assoc)
return assocs
+ def _assoc_storagegroup(self):
+ assocs = []
+ assoc = CIM_DeviceMaskingGroup()
+ assoc['ElementName'] = 'OS_default_GOLD1_SG'
+ assoc['SystemName'] = self.data.storage_system
+ assoc['CreationClassName'] = 'CIM_DeviceMaskingGroup'
+ assoc.path = assoc
+ assocs.append(assoc)
+ return assocs
+
+ def _assoc_portgroup(self):
+ assocs = []
+ assoc = CIM_TargetMaskingGroup()
+ assoc['ElementName'] = self.data.port_group
+ assoc['SystemName'] = self.data.storage_system
+ assoc['CreationClassName'] = 'CIM_TargetMaskingGroup'
+ assoc.path = assoc
+ assocs.append(assoc)
+ return assocs
+
+ def _assoc_lunmaskctrls(self):
+ ctrls = []
+ ctrl = EMC_LunMaskingSCSIProtocolController()
+ ctrl['CreationClassName'] = self.data.lunmask_creationclass
+ ctrl['DeviceID'] = self.data.lunmaskctrl_id
+ ctrl['SystemName'] = self.data.storage_system
+ ctrl['ElementName'] = self.data.lunmaskctrl_name
+ ctrl.path = ctrl
+ ctrls.append(ctrl)
+ return ctrls
+
# Added test for EMC_StorageVolume associators
def _assoc_storagevolume(self, objectpath):
assocs = []
def _assocnames_storagevolume(self):
return self._enum_storagevolume()
+ def _assocnames_portgroup(self):
+ return self._enum_portgroup()
+
def _default_assocnames(self, objectpath):
return objectpath
self.data.initiatorgroup_creationclass)
initiatorgroup['DeviceID'] = self.data.initiatorgroup_id
initiatorgroup['SystemName'] = self.data.storage_system
+ initiatorgroup['ElementName'] = self.data.initiatorgroup_name
initiatorgroup.path = initiatorgroup
return initiatorgroup
hardwareid.path = hardwareid
return hardwareid
+ def _getinstance_pool(self, objectpath):
+ pool = {}
+ pool['CreationClassName'] = 'Symm_VirtualProvisioningPool'
+ pool['ElementName'] = 'gold'
+ pool['SystemName'] = self.data.storage_system
+ pool['TotalManagedSpace'] = self.data.totalmanagedspace_bits
+ pool['EMCSubscribedCapacity'] = self.data.subscribedcapacity_bits
+ return pool
+
def _getinstance_unit(self, objectpath):
unit = {}
initatorgroups.append(initatorgroup)
return initatorgroups
+ def _enum_storage_system(self):
+ storagesystems = []
+ storagesystem = {}
+ storagesystem['SystemName'] = self.data.storage_system
+ storagesystem['Name'] = self.data.storage_system
+ storagesystems.append(storagesystem)
+ return storagesystems
+
def _enum_storage_extent(self):
storageExtents = []
storageExtent = CIM_StorageExtent()
wwns.append(wwn)
return wwns
+ def _enum_portgroup(self):
+ portgroups = []
+ portgroup = {}
+ portgroup['CreationClassName'] = (
+ 'CIM_TargetMaskingGroup')
+ portgroup['ElementName'] = self.data.port_group
+ portgroups.append(portgroup)
+ return portgroups
+
def _default_enum(self):
names = []
name = {}
self.driver.common.utils.process_exception_args,
arg, instancename3)
+ # Bug 1393555 - masking view has been deleted by another process.
+ def test_find_maskingview(self):
+ conn = self.fake_ecom_connection()
+ foundMaskingViewInstanceName = (
+ self.driver.common.masking._find_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The masking view has been found.
+ self.assertEqual(
+ self.data.lunmaskctrl_name,
+ conn.GetInstance(foundMaskingViewInstanceName)['ElementName'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundMaskingViewInstanceName2 = (
+ self.driver.common.masking._find_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The masking view has not been found.
+ self.assertIsNone(foundMaskingViewInstanceName2)
+
+ # Bug 1393555 - port group has been deleted by another process.
+ def test_find_portgroup(self):
+ conn = self.fake_ecom_connection()
+ controllerConfigService = (
+ self.driver.utils.find_controller_configuration_service(
+ conn, self.data.storage_system))
+
+ foundPortGroupInstanceName = (
+ self.driver.common.masking._find_port_group(
+ conn, controllerConfigService, self.data.port_group))
+ # The port group has been found.
+ self.assertEqual(
+ self.data.port_group,
+ conn.GetInstance(foundPortGroupInstanceName)['ElementName'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundPortGroupInstanceName2 = (
+ self.driver.common.masking._find_port_group(
+ conn, controllerConfigService, self.data.port_group))
+ # The port group has not been found as it has been deleted
+ # externally or by another thread.
+ self.assertIsNone(foundPortGroupInstanceName2)
+
+ # Bug 1393555 - storage group has been deleted by another process.
+ def test_get_storage_group_from_masking_view(self):
+ conn = self.fake_ecom_connection()
+ foundStorageGroupInstanceName = (
+ self.driver.common.masking._get_storage_group_from_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The storage group has been found.
+ self.assertEqual(
+ self.data.storagegroupname,
+ conn.GetInstance(foundStorageGroupInstanceName)['ElementName'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundStorageGroupInstanceName2 = (
+ self.driver.common.masking._get_storage_group_from_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The storage group has not been found as it has been deleted
+ # externally or by another thread.
+ self.assertIsNone(foundStorageGroupInstanceName2)
+
+ # Bug 1393555 - initiator group has been deleted by another process.
+ def test_get_initiator_group_from_masking_view(self):
+ conn = self.fake_ecom_connection()
+ foundInitiatorGroupInstanceName = (
+ self.driver.common.masking._get_initiator_group_from_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The initiator group has been found.
+ self.assertEqual(
+ self.data.initiatorgroup_name,
+ conn.GetInstance(foundInitiatorGroupInstanceName)['ElementName'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundInitiatorGroupInstanceName2 = (
+ self.driver.common.masking._get_storage_group_from_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The initiator group has not been found as it has been deleted
+ # externally or by another thread.
+ self.assertIsNone(foundInitiatorGroupInstanceName2)
+
+ # Bug 1393555 - port group has been deleted by another process.
+ def test_get_port_group_from_masking_view(self):
+ conn = self.fake_ecom_connection()
+ foundPortGroupInstanceName = (
+ self.driver.common.masking._get_port_group_from_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The port group has been found.
+ self.assertEqual(
+ self.data.port_group,
+ conn.GetInstance(foundPortGroupInstanceName)['ElementName'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundPortGroupInstanceName2 = (
+ self.driver.common.masking._get_port_group_from_masking_view(
+ conn, self.data.lunmaskctrl_name, self.data.storage_system))
+ # The port group has not been found as it has been deleted
+ # externally or by another thread.
+ self.assertIsNone(foundPortGroupInstanceName2)
+
+ # Bug 1393555 - initiator group has been deleted by another process.
+ def test_find_initiator_group(self):
+ conn = self.fake_ecom_connection()
+ controllerConfigService = (
+ self.driver.utils.find_controller_configuration_service(
+ conn, self.data.storage_system))
+
+ foundInitiatorGroupInstanceName = (
+ self.driver.common.masking._find_initiator_masking_group(
+ conn, controllerConfigService, self.data.initiatorNames))
+ # The initiator group has been found.
+ self.assertEqual(
+ self.data.initiatorgroup_name,
+ conn.GetInstance(foundInitiatorGroupInstanceName)['ElementName'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundInitiatorGroupInstanceName2 = (
+ self.driver.common.masking._find_initiator_masking_group(
+ conn, controllerConfigService, self.data.initiatorNames))
+ # The initiator group has not been found as it has been deleted
+ # externally or by another thread.
+ self.assertIsNone(foundInitiatorGroupInstanceName2)
+
+ # Bug 1393555 - hardware id has been deleted by another process.
+ def test_get_storage_hardware_id_instance_names(self):
+ conn = self.fake_ecom_connection()
+ foundHardwareIdInstanceNames = (
+ self.driver.common.masking._get_storage_hardware_id_instance_names(
+ conn, self.data.initiatorNames, self.data.storage_system))
+ # The hardware id list has been found.
+ self.assertEqual(
+ '123456789012345',
+ conn.GetInstance(
+ foundHardwareIdInstanceNames[0])['StorageID'])
+
+ self.driver.common.masking.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundHardwareIdInstanceNames2 = (
+ self.driver.common.masking._get_storage_hardware_id_instance_names(
+ conn, self.data.initiatorNames, self.data.storage_system))
+ # The hardware id list has not been found as it has been removed
+ # externally.
+ self.assertTrue(len(foundHardwareIdInstanceNames2) == 0)
+
+ # Bug 1393555 - controller has been deleted by another process.
+ def test_find_lunmasking_scsi_protocol_controller(self):
+ self.driver.common.conn = self.fake_ecom_connection()
+ foundControllerInstanceName = (
+ self.driver.common._find_lunmasking_scsi_protocol_controller(
+ self.data.storage_system, self.data.connector))
+ # The controller has been found.
+ self.assertEqual(
+ 'OS-fakehost-gold-MV',
+ self.driver.common.conn.GetInstance(
+ foundControllerInstanceName)['ElementName'])
+
+ self.driver.common.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundControllerInstanceName2 = (
+ self.driver.common._find_lunmasking_scsi_protocol_controller(
+ self.data.storage_system, self.data.connector))
+ # The controller has not been found as it has been removed
+ # externally.
+ self.assertIsNone(foundControllerInstanceName2)
+
+ # Bug 1393555 - storage group has been deleted by another process.
+ def test_get_policy_default_storage_group(self):
+ conn = self.fake_ecom_connection()
+ controllerConfigService = (
+ self.driver.utils.find_controller_configuration_service(
+ conn, self.data.storage_system))
+
+ foundStorageMaskingGroupInstanceName = (
+ self.driver.common.fast.get_policy_default_storage_group(
+ conn, controllerConfigService, 'OS_default'))
+ # The storage group has been found.
+ self.assertEqual(
+ 'OS_default_GOLD1_SG',
+ conn.GetInstance(
+ foundStorageMaskingGroupInstanceName)['ElementName'])
+
+ self.driver.common.fast.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundStorageMaskingGroupInstanceName2 = (
+ self.driver.common.fast.get_policy_default_storage_group(
+ conn, controllerConfigService, 'OS_default'))
+ # The storage group has not been found as it has been removed
+ # externally.
+ self.assertIsNone(foundStorageMaskingGroupInstanceName2)
+
+ # Bug 1393555 - policy has been deleted by another process.
+ def test_get_capacities_associated_to_policy(self):
+ conn = self.fake_ecom_connection()
+ total_capacity_gb, free_capacity_gb = (
+ self.driver.common.fast.get_capacities_associated_to_policy(
+ conn, self.data.storage_system, self.data.policyrule))
+ # The capacities associated to the policy have been found.
+ self.assertEqual(self.data.totalmanagedspace_gbs, total_capacity_gb)
+ self.assertEqual(self.data.subscribedcapacity_gbs, free_capacity_gb)
+
+ self.driver.common.fast.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ total_capacity_gb_2, free_capacity_gb_2 = (
+ self.driver.common.fast.get_capacities_associated_to_policy(
+ conn, self.data.storage_system, self.data.policyrule))
+ # The capacities have not been found as the policy has been
+ # removed externally.
+ self.assertEqual(0, total_capacity_gb_2)
+ self.assertEqual(0, free_capacity_gb_2)
+
+ # Bug 1393555 - storage group has been deleted by another process.
+ def test_find_storage_masking_group(self):
+ conn = self.fake_ecom_connection()
+ controllerConfigService = (
+ self.driver.utils.find_controller_configuration_service(
+ conn, self.data.storage_system))
+
+ foundStorageMaskingGroupInstanceName = (
+ self.driver.common.utils.find_storage_masking_group(
+ conn, controllerConfigService, self.data.storagegroupname))
+ # The storage group has been found.
+ self.assertEqual(
+ self.data.storagegroupname,
+ conn.GetInstance(
+ foundStorageMaskingGroupInstanceName)['ElementName'])
+
+ self.driver.common.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundStorageMaskingGroupInstanceName2 = (
+ self.driver.common.utils.find_storage_masking_group(
+ conn, controllerConfigService, self.data.storagegroupname))
+ # The storage group has not been found as it has been removed
+ # externally.
+ self.assertIsNone(foundStorageMaskingGroupInstanceName2)
+
+ # Bug 1393555 - pool has been deleted by another process.
+ def test_get_pool_by_name(self):
+ conn = self.fake_ecom_connection()
+
+ foundPoolInstanceName = self.driver.common.utils.get_pool_by_name(
+ conn, self.data.poolname, self.data.storage_system)
+ # The pool has been found.
+ self.assertEqual(
+ self.data.poolname,
+ conn.GetInstance(foundPoolInstanceName)['ElementName'])
+
+ self.driver.common.utils.get_existing_instance = mock.Mock(
+ return_value=None)
+ foundPoolInstanceName2 = self.driver.common.utils.get_pool_by_name(
+ conn, self.data.poolname, self.data.storage_system)
+ # The pool has not been found as it has been removed externally.
+ self.assertIsNone(foundPoolInstanceName2)
+
def test_get_volume_stats_1364232(self):
self.create_fake_config_file_1364232()
self.assertEqual('000198700439',
os.remove(self.config_file_1364232)
@mock.patch.object(
- EMCVMAXCommon,
- '_find_storageSystem',
+ EMCVMAXUtils,
+ 'find_storageSystem',
return_value=None)
@mock.patch.object(
EMCVMAXFast,
'volume_backend_name': 'ISCSINoFAST'})
@mock.patch.object(
EMCVMAXUtils,
- 'check_if_volume_is_concatenated',
+ 'check_if_volume_is_extendable',
return_value='False')
def test_extend_volume_striped_no_fast_failed(
- self, _mock_volume_type, _mock_is_concatenated):
+ self, _mock_volume_type, _mock_is_extendable):
newSize = '2'
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.extend_volume,
return
@mock.patch.object(
- EMCVMAXCommon,
- '_find_storageSystem',
+ EMCVMAXUtils,
+ 'find_storageSystem',
return_value=None)
@mock.patch.object(
EMCVMAXFast,
return_value={'volume_backend_name': 'ISCSIFAST'})
@mock.patch.object(
EMCVMAXUtils,
- 'check_if_volume_is_concatenated',
+ 'check_if_volume_is_extendable',
return_value='False')
def test_extend_volume_striped_fast_failed(
- self, _mock_volume_type, _mock_is_concatenated):
+ self, _mock_volume_type, _mock_is_extendable):
newSize = '2'
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.extend_volume,
return
@mock.patch.object(
- EMCVMAXCommon,
- '_find_storageSystem',
+ EMCVMAXUtils,
+ 'find_storageSystem',
return_value=None)
@mock.patch.object(
EMCVMAXFast,
return_value={'volume_backend_name': 'FCNoFAST'})
@mock.patch.object(
EMCVMAXUtils,
- 'check_if_volume_is_concatenated',
+ 'check_if_volume_is_extendable',
return_value='False')
def test_extend_volume_striped_no_fast_failed(
- self, _mock_volume_type, _mock_is_concatenated):
+ self, _mock_volume_type, _mock_is_extendable):
newSize = '2'
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.extend_volume,
return
@mock.patch.object(
- EMCVMAXCommon,
- '_find_storageSystem',
+ EMCVMAXUtils,
+ 'find_storageSystem',
return_value=None)
@mock.patch.object(
EMCVMAXFast,
return_value={'volume_backend_name': 'FCFAST'})
@mock.patch.object(
EMCVMAXUtils,
- 'check_if_volume_is_concatenated',
+ 'check_if_volume_is_extendable',
return_value='False')
def test_extend_volume_striped_fast_failed(self, _mock_volume_type,
- _mock_is_concatenated):
+ _mock_is_extendable):
newSize = '2'
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.extend_volume,
additionalVolumeSize = self.utils.convert_gb_to_bits(
additionalVolumeSize)
- # is the volume concatenated
- isConcatenated = self.utils.check_if_volume_is_concatenated(
+ # Is the volume extendable.
+ isConcatenated = self.utils.check_if_volume_is_extendable(
self.conn, volumeInstance)
if 'True' not in isConcatenated:
exceptionMessage = (_(
if self.conn is None:
self._set_ecom_credentials(emcConfigFileName)
- storageSystemInstanceName = self._find_storageSystem(arrayName)
+ storageSystemInstanceName = (
+ self.utils.find_storageSystem(self.conn, arrayName))
+
isTieringPolicySupported = (
self.fast.is_tiering_policy_enabled_on_storage_system(
self.conn, storageSystemInstanceName))
return conn
- def _find_storageSystem(self, arrayStr):
- """Find an array instance name given the array name.
-
- :param arrayStr: the array Serial number (String)
- :returns: foundPoolInstanceName, the CIM Instance Name of the Pool
- """
- foundStorageSystemInstanceName = None
- storageSystemInstanceNames = self.conn.EnumerateInstanceNames(
- 'EMC_StorageSystem')
- for storageSystemInstanceName in storageSystemInstanceNames:
- arrayName = storageSystemInstanceName['Name']
- index = arrayName.find(arrayStr)
- if index > -1:
- foundStorageSystemInstanceName = storageSystemInstanceName
-
- if foundStorageSystemInstanceName is None:
- exceptionMessage = (_("StorageSystem %(array)s is not found.")
- % {'storage_array': arrayStr})
- LOG.error(exceptionMessage)
- raise exception.VolumeBackendAPIException(data=exceptionMessage)
-
- LOG.debug("Array Found: %(array)s.."
- % {'array': arrayStr})
-
- return foundStorageSystemInstanceName
-
def _find_pool_in_array(self, arrayStr, poolNameInStr):
"""Find a pool based on the pool name on a given array.
foundPoolInstanceName = None
systemNameStr = None
- storageSystemInstanceName = self._find_storageSystem(arrayStr)
+ storageSystemInstanceName = self.utils.find_storageSystem(self.conn,
+ arrayStr)
vpools = self.conn.AssociatorNames(
storageSystemInstanceName,
management service
:returns: foundInstances, the list of storage hardware ID instances
"""
- foundInstances = []
+ foundHardwareIdList = []
wwpns = self._find_initiator_names(connector)
- hardwareIdInstanceNames = (
- self.utils.get_hardware_id_instance_names_from_array(
+ hardwareIdInstances = (
+ self.utils.get_hardware_id_instances_from_array(
self.conn, hardwareIdManagementService))
- for hardwareIdInstanceName in hardwareIdInstanceNames:
- hardwareIdInstance = self.conn.GetInstance(hardwareIdInstanceName)
+ for hardwareIdInstance in hardwareIdInstances:
storageId = hardwareIdInstance['StorageID']
for wwpn in wwpns:
if wwpn.lower() == storageId.lower():
- foundInstances.append(hardwareIdInstance.path)
+ # Check that the found hardwareId has not been
+ # deleted. If it has, we don't want to add it to the list.
+ instance = self.utils.get_existing_instance(
+ self.conn, hardwareIdInstance.path)
+ if instance is None:
+ # hardwareId doesn't exist any more. Skip it.
+ break
+ foundHardwareIdList.append(hardwareIdInstance.path)
break
LOG.debug("Storage Hardware IDs for %(wwpns)s is "
"%(foundInstances)s."
% {'wwpns': wwpns,
- 'foundInstances': foundInstances})
+ 'foundInstances': foundHardwareIdList})
- return foundInstances
+ return foundHardwareIdList
def _register_config_file_from_config_group(self, configGroupName):
"""Given the config group name register the file.
def _find_lunmasking_scsi_protocol_controller(self, storageSystemName,
connector):
- """Find LunMaskingSCSIProtocolController for the local host
+ """Find LunMaskingSCSIProtocolController for the local host.
Find out how many volumes are mapped to a host
- associated to the LunMaskingSCSIProtocolController
+ associated to the LunMaskingSCSIProtocolController.
- :param connector: volume object to be deleted
:param storageSystemName: the storage system name
- :returns: foundCtrl
+ :param connector: volume object to be deleted
+ :returns: foundControllerInstanceName
"""
- foundCtrl = None
+ foundControllerInstanceName = None
initiators = self._find_initiator_names(connector)
- controllers = self.conn.EnumerateInstanceNames(
- 'EMC_LunMaskingSCSIProtocolController')
- for ctrl in controllers:
- if storageSystemName != ctrl['SystemName']:
- continue
- associators = self.conn.Associators(
- ctrl, ResultClass='EMC_StorageHardwareID')
- for assoc in associators:
- # if EMC_StorageHardwareID matches the initiator,
- # we found the existing EMC_LunMaskingSCSIProtocolController
- # (Storage Group for VNX)
- # we can use for masking a new LUN
- hardwareid = assoc['StorageID']
- for initiator in initiators:
- if hardwareid.lower() == initiator.lower():
- foundCtrl = ctrl
- break
- if foundCtrl is not None:
- break
+ storageSystemInstanceName = self.utils.find_storageSystem(
+ self.conn, storageSystemName)
+ controllerInstanceNames = self.conn.AssociatorNames(
+ storageSystemInstanceName,
+ ResultClass='EMC_LunMaskingSCSIProtocolController')
- if foundCtrl is not None:
+ for controllerInstanceName in controllerInstanceNames:
+ try:
+ # This is a check to see if the controller has
+ # been deleted.
+ self.conn.GetInstance(controllerInstanceName)
+ storageHardwareIdInstances = self.conn.Associators(
+ controllerInstanceName,
+ ResultClass='EMC_StorageHardwareID')
+
+ for storageHardwareIdInstance in storageHardwareIdInstances:
+ # If EMC_StorageHardwareID matches the initiator, we
+ # found the existing EMC_LunMaskingSCSIProtocolController.
+ hardwareid = storageHardwareIdInstance['StorageID']
+ for initiator in initiators:
+ if hardwareid.lower() == initiator.lower():
+ # This is a check to see if the controller
+ # has been deleted.
+ instance = self.utils.get_existing_instance(
+ self.conn, controllerInstanceName)
+ if instance is None:
+ # Skip this controller as it doesn't exist
+ # any more
+ pass
+ else:
+ foundControllerInstanceName = (
+ controllerInstanceName)
+ break
+
+ if foundControllerInstanceName is not None:
+ break
+ except pywbem.cim_operations.CIMError as arg:
+ instance = self.utils.process_exception_args(
+ arg, controllerInstanceName)
+ if instance is None:
+ # Skip this controller as it doesn't exist any more.
+ pass
+
+ if foundControllerInstanceName is not None:
break
LOG.debug("LunMaskingSCSIProtocolController for storage system "
- "%(storage_system)s and initiator %(initiator)s is "
+ "%(storage_system)s and initiator %(initiator)s is "
"%(ctrl)s."
% {'storage_system': storageSystemName,
'initiator': initiators,
- 'ctrl': foundCtrl})
- return foundCtrl
+ 'ctrl': foundControllerInstanceName})
+ return foundControllerInstanceName
def get_num_volumes_mapped(self, volume, connector):
"""Returns how many volumes are in the same zone as the connector.
:returns: storageGroupInstanceName - instance name of the default
storage group
"""
- storageMaskingGroupInstanceNames = conn.AssociatorNames(
+ foundStorageMaskingGroupInstanceName = None
+ storageMaskingGroupInstances = conn.Associators(
controllerConfigService, ResultClass='CIM_DeviceMaskingGroup')
- for storageMaskingGroupInstanceName in \
- storageMaskingGroupInstanceNames:
- storageMaskingGroupInstance = conn.GetInstance(
- storageMaskingGroupInstanceName)
+ for storageMaskingGroupInstance in \
+ storageMaskingGroupInstances:
+
if ('_default_' in storageMaskingGroupInstance['ElementName'] and
policyName in storageMaskingGroupInstance['ElementName']):
- return storageMaskingGroupInstanceName
+ # Check that it has not been recently deleted.
+ instance = self.utils.get_existing_instance(
+ conn, storageMaskingGroupInstance.path)
+ if instance is None:
+ # Storage Group doesn't exist any more.
+ foundStorageMaskingGroupInstanceName = None
+ else:
+ foundStorageMaskingGroupInstanceName = instance.path
- return None
+ return foundStorageMaskingGroupInstanceName
def _get_associated_storage_groups_from_tier_policy(
self, conn, tierPolicyInstanceName):
tierInstanceNames = self.get_associated_tier_from_tier_policy(
conn, policyInstanceName)
for tierInstanceName in tierInstanceNames:
- poolInsttanceNames = self.get_associated_pools_from_tier(
+ # Check that tier hasn't suddenly been deleted.
+ instance = self.utils.get_existing_instance(conn, tierInstanceName)
+ if instance is None:
+ # Tier doesn't exist any more.
+ break
+
+ poolInstanceNames = self.get_associated_pools_from_tier(
conn, tierInstanceName)
- for poolInstanceName in poolInsttanceNames:
- storagePoolInstance = conn.GetInstance(
- poolInstanceName, LocalOnly=False)
+ for poolInstanceName in poolInstanceNames:
+ # Check that pool hasn't suddenly been deleted.
+ storagePoolInstance = self.utils.get_existing_instance(
+ conn, poolInstanceName)
+
+ if storagePoolInstance is None:
+ # Pool doesn't exist any more.
+ break
+
total_capacity_gb += self.utils.convert_bits_to_gbs(
storagePoolInstance['TotalManagedSpace'])
allocated_capacity_gb += self.utils.convert_bits_to_gbs(
storagePoolInstance['EMCSubscribedCapacity'])
+
LOG.debug(
"policyName:%(policyName)s, pool: %(poolInstanceName)s, "
"allocated_capacity_gb = %(allocated_capacity_gb)lu"
:returns: foundMaskingViewInstanceName masking view instance name
"""
foundMaskingViewInstanceName = None
- maskingViewInstanceNames = conn.EnumerateInstanceNames(
- 'EMC_LunMaskingSCSIProtocolController')
-
- for maskingViewInstanceName in maskingViewInstanceNames:
- if storageSystemName == maskingViewInstanceName['SystemName']:
- instance = conn.GetInstance(
- maskingViewInstanceName, LocalOnly=False)
- if maskingViewName == instance['ElementName']:
- foundMaskingViewInstanceName = maskingViewInstanceName
- break
+
+ storageSystemInstanceName = self.utils.find_storageSystem(
+ conn, storageSystemName)
+ maskingViewInstances = conn.Associators(
+ storageSystemInstanceName,
+ ResultClass='EMC_LunMaskingSCSIProtocolController')
+
+ for maskingViewInstance in maskingViewInstances:
+ if maskingViewName == maskingViewInstance['ElementName']:
+ foundMaskingViewInstanceName = maskingViewInstance.path
+ break
if foundMaskingViewInstanceName is not None:
- infoMessage = (_(
- "Found existing masking view: %(maskingViewName)s ")
- % {'maskingViewName': maskingViewName})
- LOG.info(infoMessage)
+ # now check that is has not been deleted
+ instance = self.utils.get_existing_instance(
+ conn, foundMaskingViewInstanceName)
+ if instance is None:
+ foundMaskingViewInstanceName = None
+ LOG.error(_LE(
+ "Looks like masking view: %(maskingViewName)s "
+ "has recently been deleted."),
+ {'maskingViewName': maskingViewName})
+ else:
+ LOG.info(_LI(
+ "Found existing masking view: %(maskingViewName)s "),
+ {'maskingViewName': maskingViewName})
+
return foundMaskingViewInstanceName
def _create_storage_group(
:returns: foundPortGroup storage group instance name
"""
foundPortGroupInstanceName = None
- portMaskingGroupInstanceNames = conn.AssociatorNames(
- controllerConfigService, resultClass='CIM_TargetMaskingGroup')
-
- for portMaskingGroupInstanceName in portMaskingGroupInstanceNames:
- instance = conn.GetInstance(
- portMaskingGroupInstanceName, LocalOnly=False)
- if portGroupName == instance['ElementName']:
- foundPortGroupInstanceName = portMaskingGroupInstanceName
+ portMaskingGroupInstances = conn.Associators(
+ controllerConfigService, ResultClass='CIM_TargetMaskingGroup')
+
+ for portMaskingGroupInstance in portMaskingGroupInstances:
+ if portGroupName == portMaskingGroupInstance['ElementName']:
+ # Check to see if it has been recently deleted.
+ instance = self.utils.get_existing_instance(
+ conn, portMaskingGroupInstance.path)
+ if instance is None:
+ foundPortGroupInstanceName = None
+ else:
+ foundPortGroupInstanceName = instance.path
break
if foundPortGroupInstanceName is None:
:param initiatorName: the list of initiator names
:returns: foundInitiatorMaskingGroup
"""
- foundInitiatorMaskingGroupName = None
+ foundInitiatorMaskingGroupInstanceName = None
- initiatorMaskingGroupNames = (
+ initiatorMaskingGroupInstanceNames = (
conn.AssociatorNames(controllerConfigService,
ResultClass='CIM_InitiatorMaskingGroup'))
- for initiatorMaskingGroupName in initiatorMaskingGroupNames:
- initiatorMaskingGroup = conn.GetInstance(
- initiatorMaskingGroupName, LocalOnly=False)
- associators = (
- conn.Associators(initiatorMaskingGroup.path,
+ for initiatorMaskingGroupInstanceName in \
+ initiatorMaskingGroupInstanceNames:
+ # Check that it hasn't been deleted. If it has, continue
+ # to the next one in the loop.
+ instance = self.utils.get_existing_instance(
+ conn, initiatorMaskingGroupInstanceName)
+ if instance is None:
+ continue
+
+ storageHardwareIdInstances = (
+ conn.Associators(initiatorMaskingGroupInstanceName,
ResultClass='EMC_StorageHardwareID'))
- for assoc in associators:
- # if EMC_StorageHardwareID matches the initiator,
- # we found the existing EMC_LunMaskingSCSIProtocolController
- # (Storage Group for VNX)
- # we can use for masking a new LUN
- hardwareid = assoc['StorageID']
+ for storageHardwareIdInstance in storageHardwareIdInstances:
+ # If EMC_StorageHardwareID matches the initiator,
+ # we found the existing CIM_InitiatorMaskingGroup.
+ hardwareid = storageHardwareIdInstance['StorageID']
for initiator in initiatorNames:
if six.text_type(hardwareid).lower() == \
six.text_type(initiator).lower():
- foundInitiatorMaskingGroupName = (
- initiatorMaskingGroupName)
+ foundInitiatorMaskingGroupInstanceName = (
+ initiatorMaskingGroupInstanceName)
break
- if foundInitiatorMaskingGroupName is not None:
+ if foundInitiatorMaskingGroupInstanceName is not None:
break
- if foundInitiatorMaskingGroupName is not None:
+ if foundInitiatorMaskingGroupInstanceName is not None:
break
- return foundInitiatorMaskingGroupName
+ return foundInitiatorMaskingGroupInstanceName
def _get_storage_hardware_id_instance_names(
self, conn, initiatorNames, storageSystemName):
self.utils.find_storage_hardwareid_service(
conn, storageSystemName))
- hardwareIdInstanceNames = (
- self.utils.get_hardware_id_instance_names_from_array(
+ hardwareIdInstances = (
+ self.utils.get_hardware_id_instances_from_array(
conn, hardwareIdManagementService))
-
- for hardwareIdInstanceName in hardwareIdInstanceNames:
- hardwareIdInstance = conn.GetInstance(hardwareIdInstanceName)
+ for hardwareIdInstance in hardwareIdInstances:
storageId = hardwareIdInstance['StorageID']
for initiatorName in initiatorNames:
- LOG.debug("The storage Id is : %(storageId)s "
- % {'storageId': storageId.lower()})
- LOG.debug("The initiatorName is : %(initiatorName)s "
- % {'initiatorName': initiatorName.lower()})
if storageId.lower() == initiatorName.lower():
+ # Check that the found hardwareId has been deleted.
+ # If it has, we don't want to add it to the list.
+ instance = self.utils.get_existing_instance(
+ conn, hardwareIdInstance.path)
+ if instance is None:
+ # HardwareId doesn't exist. Skip it.
+ break
+
foundHardwardIDsInstanceNames.append(
- hardwareIdInstanceName)
+ hardwareIdInstance.path)
break
LOG.debug(
:returns: instance name foundStorageGroupInstanceName
"""
foundStorageGroupInstanceName = None
- maskingviews = conn.EnumerateInstanceNames(
- 'EMC_LunMaskingSCSIProtocolController')
- for view in maskingviews:
- if storageSystemName == view['SystemName']:
- instance = conn.GetInstance(view, LocalOnly=False)
- if maskingViewName == instance['ElementName']:
- foundView = view
- break
+ foundView = self._find_masking_view(
+ conn, maskingViewName, storageSystemName)
+ if foundView is not None:
+ foundStorageGroupInstanceName = (
+ self._get_storage_group_from_masking_view_instance(
+ conn, foundView))
+
+ LOG.debug("Masking view: %(view)s DeviceMaskingGroup: "
+ "%(masking)s.",
+ {'view': maskingViewName,
+ 'masking': foundStorageGroupInstanceName})
+ else:
+ LOG.warn(_LW("Unable to find Masking view: %(view)s."),
+ {'view': maskingViewName})
+
+ return foundStorageGroupInstanceName
+
+ def _get_storage_group_from_masking_view_instance(
+ self, conn, maskingViewInstance):
+ """Gets the Device Masking Group from masking view instance.
+ :param conn: the connection to the ecom server
+ :param maskingViewInstance
+ :returns: instance name foundStorageGroupInstanceName
+ """
+ foundStorageGroupInstanceName = None
groups = conn.AssociatorNames(
- foundView,
+ maskingViewInstance,
ResultClass='CIM_DeviceMaskingGroup')
if groups[0] > 0:
foundStorageGroupInstanceName = groups[0]
- LOG.debug("Masking view: %(view)s DeviceMaskingGroup: %(masking)s."
- % {'view': maskingViewName,
- 'masking': foundStorageGroupInstanceName})
-
return foundStorageGroupInstanceName
def _get_storage_group_instance_name(
infoMessage = (_(
"Performing rollback on Volume: %(volumeName)s "
"To return it to the default storage group for FAST policy"
- " %(fastPolicyName)s. ")
+ " %(fastPolicyName)s.")
% {'volumeName': volumeName,
'fastPolicyName': fastPolicyName})
LOG.warning(_LW("No storage group found. %s"), infoMessage)
:returns: instance name foundInitiatorMaskingGroupInstanceName
"""
foundInitiatorMaskingGroupInstanceName = None
+ foundView = self._find_masking_view(
+ conn, maskingViewName, storageSystemName)
+ if foundView is not None:
+ groups = conn.AssociatorNames(
+ foundView,
+ ResultClass='CIM_InitiatorMaskingGroup')
+ if len(groups):
+ foundInitiatorMaskingGroupInstanceName = groups[0]
- maskingviews = conn.EnumerateInstanceNames(
- 'EMC_LunMaskingSCSIProtocolController')
- for view in maskingviews:
- if storageSystemName == view['SystemName']:
- instance = conn.GetInstance(view, LocalOnly=False)
- if maskingViewName == instance['ElementName']:
- foundView = view
- break
-
- groups = conn.AssociatorNames(
- foundView,
- ResultClass='CIM_InitiatorMaskingGroup')
- if len(groups):
- foundInitiatorMaskingGroupInstanceName = groups[0]
-
- LOG.debug(
- "Masking view: %(view)s InitiatorMaskingGroup: %(masking)s."
- % {'view': maskingViewName,
- 'masking': foundInitiatorMaskingGroupInstanceName})
+ LOG.debug(
+ "Masking view: %(view)s InitiatorMaskingGroup: %(masking)s."
+ % {'view': maskingViewName,
+ 'masking': foundInitiatorMaskingGroupInstanceName})
+ else:
+ LOG.warn(_LW("Unable to find Masking view: %(view)s.")
+ % {'view': maskingViewName})
return foundInitiatorMaskingGroupInstanceName
:returns: instance name foundPortMaskingGroupInstanceName
"""
foundPortMaskingGroupInstanceName = None
+ foundView = self._find_masking_view(
+ conn, maskingViewName, storageSystemName)
- maskingviews = conn.EnumerateInstanceNames(
- 'EMC_LunMaskingSCSIProtocolController')
- for view in maskingviews:
- if storageSystemName == view['SystemName']:
- instance = conn.GetInstance(view, LocalOnly=False)
- if maskingViewName == instance['ElementName']:
- foundView = view
- break
-
- groups = conn.AssociatorNames(
- foundView,
- ResultClass='CIM_TargetMaskingGroup')
- if len(groups) > 0:
- foundPortMaskingGroupInstanceName = groups[0]
+ if foundView is not None:
+ groups = conn.AssociatorNames(
+ foundView,
+ ResultClass='CIM_TargetMaskingGroup')
+ if len(groups) > 0:
+ foundPortMaskingGroupInstanceName = groups[0]
- LOG.debug(
- "Masking view: %(view)s InitiatorMaskingGroup: %(masking)s."
- % {'view': maskingViewName,
- 'masking': foundPortMaskingGroupInstanceName})
+ LOG.debug(
+ "Masking view: %(view)s InitiatorMaskingGroup: %(masking)s."
+ % {'view': maskingViewName,
+ 'masking': foundPortMaskingGroupInstanceName})
return foundPortMaskingGroupInstanceName
:param foundStorageGroup: storage group instance name
"""
foundStorageMaskingGroupInstanceName = None
+ storageMaskingGroupInstances = (
+ conn.Associators(controllerConfigService,
+ ResultClass='CIM_DeviceMaskingGroup'))
- storageMaskingGroupInstanceNames = (
- conn.AssociatorNames(controllerConfigService,
- ResultClass='CIM_DeviceMaskingGroup'))
+ for storageMaskingGroupInstance in \
+ storageMaskingGroupInstances:
- for storageMaskingGroupInstanceName in \
- storageMaskingGroupInstanceNames:
- storageMaskingGroupInstance = conn.GetInstance(
- storageMaskingGroupInstanceName)
if storageGroupName == storageMaskingGroupInstance['ElementName']:
- foundStorageMaskingGroupInstanceName = (
- storageMaskingGroupInstanceName)
+ # Check that it has not been deleted recently.
+ instance = self.get_existing_instance(
+ conn, storageMaskingGroupInstance.path)
+ if instance is None:
+ # Storage group not found.
+ foundStorageMaskingGroupInstanceName = None
+ else:
+ foundStorageMaskingGroupInstanceName = (
+ storageMaskingGroupInstance.path)
break
return foundStorageMaskingGroupInstanceName
foundPoolInstanceName = foundPoolInstanceNames[0]
return foundPoolInstanceName
- def check_if_volume_is_concatenated(self, conn, volumeInstance):
- """Checks if a volume is concatenated or not.
+ def check_if_volume_is_extendable(self, conn, volumeInstance):
+ """Checks if a volume is extendable or not.
Check underlying CIM_StorageExtent to see if the volume is
concatenated or not.
- If isConcatenated is true then it is a composite
+ If isConcatenated is true then it is a concatenated and
+ extendable.
If isConcatenated is False and isVolumeComposite is True then
- it is a striped
+ it is striped and not extendable.
If isConcatenated is False and isVolumeComposite is False then
- it has no composite type and we can proceed.
+ it has one member only but is still extendable.
:param conn: the connection information to the ecom server
:param volumeInstance: the volume instance
isVolumeComposite = self.check_if_volume_is_composite(
conn, volumeInstance)
- storageExtentInstanceNames = conn.AssociatorNames(
+ storageExtentInstances = conn.Associators(
volumeInstance.path,
ResultClass='CIM_StorageExtent')
- if len(storageExtentInstanceNames) > 0:
- storageExtentInstanceName = storageExtentInstanceNames[0]
- storageExtentInstance = conn.GetInstance(storageExtentInstanceName)
-
+ if len(storageExtentInstances) > 0:
+ storageExtentInstance = storageExtentInstances[0]
propertiesList = storageExtentInstance.properties.items()
for properties in propertiesList:
if properties[0] == 'IsConcatenated':
:param storageSystemName: string value of array
:returns: poolInstanceName - instance name of storage pool
"""
- poolInstanceName = None
+ foundPoolInstanceName = None
LOG.debug("storagePoolName: %(poolName)s, storageSystemName: %(array)s"
% {'poolName': storagePoolName,
'array': storageSystemName})
poolInstanceNames = conn.EnumerateInstanceNames(
'EMC_VirtualProvisioningPool')
- for pool in poolInstanceNames:
+ for poolInstanceName in poolInstanceNames:
poolName, systemName = (
- self.parse_pool_instance_id(pool['InstanceID']))
+ self.parse_pool_instance_id(poolInstanceName['InstanceID']))
if (poolName == storagePoolName and
storageSystemName in systemName):
- poolInstanceName = pool
+ # Check that the pool hasn't been recently deleted.
+ instance = self.get_existing_instance(conn, poolInstanceName)
+ if instance is None:
+ foundPoolInstanceName = None
+ else:
+ foundPoolInstanceName = poolInstanceName
+ break
- return poolInstanceName
+ return foundPoolInstanceName
def convert_bits_to_gbs(self, strBitSize):
"""Convert Bits(string) to GB(string).
else:
return protocol
- def get_hardware_id_instance_names_from_array(
+ def get_hardware_id_instances_from_array(
self, conn, hardwareIdManagementService):
"""Get all the hardware ids from an array.
:param conn: connection to the ecom server
:param: hardwareIdManagementService - hardware id management service
- :returns: hardwareIdInstanceNames - the list of hardware
- id instance names
+ :returns: hardwareIdInstances - the list of hardware id instances
"""
- hardwareIdInstanceNames = (
- conn.AssociatorNames(hardwareIdManagementService,
- ResultClass='SE_StorageHardwareID'))
+ hardwareIdInstances = (
+ conn.Associators(hardwareIdManagementService,
+ ResultClass='EMC_StorageHardwareID'))
- return hardwareIdInstanceNames
+ return hardwareIdInstances
def find_ip_protocol_endpoint(self, conn, storageSystemName):
'''Find the IP protocol endpoint for ISCSI.
raise exception.VolumeBackendAPIException(
data=exceptionMessage)
return instance
+
+ def find_storageSystem(self, conn, arrayStr):
+ """Find an array instance name given the array name.
+
+ :param arrayStr: the array Serial number (string)
+ :returns: foundPoolInstanceName, the CIM Instance Name of the Pool
+ """
+ foundStorageSystemInstanceName = None
+ storageSystemInstanceNames = conn.EnumerateInstanceNames(
+ 'EMC_StorageSystem')
+ for storageSystemInstanceName in storageSystemInstanceNames:
+ arrayName = storageSystemInstanceName['Name']
+ index = arrayName.find(arrayStr)
+ if index > -1:
+ foundStorageSystemInstanceName = storageSystemInstanceName
+
+ if foundStorageSystemInstanceName is None:
+ exceptionMessage = (_("StorageSystem %(array)s was not found.")
+ % {'array': arrayStr})
+ LOG.error(exceptionMessage)
+ raise exception.VolumeBackendAPIException(data=exceptionMessage)
+
+ LOG.debug("Array Found: %(array)s."
+ % {'array': arrayStr})
+
+ return foundStorageSystemInstanceName