¡@

Home 

OpenStack Study: test_emc_smis.py

OpenStack Index

**** CubicPower OpenStack Study ****

# Copyright (c) 2012 - 2014 EMC Corporation, 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 os

import shutil

import tempfile

import time

from xml.dom.minidom import Document

import mock

from cinder import exception

from cinder.openstack.common import log as logging

from cinder import test

from cinder import units

from cinder.volume.drivers.emc.emc_smis_common import EMCSMISCommon

from cinder.volume.drivers.emc.emc_smis_fc import EMCSMISFCDriver

from cinder.volume.drivers.emc.emc_smis_iscsi import EMCSMISISCSIDriver

from cinder.volume import volume_types

CINDER_EMC_CONFIG_FILE = '/etc/cinder/cinder_emc_config.xml'

LOG = logging.getLogger(__name__)

**** CubicPower OpenStack Study ****

class EMC_StorageVolume(dict):

pass

**** CubicPower OpenStack Study ****

class SE_ConcreteJob(dict):

pass

**** CubicPower OpenStack Study ****

class SE_StorageHardwareID(dict):

pass

**** CubicPower OpenStack Study ****

class FakeCIMInstanceName(dict):

**** CubicPower OpenStack Study ****

    def fake_getinstancename(self, classname, bindings):

        instancename = FakeCIMInstanceName()

        for key in bindings:

            instancename[key] = bindings[key]

        instancename.classname = classname

        instancename.namespace = 'root/emc'

        return instancename

**** CubicPower OpenStack Study ****

class FakeDB():

**** CubicPower OpenStack Study ****

    def volume_update(self, context, volume_id, model_update):

        pass

**** CubicPower OpenStack Study ****

    def snapshot_update(self, context, snapshot_id, model_update):

        pass

**** CubicPower OpenStack Study ****

    def volume_get(self, context, volume_id):

        conn = FakeEcomConnection()

        objectpath = {}

        objectpath['CreationClassName'] = 'Clar_StorageVolume'

        if volume_id == 'vol1':

            device_id = '1'

            objectpath['DeviceID'] = device_id

        else:

            objectpath['DeviceID'] = volume_id

        return conn.GetInstance(objectpath)

**** CubicPower OpenStack Study ****

class EMCSMISCommonData():

connector = {'ip': '10.0.0.2',

'initiator': 'iqn.1993-08.org.debian:01:222',

'wwpns': ["123456789012345", "123456789054321"],

'wwnns': ["223456789012345", "223456789054321"],

'host': 'fakehost'}

config_file_name = 'cinder_emc_config.xml'

storage_system = 'CLARiiON+APM00123456789'

storage_system_vmax = 'SYMMETRIX+000195900551'

lunmaskctrl_id =\

'CLARiiON+APM00123456789+00aa11bb22cc33dd44ff55gg66hh77ii88jj'

initiator1 = 'iqn.1993-08.org.debian:01:1a2b3c4d5f6g'

stconf_service_creationclass = 'Clar_StorageConfigurationService'

ctrlconf_service_creationclass = 'Clar_ControllerConfigurationService'

rep_service_creationclass = 'Clar_ReplicationService'

vol_creationclass = 'Clar_StorageVolume'

pool_creationclass = 'Clar_UnifiedStoragePool'

lunmask_creationclass = 'Clar_LunMaskingSCSIProtocolController'

unit_creationclass = 'CIM_ProtocolControllerForUnit'

storage_type = 'gold'

test_volume = {'name': 'vol1',

'size': 1,

'volume_name': 'vol1',

'id': '1',

'provider_auth': None,

'project_id': 'project',

'display_name': 'vol1',

'display_description': 'test volume',

'volume_type_id': None}

test_failed_volume = {'name': 'failed_vol',

'size': 1,

'volume_name': 'failed_vol',

'id': '4',

'provider_auth': None,

'project_id': 'project',

'display_name': 'failed_vol',

'display_description': 'test failed volume',

'volume_type_id': None}

test_snapshot = {'name': 'snapshot1',

'size': 1,

'id': '4444',

'volume_name': 'vol-vol1',

'volume_size': 1,

'project_id': 'project'}

test_clone = {'name': 'clone1',

'size': 1,

'volume_name': 'vol1',

'id': '2',

'provider_auth': None,

'project_id': 'project',

'display_name': 'clone1',

'display_description': 'volume created from snapshot',

'volume_type_id': None}

test_clone3 = {'name': 'clone3',

'size': 1,

'volume_name': 'vol1',

'id': '3',

'provider_auth': None,

'project_id': 'project',

'display_name': 'clone3',

'display_description': 'cloned volume',

'volume_type_id': None}

test_snapshot_vmax = {'name': 'snapshot_vmax',

'size': 1,

'id': '4445',

'volume_name': 'vol-vol1',

'volume_size': 1,

'project_id': 'project'}

failed_snapshot_replica = {'name': 'failed_snapshot_replica',

'size': 1,

'volume_name': 'vol-vol1',

'id': '5',

'provider_auth': None,

'project_id': 'project',

'display_name': 'vol1',

'display_description':

'failed snapshot replica',

'volume_type_id': None}

failed_snapshot_sync = {'name': 'failed_snapshot_sync',

'size': 1,

'volume_name': 'vol-vol1',

'id': '6',

'provider_auth': None,

'project_id': 'project',

'display_name': 'failed_snapshot_sync',

'display_description': 'failed snapshot sync',

'volume_type_id': None}

failed_clone_replica = {'name': 'failed_clone_replica',

'size': 1,

'volume_name': 'vol1',

'id': '7',

'provider_auth': None,

'project_id': 'project',

'display_name': 'vol1',

'display_description': 'failed clone replica',

'volume_type_id': None}

failed_clone_sync = {'name': 'failed_clone_sync',

'size': 1,

'volume_name': 'vol1',

'id': '8',

'provider_auth': None,

'project_id': 'project',

'display_name': 'vol1',

'display_description': 'failed clone sync',

'volume_type_id': None}

failed_delete_vol = {'name': 'failed_delete_vol',

'size': 1,

'volume_name': 'failed_delete_vol',

'id': '99999',

'provider_auth': None,

'project_id': 'project',

'display_name': 'failed delete vol',

'display_description': 'failed delete volume',

'volume_type_id': None}

failed_extend_vol = {'name': 'failed_extend_vol',

'size': 1,

'volume_name': 'failed_extend_vol',

'id': '9',

'provider_auth': None,

'project_id': 'project',

'display_name': 'failed_extend_vol',

'display_description': 'test failed extend volume',

'volume_type_id': None}

**** CubicPower OpenStack Study ****

class FakeEcomConnection():

**** CubicPower OpenStack Study ****

    def __init__(self, *args, **kwargs):

        self.data = EMCSMISCommonData()

**** CubicPower OpenStack Study ****

    def InvokeMethod(self, MethodName, Service, ElementName=None, InPool=None,

                     ElementType=None, Size=None,

                     SyncType=None, SourceElement=None,

                     Operation=None, Synchronization=None,

                     TheElements=None, TheElement=None,

                     LUNames=None, InitiatorPortIDs=None, DeviceAccesses=None,

                     ProtocolControllers=None,

                     MaskingGroup=None, Members=None,

                     HardwareId=None):

        rc = 0L

        myjob = SE_ConcreteJob()

        myjob.classname = 'SE_ConcreteJob'

        myjob['InstanceID'] = '9999'

        myjob['status'] = 'success'

        myjob['type'] = ElementName

        if ElementName == 'failed_vol' and \

                MethodName == 'CreateOrModifyElementFromStoragePool':

            rc = 10L

            myjob['status'] = 'failure'

        elif TheElement and TheElement['ElementName'] == 'failed_extend_vol' \

                and MethodName == 'CreateOrModifyElementFromStoragePool':

            rc = 10L

            myjob['status'] = 'failure'

        elif MethodName == 'CreateOrModifyElementFromStoragePool':

            rc = 0L

            myjob['status'] = 'success'

        elif ElementName == 'failed_snapshot_replica' and \

                MethodName == 'CreateElementReplica':

            rc = 10L

            myjob['status'] = 'failure'

        elif Synchronization and \

                Synchronization['SyncedElement']['ElementName'] \

                == 'failed_snapshot_sync' and \

                MethodName == 'ModifyReplicaSynchronization':

            rc = 10L

            myjob['status'] = 'failure'

        elif ElementName == 'failed_clone_replica' and \

                MethodName == 'CreateElementReplica':

            rc = 10L

            myjob['status'] = 'failure'

        elif Synchronization and \

                Synchronization['SyncedElement']['ElementName'] \

                == 'failed_clone_sync' and \

                MethodName == 'ModifyReplicaSynchronization':

            rc = 10L

            myjob['status'] = 'failure'

        elif TheElements and \

                TheElements[0]['DeviceID'] == '99999' and \

                MethodName == 'EMCReturnToStoragePool':

            rc = 10L

            myjob['status'] = 'failure'

        elif HardwareId:

            rc = 0L

            targetendpoints = {}

            endpoints = []

            endpoint = {}

            endpoint['Name'] = '1234567890123'

            endpoints.append(endpoint)

            endpoint2 = {}

            endpoint2['Name'] = '0987654321321'

            endpoints.append(endpoint2)

            targetendpoints['TargetEndpoints'] = endpoints

            return rc, targetendpoints

        job = {'Job': myjob}

        return rc, job

**** CubicPower OpenStack Study ****

    def EnumerateInstanceNames(self, name):

        result = None

        if name == 'EMC_ReplicationService':

            result = self._enum_replicationservices()

        elif name == 'EMC_StorageConfigurationService':

            result = self._enum_stconfsvcs()

        elif name == 'EMC_ControllerConfigurationService':

            result = self._enum_ctrlconfsvcs()

        elif name == 'EMC_VirtualProvisioningPool':

            result = self._enum_pools()

        elif name == 'EMC_UnifiedStoragePool':

            result = self._enum_pools()

        elif name == 'EMC_StorageVolume':

            result = self._enum_storagevolumes()

        elif name == 'Clar_StorageVolume':

            result = self._enum_storagevolumes()

        elif name == 'SE_StorageSynchronized_SV_SV':

            result = self._enum_syncsvsvs()

        elif name == 'CIM_ProtocolControllerForUnit':

            result = self._enum_unitnames()

        elif name == 'EMC_LunMaskingSCSIProtocolController':

            result = self._enum_lunmaskctrls()

        elif name == 'EMC_StorageProcessorSystem':

            result = self._enum_processors()

        elif name == 'EMC_StorageHardwareIDManagementService':

            result = self._enum_hdwidmgmts()

        else:

            result = self._default_enum()

        return result

**** CubicPower OpenStack Study ****

    def EnumerateInstances(self, name):

        result = None

        if name == 'EMC_VirtualProvisioningPool':

            result = self._enum_pool_details()

        elif name == 'EMC_UnifiedStoragePool':

            result = self._enum_pool_details()

        elif name == 'SE_StorageHardwareID':

            result = self._enum_storhdwids()

        else:

            result = self._default_enum()

        return result

**** CubicPower OpenStack Study ****

    def GetInstance(self, objectpath, LocalOnly=False):

        try:

            name = objectpath['CreationClassName']

        except KeyError:

            name = objectpath.classname

        result = None

        if name == 'Clar_StorageVolume' or name == 'Symm_StorageVolume':

            result = self._getinstance_storagevolume(objectpath)

        elif name == 'CIM_ProtocolControllerForUnit':

            result = self._getinstance_unit(objectpath)

        elif name == 'Clar_LunMaskingSCSIProtocolController':

            result = self._getinstance_lunmask()

        elif name == 'SE_ConcreteJob':

            result = self._getinstance_job(objectpath)

        elif name == 'SE_StorageSynchronized_SV_SV':

            result = self._getinstance_syncsvsv(objectpath)

        else:

            result = self._default_getinstance(objectpath)

        return result

**** CubicPower OpenStack Study ****

    def Associators(self, objectpath, resultClass='EMC_StorageHardwareID'):

        result = None

        if resultClass == 'EMC_StorageHardwareID':

            result = self._assoc_hdwid()

        elif resultClass == 'EMC_iSCSIProtocolEndpoint':

            result = self._assoc_endpoint()

        # Added test for EMC_StorageVolume

        elif resultClass == 'EMC_StorageVolume':

            result = self._assoc_storagevolume(objectpath)

        else:

            result = self._default_assoc(objectpath)

        return result

**** CubicPower OpenStack Study ****

    def AssociatorNames(self, objectpath,

                        resultClass='EMC_LunMaskingSCSIProtocolController'):

        result = None

        if resultClass == 'EMC_LunMaskingSCSIProtocolController':

            result = self._assocnames_lunmaskctrl()

        else:

            result = self._default_assocnames(objectpath)

        return result

**** CubicPower OpenStack Study ****

    def ReferenceNames(self, objectpath,

                       ResultClass='CIM_ProtocolControllerForUnit'):

        result = None

        if ResultClass == 'CIM_ProtocolControllerForUnit':

            result = self._ref_unitnames()

        else:

            result = self._default_ref(objectpath)

        return result

**** CubicPower OpenStack Study ****

    def _ref_unitnames(self):

        unitnames = []

        unitname = {}

        dependent = {}

        dependent['CreationClassName'] = self.data.vol_creationclass

        dependent['DeviceID'] = self.data.test_volume['id']

        dependent['ElementName'] = self.data.test_volume['name']

        dependent['SystemName'] = self.data.storage_system

        antecedent = {}

        antecedent['CreationClassName'] = self.data.lunmask_creationclass

        antecedent['DeviceID'] = self.data.lunmaskctrl_id

        antecedent['SystemName'] = self.data.storage_system

        unitname['Dependent'] = dependent

        unitname['Antecedent'] = antecedent

        unitname['CreationClassName'] = self.data.unit_creationclass

        unitnames.append(unitname)

        return unitnames

**** CubicPower OpenStack Study ****

    def _default_ref(self, objectpath):

        return objectpath

**** CubicPower OpenStack Study ****

    def _assoc_hdwid(self):

        assocs = []

        assoc = {}

        assoc['StorageID'] = self.data.connector['initiator']

        assocs.append(assoc)

        for wwpn in self.data.connector['wwpns']:

            assoc2 = {}

            assoc2['StorageID'] = wwpn

            assocs.append(assoc2)

        return assocs

**** CubicPower OpenStack Study ****

    def _assoc_endpoint(self):

        assocs = []

        assoc = {}

        assoc['Name'] = 'iqn.1992-04.com.emc:cx.apm00123907237.a8,t,0x0001'

        assoc['SystemName'] = self.data.storage_system + '+SP_A+8'

        assocs.append(assoc)

        return assocs

    # Added test for EMC_StorageVolume associators

**** CubicPower OpenStack Study ****

    def _assoc_storagevolume(self, objectpath):

        assocs = []

        if objectpath['type'] == 'failed_delete_vol':

            vol = self.data.failed_delete_vol

        elif objectpath['type'] == 'vol1':

            vol = self.data.test_volume

        elif objectpath['type'] == 'failed_vol':

            vol = self.data.test_failed_volume

        elif objectpath['type'] == 'failed_clone_sync':

            vol = self.data.failed_clone_sync

        elif objectpath['type'] == 'failed_clone_replica':

            vol = self.data.failed_clone_replica

        elif objectpath['type'] == 'failed_snapshot_replica':

            vol = self.data.failed_snapshot_replica

        elif objectpath['type'] == 'failed_snapshot_sync':

            vol = self.data.failed_snapshot_sync

        elif objectpath['type'] == 'clone1':

            vol = self.data.test_clone

        elif objectpath['type'] == 'clone3':

            vol = self.data.test_clone3

        elif objectpath['type'] == 'snapshot1':

            vol = self.data.test_snapshot

        elif objectpath['type'] == 'snapshot_vmax':

            vol = self.data.test_snapshot_vmax

        elif objectpath['type'] == 'failed_extend_vol':

            vol = self.data.failed_extend_vol

        else:

            return None

        vol['DeviceID'] = vol['id']

        assoc = self._getinstance_storagevolume(vol)

        assocs.append(assoc)

        return assocs

**** CubicPower OpenStack Study ****

    def _default_assoc(self, objectpath):

        return objectpath

**** CubicPower OpenStack Study ****

    def _assocnames_lunmaskctrl(self):

        return self._enum_lunmaskctrls()

**** CubicPower OpenStack Study ****

    def _default_assocnames(self, objectpath):

        return objectpath

**** CubicPower OpenStack Study ****

    def _getinstance_storagevolume(self, objectpath):

        foundinstance = None

        instance = EMC_StorageVolume()

        vols = self._enum_storagevolumes()

        for vol in vols:

            if vol['DeviceID'] == objectpath['DeviceID']:

                instance = vol

                break

        if not instance:

            foundinstance = None

        else:

            foundinstance = instance

        return foundinstance

**** CubicPower OpenStack Study ****

    def _getinstance_syncsvsv(self, objectpath):

        foundsync = None

        syncs = self._enum_syncsvsvs()

        for sync in syncs:

            if (sync['SyncedElement'] == objectpath['SyncedElement'] and

                    sync['SystemElement'] == objectpath['SystemElement']):

                foundsync = sync

                break

        return foundsync

**** CubicPower OpenStack Study ****

    def _getinstance_lunmask(self):

        lunmask = {}

        lunmask['CreationClassName'] = self.data.lunmask_creationclass

        lunmask['DeviceID'] = self.data.lunmaskctrl_id

        lunmask['SystemName'] = self.data.storage_system

        return lunmask

**** CubicPower OpenStack Study ****

    def _getinstance_unit(self, objectpath):

        unit = {}

        dependent = {}

        dependent['CreationClassName'] = self.data.vol_creationclass

        dependent['DeviceID'] = self.data.test_volume['id']

        dependent['ElementName'] = self.data.test_volume['name']

        dependent['SystemName'] = self.data.storage_system

        antecedent = {}

        antecedent['CreationClassName'] = self.data.lunmask_creationclass

        antecedent['DeviceID'] = self.data.lunmaskctrl_id

        antecedent['SystemName'] = self.data.storage_system

        unit['Dependent'] = dependent

        unit['Antecedent'] = antecedent

        unit['CreationClassName'] = self.data.unit_creationclass

        unit['DeviceNumber'] = '0'

        return unit

**** CubicPower OpenStack Study ****

    def _getinstance_job(self, jobpath):

        jobinstance = {}

        jobinstance['InstanceID'] = '9999'

        if jobpath['status'] == 'failure':

            jobinstance['JobState'] = 10

            jobinstance['ErrorCode'] = 99

            jobinstance['ErrorDescription'] = 'Failure'

        else:

            jobinstance['JobState'] = 7

            jobinstance['ErrorCode'] = 0

            jobinstance['ErrorDescription'] = ''

        return jobinstance

**** CubicPower OpenStack Study ****

    def _default_getinstance(self, objectpath):

        return objectpath

**** CubicPower OpenStack Study ****

    def _enum_replicationservices(self):

        rep_services = []

        rep_service = {}

        rep_service['SystemName'] = self.data.storage_system

        rep_service['CreationClassName'] = self.data.rep_service_creationclass

        rep_services.append(rep_service)

        return rep_services

**** CubicPower OpenStack Study ****

    def _enum_stconfsvcs(self):

        conf_services = []

        conf_service = {}

        conf_service['SystemName'] = self.data.storage_system

        conf_service['CreationClassName'] =\

            self.data.stconf_service_creationclass

        conf_services.append(conf_service)

        return conf_services

**** CubicPower OpenStack Study ****

    def _enum_ctrlconfsvcs(self):

        conf_services = []

        conf_service = {}

        conf_service['SystemName'] = self.data.storage_system

        conf_service['CreationClassName'] =\

            self.data.ctrlconf_service_creationclass

        conf_services.append(conf_service)

        return conf_services

**** CubicPower OpenStack Study ****

    def _enum_pools(self):

        pools = []

        pool = {}

        pool['InstanceID'] = self.data.storage_system + '+U+' +\

            self.data.storage_type

        pool['CreationClassName'] = 'Clar_UnifiedStoragePool'

        pools.append(pool)

        return pools

**** CubicPower OpenStack Study ****

    def _enum_pool_details(self):

        pools = []

        pool = {}

        pool['InstanceID'] = self.data.storage_system + '+U+' +\

            self.data.storage_type

        pool['CreationClassName'] = 'Clar_UnifiedStoragePool'

        pool['TotalManagedSpace'] = 12345678

        pool['RemainingManagedSpace'] = 123456

        pools.append(pool)

        return pools

**** CubicPower OpenStack Study ****

    def _enum_storagevolumes(self):

        vols = []

        vol = EMC_StorageVolume()

        vol['name'] = self.data.test_volume['name']

        vol['CreationClassName'] = 'Clar_StorageVolume'

        vol['ElementName'] = self.data.test_volume['name']

        vol['DeviceID'] = self.data.test_volume['id']

        vol['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        vol.path = vol

        vol.path.classname = vol['CreationClassName']

        name = {}

        name['classname'] = 'Clar_StorageVolume'

        keys = {}

        keys['CreationClassName'] = 'Clar_StorageVolume'

        keys['SystemName'] = self.data.storage_system

        keys['DeviceID'] = vol['DeviceID']

        keys['SystemCreationClassName'] = 'Clar_StorageSystem'

        name['keybindings'] = keys

        vol['provider_location'] = str(name)

        vols.append(vol)

        snap_vol = EMC_StorageVolume()

        snap_vol['name'] = self.data.test_snapshot['name']

        snap_vol['CreationClassName'] = 'Clar_StorageVolume'

        snap_vol['ElementName'] = self.data.test_snapshot['name']

        snap_vol['DeviceID'] = self.data.test_snapshot['id']

        snap_vol['SystemName'] = self.data.storage_system

        # Added vol to path

        snap_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        snap_vol.path = snap_vol

        snap_vol.path.classname = snap_vol['CreationClassName']

        name2 = {}

        name2['classname'] = 'Clar_StorageVolume'

        keys2 = {}

        keys2['CreationClassName'] = 'Clar_StorageVolume'

        keys2['SystemName'] = self.data.storage_system

        keys2['DeviceID'] = snap_vol['DeviceID']

        keys2['SystemCreationClassName'] = 'Clar_StorageSystem'

        name2['keybindings'] = keys2

        snap_vol['provider_location'] = str(name2)

        vols.append(snap_vol)

        clone_vol = EMC_StorageVolume()

        clone_vol['name'] = self.data.test_clone['name']

        clone_vol['CreationClassName'] = 'Clar_StorageVolume'

        clone_vol['ElementName'] = self.data.test_clone['name']

        clone_vol['DeviceID'] = self.data.test_clone['id']

        clone_vol['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        clone_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        clone_vol.path = clone_vol

        clone_vol.path.classname = clone_vol['CreationClassName']

        vols.append(clone_vol)

        clone_vol3 = EMC_StorageVolume()

        clone_vol3['name'] = self.data.test_clone3['name']

        clone_vol3['CreationClassName'] = 'Clar_StorageVolume'

        clone_vol3['ElementName'] = self.data.test_clone3['name']

        clone_vol3['DeviceID'] = self.data.test_clone3['id']

        clone_vol3['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        clone_vol3['SystemCreationClassName'] = 'Clar_StorageSystem'

        clone_vol3.path = clone_vol3

        clone_vol3.path.classname = clone_vol3['CreationClassName']

        vols.append(clone_vol3)

        snap_vol_vmax = EMC_StorageVolume()

        snap_vol_vmax['name'] = self.data.test_snapshot_vmax['name']

        snap_vol_vmax['CreationClassName'] = 'Symm_StorageVolume'

        snap_vol_vmax['ElementName'] = self.data.test_snapshot_vmax['name']

        snap_vol_vmax['DeviceID'] = self.data.test_snapshot_vmax['id']

        snap_vol_vmax['SystemName'] = self.data.storage_system_vmax

        # Added vol to vol.path

        snap_vol_vmax['SystemCreationClassName'] = 'Symm_StorageSystem'

        snap_vol_vmax.path = snap_vol_vmax

        snap_vol_vmax.path.classname = snap_vol_vmax['CreationClassName']

        name3 = {}

        name3['classname'] = 'Clar_StorageVolume'

        keys3 = {}

        keys3['CreationClassName'] = 'Clar_StorageVolume'

        keys3['SystemName'] = self.data.storage_system

        keys3['DeviceID'] = snap_vol_vmax['DeviceID']

        keys3['SystemCreationClassName'] = 'Clar_StorageSystem'

        name3['keybindings'] = keys3

        snap_vol_vmax['provider_location'] = str(name3)

        vols.append(snap_vol_vmax)

        failed_snap_replica = EMC_StorageVolume()

        failed_snap_replica['name'] = self.data.failed_snapshot_replica['name']

        failed_snap_replica['CreationClassName'] = 'Clar_StorageVolume'

        failed_snap_replica['ElementName'] =\

            self.data.failed_snapshot_replica['name']

        failed_snap_replica['DeviceID'] =\

            self.data.failed_snapshot_replica['id']

        failed_snap_replica['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_snap_replica['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_snap_replica.path = failed_snap_replica

        failed_snap_replica.path.classname =\

            failed_snap_replica['CreationClassName']

        name4 = {}

        name4['classname'] = 'Clar_StorageVolume'

        keys4 = {}

        keys4['CreationClassName'] = 'Clar_StorageVolume'

        keys4['SystemName'] = self.data.storage_system

        keys4['DeviceID'] = failed_snap_replica['DeviceID']

        keys4['SystemCreationClassName'] = 'Clar_StorageSystem'

        name4['keybindings'] = keys4

        failed_snap_replica['provider_location'] = str(name4)

        vols.append(failed_snap_replica)

        failed_snap_sync = EMC_StorageVolume()

        failed_snap_sync['name'] = self.data.failed_snapshot_sync['name']

        failed_snap_sync['CreationClassName'] = 'Clar_StorageVolume'

        failed_snap_sync['ElementName'] =\

            self.data.failed_snapshot_sync['name']

        failed_snap_sync['DeviceID'] = self.data.failed_snapshot_sync['id']

        failed_snap_sync['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_snap_sync['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_snap_sync.path = failed_snap_sync

        failed_snap_sync.path.classname =\

            failed_snap_sync['CreationClassName']

        name5 = {}

        name5['classname'] = 'Clar_StorageVolume'

        keys5 = {}

        keys5['CreationClassName'] = 'Clar_StorageVolume'

        keys5['SystemName'] = self.data.storage_system

        keys5['DeviceID'] = failed_snap_sync['DeviceID']

        keys5['SystemCreationClassName'] = 'Clar_StorageSystem'

        name5['keybindings'] = keys5

        failed_snap_sync['provider_location'] = str(name5)

        vols.append(failed_snap_sync)

        failed_clone_rep = EMC_StorageVolume()

        failed_clone_rep['name'] = self.data.failed_clone_replica['name']

        failed_clone_rep['CreationClassName'] = 'Clar_StorageVolume'

        failed_clone_rep['ElementName'] =\

            self.data.failed_clone_replica['name']

        failed_clone_rep['DeviceID'] = self.data.failed_clone_replica['id']

        failed_clone_rep['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_clone_rep['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_clone_rep.path = failed_clone_rep

        failed_clone_rep.path.classname =\

            failed_clone_rep['CreationClassName']

        vols.append(failed_clone_rep)

        failed_clone_s = EMC_StorageVolume()

        failed_clone_s['name'] = self.data.failed_clone_sync['name']

        failed_clone_s['CreationClassName'] = 'Clar_StorageVolume'

        failed_clone_s['ElementName'] = self.data.failed_clone_sync['name']

        failed_clone_s['DeviceID'] = self.data.failed_clone_sync['id']

        failed_clone_s['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_clone_s['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_clone_s.path = failed_clone_s

        failed_clone_s.path.classname =\

            failed_clone_s['CreationClassName']

        vols.append(failed_clone_s)

        failed_delete_vol = EMC_StorageVolume()

        failed_delete_vol['name'] = 'failed_delete_vol'

        failed_delete_vol['CreationClassName'] = 'Clar_StorageVolume'

        failed_delete_vol['ElementName'] = 'failed_delete_vol'

        failed_delete_vol['DeviceID'] = '99999'

        failed_delete_vol['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_delete_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_delete_vol.path = failed_delete_vol

        failed_delete_vol.path.classname =\

            failed_delete_vol['CreationClassName']

        vols.append(failed_delete_vol)

        failed_vol = EMC_StorageVolume()

        failed_vol['name'] = 'failed__vol'

        failed_vol['CreationClassName'] = 'Clar_StorageVolume'

        failed_vol['ElementName'] = 'failed_vol'

        failed_vol['DeviceID'] = '4'

        failed_vol['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_vol.path = failed_vol

        failed_vol.path.classname =\

            failed_vol['CreationClassName']

        name_failed = {}

        name_failed['classname'] = 'Clar_StorageVolume'

        keys_failed = {}

        keys_failed['CreationClassName'] = 'Clar_StorageVolume'

        keys_failed['SystemName'] = self.data.storage_system

        keys_failed['DeviceID'] = failed_vol['DeviceID']

        keys_failed['SystemCreationClassName'] = 'Clar_StorageSystem'

        name_failed['keybindings'] = keys_failed

        failed_vol['provider_location'] = str(name_failed)

        vols.append(failed_vol)

        failed_extend_vol = EMC_StorageVolume()

        failed_extend_vol['name'] = 'failed_extend_vol'

        failed_extend_vol['CreationClassName'] = 'Clar_StorageVolume'

        failed_extend_vol['ElementName'] = 'failed_extend_vol'

        failed_extend_vol['DeviceID'] = '9'

        failed_extend_vol['SystemName'] = self.data.storage_system

        # Added vol to vol.path

        failed_extend_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        failed_extend_vol.path = failed_extend_vol

        failed_extend_vol.path.classname =\

            failed_extend_vol['CreationClassName']

        name_extend_failed = {}

        name_extend_failed['classname'] = 'Clar_StorageVolume'

        keys_extend_failed = {}

        keys_extend_failed['CreationClassName'] = 'Clar_StorageVolume'

        keys_extend_failed['SystemName'] = self.data.storage_system

        keys_extend_failed['DeviceID'] = failed_extend_vol['DeviceID']

        keys_extend_failed['SystemCreationClassName'] = 'Clar_StorageSystem'

        name_extend_failed['keybindings'] = keys_extend_failed

        failed_extend_vol['provider_location'] = str(name_extend_failed)

        vols.append(failed_extend_vol)

        return vols

**** CubicPower OpenStack Study ****

    def _enum_syncsvsvs(self):

        syncs = []

        vols = self._enum_storagevolumes()

        sync = self._create_sync(vols[0], vols[1], 100)

        syncs.append(sync)

        sync2 = self._create_sync(vols[1], vols[2], 100)

        syncs.append(sync2)

        sync3 = self._create_sync(vols[0], vols[3], 100)

        syncs.append(sync3)

        objpath1 = vols[1]

        for vol in vols:

            if vol['ElementName'] == 'failed_snapshot_sync':

                objpath2 = vol

                break

        sync4 = self._create_sync(objpath1, objpath2, 100)

        syncs.append(sync4)

        objpath1 = vols[0]

        for vol in vols:

            if vol['ElementName'] == 'failed_clone_sync':

                objpath2 = vol

                break

        sync5 = self._create_sync(objpath1, objpath2, 100)

        syncs.append(sync5)

        return syncs

**** CubicPower OpenStack Study ****

    def _create_sync(self, objpath1, objpath2, percentsynced):

        sync = {}

        sync['SyncedElement'] = objpath2

        sync['SystemElement'] = objpath1

        sync['CreationClassName'] = 'SE_StorageSynchronized_SV_SV'

        sync['PercentSynced'] = percentsynced

        return sync

**** CubicPower OpenStack Study ****

    def _enum_unitnames(self):

        return self._ref_unitnames()

**** CubicPower OpenStack Study ****

    def _enum_lunmaskctrls(self):

        ctrls = []

        ctrl = {}

        ctrl['CreationClassName'] = self.data.lunmask_creationclass

        ctrl['DeviceID'] = self.data.lunmaskctrl_id

        ctrl['SystemName'] = self.data.storage_system

        ctrls.append(ctrl)

        return ctrls

**** CubicPower OpenStack Study ****

    def _enum_processors(self):

        ctrls = []

        ctrl = {}

        ctrl['CreationClassName'] = 'Clar_StorageProcessorSystem'

        ctrl['Name'] = self.data.storage_system + '+SP_A'

        ctrls.append(ctrl)

        return ctrls

**** CubicPower OpenStack Study ****

    def _enum_hdwidmgmts(self):

        services = []

        srv = {}

        srv['SystemName'] = self.data.storage_system

        services.append(srv)

        return services

**** CubicPower OpenStack Study ****

    def _enum_storhdwids(self):

        storhdwids = []

        hdwid = SE_StorageHardwareID()

        hdwid['StorageID'] = self.data.connector['wwpns'][0]

        hdwid.path = hdwid

        storhdwids.append(hdwid)

        return storhdwids

**** CubicPower OpenStack Study ****

    def _default_enum(self):

        names = []

        name = {}

        name['Name'] = 'default'

        names.append(name)

        return names

**** CubicPower OpenStack Study ****

class EMCSMISISCSIDriverTestCase(test.TestCase):

**** CubicPower OpenStack Study ****

    def setUp(self):

        self.data = EMCSMISCommonData()

        self.tempdir = tempfile.mkdtemp()

        super(EMCSMISISCSIDriverTestCase, self).setUp()

        self.config_file_path = None

        self.create_fake_config_file()

        configuration = mock.Mock()

        configuration.cinder_emc_config_file = self.config_file_path

        self.stubs.Set(EMCSMISISCSIDriver, '_do_iscsi_discovery',

                       self.fake_do_iscsi_discovery)

        self.stubs.Set(EMCSMISCommon, '_get_ecom_connection',

                       self.fake_ecom_connection)

        instancename = FakeCIMInstanceName()

        self.stubs.Set(EMCSMISCommon, '_getinstancename',

                       instancename.fake_getinstancename)

        self.stubs.Set(time, 'sleep',

                       self.fake_sleep)

        driver = EMCSMISISCSIDriver(configuration=configuration)

        driver.db = FakeDB()

        self.driver = driver

**** CubicPower OpenStack Study ****

    def create_fake_config_file(self):

        doc = Document()

        emc = doc.createElement("EMC")

        doc.appendChild(emc)

        storagetype = doc.createElement("StorageType")

        storagetypetext = doc.createTextNode("gold")

        emc.appendChild(storagetype)

        storagetype.appendChild(storagetypetext)

        ecomserverip = doc.createElement("EcomServerIp")

        ecomserveriptext = doc.createTextNode("1.1.1.1")

        emc.appendChild(ecomserverip)

        ecomserverip.appendChild(ecomserveriptext)

        ecomserverport = doc.createElement("EcomServerPort")

        ecomserverporttext = doc.createTextNode("10")

        emc.appendChild(ecomserverport)

        ecomserverport.appendChild(ecomserverporttext)

        ecomusername = doc.createElement("EcomUserName")

        ecomusernametext = doc.createTextNode("user")

        emc.appendChild(ecomusername)

        ecomusername.appendChild(ecomusernametext)

        ecompassword = doc.createElement("EcomPassword")

        ecompasswordtext = doc.createTextNode("pass")

        emc.appendChild(ecompassword)

        ecompassword.appendChild(ecompasswordtext)

        timeout = doc.createElement("Timeout")

        timeouttext = doc.createTextNode("0")

        emc.appendChild(timeout)

        timeout.appendChild(timeouttext)

        self.config_file_path = self.tempdir + '/' + self.data.config_file_name

        f = open(self.config_file_path, 'w')

        doc.writexml(f)

        f.close()

**** CubicPower OpenStack Study ****

    def fake_ecom_connection(self):

        conn = FakeEcomConnection()

        return conn

**** CubicPower OpenStack Study ****

    def fake_do_iscsi_discovery(self, volume):

        output = []

        item = '10.0.0.3:3260,1 iqn.1992-04.com.emc:cx.apm00123907237.a8'

        item2 = '10.0.0.4:3260,2 iqn.1992-04.com.emc:cx.apm00123907237.b8'

        output.append(item)

        output.append(item2)

        return output

**** CubicPower OpenStack Study ****

    def fake_sleep(self, seconds):

        return

**** CubicPower OpenStack Study ****

    def test_get_volume_stats(self):

        self.driver.get_volume_stats(True)

**** CubicPower OpenStack Study ****

    def test_create_destroy(self):

        self.driver.create_volume(self.data.test_volume)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_destroy(self):

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot)

        self.driver.create_volume_from_snapshot(

            self.data.test_clone, self.data.test_snapshot)

        self.driver.create_cloned_volume(

            self.data.test_clone3, self.data.test_volume)

        self.driver.delete_volume(self.data.test_clone)

        self.driver.delete_volume(self.data.test_clone3)

        self.driver.delete_snapshot(self.data.test_snapshot)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_map_unmap(self):

        self.driver.create_volume(self.data.test_volume)

        self.data.test_volume['EMCCurrentOwningStorageProcessor'] = 'SP_A'

        connection_info = self.driver.initialize_connection(

            self.data.test_volume,

            self.data.connector)

        self.driver.terminate_connection(self.data.test_volume,

                                         self.data.connector)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_failed(self):

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume,

                          self.data.test_failed_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_unsupported(self):

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot_vmax)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume_from_snapshot,

                          self.data.test_clone,

                          self.data.test_snapshot_vmax)

        self.driver.delete_snapshot(self.data.test_snapshot_vmax)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_replica_failed(self):

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume_from_snapshot,

                          self.data.failed_snapshot_replica,

                          self.data.test_snapshot)

        self.driver.delete_snapshot(self.data.test_snapshot)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_sync_failed(self):

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume_from_snapshot,

                          self.data.failed_snapshot_sync,

                          self.data.test_snapshot)

        self.driver.delete_snapshot(self.data.test_snapshot)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_clone_replica_failed(self):

        self.driver.create_volume(self.data.test_volume)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_cloned_volume,

                          self.data.failed_clone_replica,

                          self.data.test_volume)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_clone_sync_failed(self):

        self.driver.create_volume(self.data.test_volume)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_cloned_volume,

                          self.data.failed_clone_sync,

                          self.data.test_volume)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_delete_volume_notfound(self):

        notfound_delete_vol = {}

        notfound_delete_vol['name'] = 'notfound_delete_vol'

        notfound_delete_vol['id'] = '10'

        notfound_delete_vol['CreationClassName'] = 'Clar_StorageVolume'

        notfound_delete_vol['SystemName'] = self.data.storage_system

        notfound_delete_vol['DeviceID'] = notfound_delete_vol['id']

        notfound_delete_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        name = {}

        name['classname'] = 'Clar_StorageVolume'

        keys = {}

        keys['CreationClassName'] = notfound_delete_vol['CreationClassName']

        keys['SystemName'] = notfound_delete_vol['SystemName']

        keys['DeviceID'] = notfound_delete_vol['DeviceID']

        keys['SystemCreationClassName'] =\

            notfound_delete_vol['SystemCreationClassName']

        name['keybindings'] = keys

        notfound_delete_vol['provider_location'] = str(name)

        self.driver.delete_volume(notfound_delete_vol)

**** CubicPower OpenStack Study ****

    def test_delete_volume_failed(self):

        self.driver.create_volume(self.data.failed_delete_vol)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.delete_volume,

                          self.data.failed_delete_vol)

**** CubicPower OpenStack Study ****

    def test_extend_volume(self):

        self.driver.create_volume(self.data.test_volume)

        self.driver.extend_volume(self.data.test_volume, '10')

        self.driver.create_volume(self.data.failed_extend_vol)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.extend_volume,

                          self.data.failed_extend_vol,

                          '10')

**** CubicPower OpenStack Study ****

    def _cleanup(self):

        bExists = os.path.exists(self.config_file_path)

        if bExists:

            os.remove(self.config_file_path)

        shutil.rmtree(self.tempdir)

**** CubicPower OpenStack Study ****

    def tearDown(self):

        self._cleanup()

        super(EMCSMISISCSIDriverTestCase, self).tearDown()

**** CubicPower OpenStack Study ****

class EMCSMISFCDriverTestCase(test.TestCase):

**** CubicPower OpenStack Study ****

    def setUp(self):

        self.data = EMCSMISCommonData()

        self.tempdir = tempfile.mkdtemp()

        super(EMCSMISFCDriverTestCase, self).setUp()

        self.config_file_path = None

        self.create_fake_config_file()

        configuration = mock.Mock()

        configuration.cinder_emc_config_file = self.config_file_path

        self.stubs.Set(EMCSMISCommon, '_get_ecom_connection',

                       self.fake_ecom_connection)

        instancename = FakeCIMInstanceName()

        self.stubs.Set(EMCSMISCommon, '_getinstancename',

                       instancename.fake_getinstancename)

        self.stubs.Set(time, 'sleep',

                       self.fake_sleep)

        driver = EMCSMISFCDriver(configuration=configuration)

        driver.db = FakeDB()

        self.driver = driver

**** CubicPower OpenStack Study ****

    def create_fake_config_file(self):

        doc = Document()

        emc = doc.createElement("EMC")

        doc.appendChild(emc)

        storagetype = doc.createElement("StorageType")

        storagetypetext = doc.createTextNode("gold")

        emc.appendChild(storagetype)

        storagetype.appendChild(storagetypetext)

        ecomserverip = doc.createElement("EcomServerIp")

        ecomserveriptext = doc.createTextNode("1.1.1.1")

        emc.appendChild(ecomserverip)

        ecomserverip.appendChild(ecomserveriptext)

        ecomserverport = doc.createElement("EcomServerPort")

        ecomserverporttext = doc.createTextNode("10")

        emc.appendChild(ecomserverport)

        ecomserverport.appendChild(ecomserverporttext)

        ecomusername = doc.createElement("EcomUserName")

        ecomusernametext = doc.createTextNode("user")

        emc.appendChild(ecomusername)

        ecomusername.appendChild(ecomusernametext)

        ecompassword = doc.createElement("EcomPassword")

        ecompasswordtext = doc.createTextNode("pass")

        emc.appendChild(ecompassword)

        ecompassword.appendChild(ecompasswordtext)

        timeout = doc.createElement("Timeout")

        timeouttext = doc.createTextNode("0")

        emc.appendChild(timeout)

        timeout.appendChild(timeouttext)

        self.config_file_path = self.tempdir + '/' + self.data.config_file_name

        f = open(self.config_file_path, 'w')

        doc.writexml(f)

        f.close()

**** CubicPower OpenStack Study ****

    def fake_ecom_connection(self):

        conn = FakeEcomConnection()

        return conn

**** CubicPower OpenStack Study ****

    def fake_sleep(self, seconds):

        return

**** CubicPower OpenStack Study ****

    def test_get_volume_stats(self):

        self.driver.get_volume_stats(True)

**** CubicPower OpenStack Study ****

    def test_create_destroy(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_destroy(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot)

        self.driver.create_volume_from_snapshot(

            self.data.test_clone, self.data.test_snapshot)

        self.driver.create_cloned_volume(

            self.data.test_clone3, self.data.test_volume)

        self.driver.delete_volume(self.data.test_clone)

        self.driver.delete_volume(self.data.test_clone3)

        self.driver.delete_snapshot(self.data.test_snapshot)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_map_unmap(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        output = {

            'driver_volume_type': 'fibre_channel',

            'data': {

                'target_lun': 0,

                'target_wwn': ['1234567890123', '0987654321321'],

                'target_discovered': True,

                'initiator_target_map': {'123456789012345':

                                         ['1234567890123', '0987654321321'],

                                         '123456789054321':

                                         ['1234567890123', '0987654321321'],

                                         }}}

        connection_info = self.driver.initialize_connection(

            self.data.test_volume,

            self.data.connector)

        self.assertEqual(connection_info, output)

        connection_info = self.driver.terminate_connection(

            self.data.test_volume,

            self.data.connector)

        # Verify calls in terminate_connection are executed

        conf_service = {}

        conf_service['SystemName'] = self.data.storage_system

        conf_service['CreationClassName'] =\

            self.data.ctrlconf_service_creationclass

        vol_instance = self.driver.common._find_lun(self.data.test_volume)

        expected = [

            mock.call._get_ecom_connection(),

            mock.call.find_device_number(self.data.test_volume),

            mock.call._find_lun(self.data.test_volume),

            mock.call.self._find_controller_configuration_service(

                self.data.storage_system),

            mock.call._remove_members(conf_service, vol_instance),

            mock.call.get_target_wwns(

                self.data.storage_system,

                self.data.connector)]

        output = {

            'driver_volume_type': 'fibre_channel',

            'data': {

                'target_wwn': ['1234567890123', '0987654321321'],

                'initiator_target_map': {'123456789012345':

                                         ['1234567890123', '0987654321321'],

                                         '123456789054321':

                                         ['1234567890123', '0987654321321'],

                                         }}}

        self.assertEqual(connection_info, output)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_failed(self):

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume,

                          self.data.test_failed_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_unsupported(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot_vmax)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume_from_snapshot,

                          self.data.test_clone,

                          self.data.test_snapshot_vmax)

        self.driver.delete_snapshot(self.data.test_snapshot_vmax)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_replica_failed(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume_from_snapshot,

                          self.data.failed_snapshot_replica,

                          self.data.test_snapshot)

        self.driver.delete_snapshot(self.data.test_snapshot)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_snapshot_sync_failed(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.driver.create_snapshot(self.data.test_snapshot)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_volume_from_snapshot,

                          self.data.failed_snapshot_sync,

                          self.data.test_snapshot)

        self.driver.delete_snapshot(self.data.test_snapshot)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_clone_replica_failed(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_cloned_volume,

                          self.data.failed_clone_replica,

                          self.data.test_volume)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_create_volume_clone_sync_failed(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.create_cloned_volume,

                          self.data.failed_clone_sync,

                          self.data.test_volume)

        self.driver.delete_volume(self.data.test_volume)

**** CubicPower OpenStack Study ****

    def test_delete_volume_notfound(self):

        notfound_delete_vol = {}

        notfound_delete_vol['name'] = 'notfound_delete_vol'

        notfound_delete_vol['id'] = '10'

        notfound_delete_vol['CreationClassName'] = 'Clar_StorageVolume'

        notfound_delete_vol['SystemName'] = self.data.storage_system

        notfound_delete_vol['DeviceID'] = notfound_delete_vol['id']

        notfound_delete_vol['SystemCreationClassName'] = 'Clar_StorageSystem'

        name = {}

        name['classname'] = 'Clar_StorageVolume'

        keys = {}

        keys['CreationClassName'] = notfound_delete_vol['CreationClassName']

        keys['SystemName'] = notfound_delete_vol['SystemName']

        keys['DeviceID'] = notfound_delete_vol['DeviceID']

        keys['SystemCreationClassName'] =\

            notfound_delete_vol['SystemCreationClassName']

        name['keybindings'] = keys

        notfound_delete_vol['provider_location'] = str(name)

        self.driver.delete_volume(notfound_delete_vol)

**** CubicPower OpenStack Study ****

    def test_delete_volume_failed(self):

        self.driver.create_volume(self.data.failed_delete_vol)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.delete_volume,

                          self.data.failed_delete_vol)

**** CubicPower OpenStack Study ****

    def test_extend_volume(self):

        self.data.test_volume['volume_type_id'] = None

        self.driver.create_volume(self.data.test_volume)

        self.driver.extend_volume(self.data.test_volume, '10')

        self.driver.create_volume(self.data.failed_extend_vol)

        self.assertRaises(exception.VolumeBackendAPIException,

                          self.driver.extend_volume,

                          self.data.failed_extend_vol,

                          '10')

    @mock.patch.object(

        volume_types,

        'get_volume_type_extra_specs',

        return_value={'storagetype:pool': 'gold',

                      'storagetype:provisioning': 'thick'})

**** CubicPower OpenStack Study ****

    def test_create_volume_with_volume_type(self, _mock_volume_type):

        volume_with_vt = self.data.test_volume

        volume_with_vt['volume_type_id'] = 1

        self.driver.create_volume(volume_with_vt)

        configservice = {'CreationClassName':

                         'Clar_StorageConfigurationService',

                         'SystemName': 'CLARiiON+APM00123456789'}

        pool = {'InstanceID': 'CLARiiON+APM00123456789+U+gold',

                'CreationClassName': 'Clar_UnifiedStoragePool'}

        volumesize = int(volume_with_vt['size']) * units.GiB

        storage_type = {'storagetype:provisioning': 'thick',

                        'storagetype:pool': 'gold'}

        expected = [

            mock.call._get_storage_type(volume_with_vt),

            mock.call._find_pool('gold'),

            mock.call.get_provisioning(storage_type),

            mock.call.InvokeMethod('CreateOrModifyElementFromStoragePool',

                                   configservice, volume_with_vt['name'],

                                   pool,

                                   self.driver.common._getnum(2, '16'),

                                   self.driver.common._getnum(volumesize,

                                                              '64'))]

**** CubicPower OpenStack Study ****

    def _cleanup(self):

        bExists = os.path.exists(self.config_file_path)

        if bExists:

            os.remove(self.config_file_path)

        shutil.rmtree(self.tempdir)

**** CubicPower OpenStack Study ****

    def tearDown(self):

        self._cleanup()

        super(EMCSMISFCDriverTestCase, self).tearDown()