00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 from lsm import Disk, md5, LsmError, ErrorNumber
00018 import dmtf
00019 from utils import merge_list
00020 from pywbem import CIM_ERR_NOT_FOUND, CIM_ERR_INVALID_PARAMETER
00021 from lsm.plugin.smispy.smis_common import SmisCommon
00022
00023
00024 _LSM_DISK_OP_STATUS_CONV = {
00025 dmtf.OP_STATUS_UNKNOWN: Disk.STATUS_UNKNOWN,
00026 dmtf.OP_STATUS_OK: Disk.STATUS_OK,
00027 dmtf.OP_STATUS_PREDICTIVE_FAILURE: Disk.STATUS_PREDICTIVE_FAILURE,
00028 dmtf.OP_STATUS_ERROR: Disk.STATUS_ERROR,
00029 dmtf.OP_STATUS_NON_RECOVERABLE_ERROR: Disk.STATUS_ERROR,
00030 dmtf.OP_STATUS_STARTING: Disk.STATUS_STARTING,
00031 dmtf.OP_STATUS_STOPPING: Disk.STATUS_STOPPING,
00032 dmtf.OP_STATUS_STOPPED: Disk.STATUS_STOPPED,
00033 }
00034
00035
00036 def _disk_status_of_cim_disk(cim_disk):
00037 """
00038 Convert CIM_DiskDrive['OperationalStatus'] to LSM
00039 Only return status, no status_info
00040 """
00041 if 'OperationalStatus' not in cim_disk:
00042 return Disk.STATUS_UNKNOWN
00043
00044 return dmtf.op_status_list_conv(
00045 _LSM_DISK_OP_STATUS_CONV, cim_disk['OperationalStatus'],
00046 Disk.STATUS_UNKNOWN, Disk.STATUS_OTHER)[0]
00047
00048
00049 _DMTF_DISK_TYPE_2_LSM = {
00050 dmtf.DISK_TYPE_UNKNOWN: Disk.TYPE_UNKNOWN,
00051 dmtf.DISK_TYPE_OTHER: Disk.TYPE_OTHER,
00052 dmtf.DISK_TYPE_HDD: Disk.TYPE_HDD,
00053 dmtf.DISK_TYPE_SSD: Disk.TYPE_SSD,
00054 dmtf.DISK_TYPE_HYBRID: Disk.TYPE_HYBRID,
00055 }
00056
00057
00058 def _dmtf_disk_type_2_lsm_disk_type(dmtf_disk_type):
00059 if dmtf_disk_type in _DMTF_DISK_TYPE_2_LSM.keys():
00060 return _DMTF_DISK_TYPE_2_LSM[dmtf_disk_type]
00061 else:
00062 return Disk.TYPE_UNKNOWN
00063
00064
00065 def _disk_id_of_cim_disk(cim_disk):
00066 if 'SystemName' not in cim_disk or \
00067 'DeviceID' not in cim_disk:
00068 raise LsmError(
00069 ErrorNumber.PLUGIN_BUG,
00070 "_disk_id_of_cim_disk(): Got cim_disk with no "
00071 "SystemName or DeviceID property: %s, %s" %
00072 (cim_disk.path, cim_disk.items()))
00073
00074 return md5("%s%s" % (cim_disk['SystemName'], cim_disk['DeviceID']))
00075
00076
00077 def cim_disk_pros():
00078 """
00079 Return all CIM_DiskDrive Properties needed to create a Disk object.
00080 The 'Type' and 'MediaType' is only for MegaRAID.
00081 The 'EMCInUse' is only for EMC.
00082 """
00083 return ['OperationalStatus', 'Name', 'SystemName',
00084 'Caption', 'InterconnectType', 'DiskType', 'DeviceID',
00085 'Type', 'MediaType', 'EMCInUse']
00086
00087
00088 def sys_id_of_cim_disk(cim_disk):
00089 if 'SystemName' not in cim_disk:
00090 raise LsmError(
00091 ErrorNumber.PLUGIN_BUG,
00092 "sys_id_of_cim_disk(): Got cim_disk with no "
00093 "SystemName property: %s, %s" %
00094 (cim_disk.path, cim_disk.items()))
00095 return cim_disk['SystemName']
00096
00097
00098 def _pri_cim_ext_of_cim_disk(smis_common, cim_disk_path, property_list=None):
00099 """
00100 Usage:
00101 Find out the Primordial CIM_StorageExtent of CIM_DiskDrive
00102 In SNIA SMI-S 1.4 rev.6 Block book, section 11.1.1 'Base Model'
00103 quote:
00104 A disk drive is modeled as a single MediaAccessDevice (DiskDrive)
00105 That shall be linked to a single StorageExtent (representing the
00106 storage in the drive) by a MediaPresent association. The
00107 StorageExtent class represents the storage of the drive and
00108 contains its size.
00109 Parameter:
00110 cim_disk_path # CIM_InstanceName of CIM_DiskDrive
00111 property_list # a List of properties needed on returned
00112 # CIM_StorageExtent
00113 Returns:
00114 cim_pri_ext # The CIM_Instance of Primordial CIM_StorageExtent
00115 Exceptions:
00116 LsmError
00117 ErrorNumber.LSM_PLUGIN_BUG # Failed to find out pri cim_ext
00118 """
00119 if property_list is None:
00120 property_list = ['Primordial']
00121 else:
00122 property_list = merge_list(property_list, ['Primordial'])
00123
00124 cim_exts = smis_common.Associators(
00125 cim_disk_path,
00126 AssocClass='CIM_MediaPresent',
00127 ResultClass='CIM_StorageExtent',
00128 PropertyList=property_list)
00129 cim_exts = [p for p in cim_exts if p["Primordial"]]
00130 if len(cim_exts) == 1:
00131
00132
00133 return cim_exts[0]
00134 else:
00135 raise LsmError(ErrorNumber.PLUGIN_BUG,
00136 "_pri_cim_ext_of_cim_disk(): "
00137 "Got unexpected count of Primordial " +
00138 "CIM_StorageExtent for CIM_DiskDrive: %s, %s " %
00139 (cim_disk_path, cim_exts))
00140
00141
00142
00143
00144 _MEGARAID_DISK_MEDIA_TYPE_SSD = 1
00145 _MEGARAID_DISK_MEDIA_TYPE_SSD_FLASH = 2
00146
00147
00148
00149 _MEGARAID_DISK_TYPE_SCSI = 1
00150 _MEGARAID_DISK_TYPE_SAS = 2
00151 _MEGARAID_DISK_TYPE_SATA = 3
00152 _MEGARAID_DISK_TYPE_FC = 4
00153
00154
00155 def _disk_type_megaraid(cim_disk):
00156 if cim_disk['MediaType'] == _MEGARAID_DISK_MEDIA_TYPE_SSD or \
00157 cim_disk['MediaType'] == _MEGARAID_DISK_MEDIA_TYPE_SSD_FLASH:
00158 return Disk.TYPE_SSD
00159 else:
00160 if int(cim_disk['Type']) == _MEGARAID_DISK_TYPE_SCSI:
00161 return Disk.TYPE_SCSI
00162 elif int(cim_disk['Type']) == _MEGARAID_DISK_TYPE_SAS:
00163 return Disk.TYPE_SAS
00164 elif int(cim_disk['Type']) == _MEGARAID_DISK_TYPE_SATA:
00165 return Disk.TYPE_SATA
00166 elif int(cim_disk['Type']) == _MEGARAID_DISK_TYPE_FC:
00167 return Disk.TYPE_FC
00168
00169 return Disk.TYPE_UNKNOWN
00170
00171
00172 def cim_disk_to_lsm_disk(smis_common, cim_disk):
00173 """
00174 Convert CIM_DiskDrive to lsm.Disk.
00175 """
00176
00177
00178 cim_ext = _pri_cim_ext_of_cim_disk(
00179 smis_common, cim_disk.path,
00180 property_list=['BlockSize', 'NumberOfBlocks'])
00181
00182 status = _disk_status_of_cim_disk(cim_disk)
00183 if smis_common.profile_check(SmisCommon.SNIA_SPARE_DISK_PROFILE,
00184 SmisCommon.SMIS_SPEC_VER_1_4,
00185 raise_error=False):
00186 cim_srss = smis_common.AssociatorNames(
00187 cim_ext.path, AssocClass='CIM_IsSpare',
00188 ResultClass='CIM_StorageRedundancySet')
00189 if len(cim_srss) >= 1:
00190 status |= Disk.STATUS_SPARE_DISK
00191
00192 if 'EMCInUse' in cim_disk.keys() and cim_disk['EMCInUse'] is False:
00193 status |= Disk.STATUS_FREE
00194
00195 name = ''
00196 block_size = Disk.BLOCK_SIZE_NOT_FOUND
00197 num_of_block = Disk.BLOCK_COUNT_NOT_FOUND
00198 disk_type = Disk.TYPE_UNKNOWN
00199 sys_id = sys_id_of_cim_disk(cim_disk)
00200
00201
00202
00203 if 'Name' in cim_disk:
00204 name = cim_disk["Name"]
00205 if 'BlockSize' in cim_ext:
00206 block_size = cim_ext['BlockSize']
00207 if 'NumberOfBlocks' in cim_ext:
00208 num_of_block = cim_ext['NumberOfBlocks']
00209
00210 if smis_common.is_megaraid():
00211 disk_type = _disk_type_megaraid(cim_disk)
00212 else:
00213
00214
00215
00216 if 'InterconnectType' in cim_disk:
00217 disk_type = cim_disk['InterconnectType']
00218 if 'Caption' in cim_disk:
00219
00220 if cim_disk['Caption'] == 'NL_SAS':
00221 disk_type = Disk.TYPE_NL_SAS
00222
00223 if disk_type == Disk.TYPE_UNKNOWN and 'DiskType' in cim_disk:
00224 disk_type = _dmtf_disk_type_2_lsm_disk_type(cim_disk['DiskType'])
00225
00226 disk_id = _disk_id_of_cim_disk(cim_disk)
00227
00228 return Disk(disk_id, name, disk_type, block_size, num_of_block, status,
00229 sys_id)