00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 from utils import merge_list, path_str_to_cim_path, cim_path_to_path_str
00018 import dmtf
00019 from lsm import LsmError, ErrorNumber, Pool
00020
00021
00022 def cim_pools_of_cim_sys_path(smis_common, cim_sys_path, property_list=None):
00023 """
00024 Use this association to get a list of CIM_StoragePool:
00025 CIM_ComputerSystem
00026 |
00027 | (CIM_HostedStoragePool)
00028 |
00029 v
00030 CIM_StoragePool
00031 As 'Block Services Package' is mandatory for 'Array' profile which already
00032 checked by plugin_register(), we don't do any profile check here.
00033 Primordial pool will be eliminated from return list.
00034 These pools will be eliminated also:
00035 * Spare pool with CIM_StoragePool['Usage'] == dmtf.POOL_USAGE_SPARE
00036 * IBM ArrayPool(IBMTSDS_ArrayPool)
00037 * IBM ArraySitePool(IBMTSDS_ArraySitePool)
00038 """
00039 cim_pools = []
00040
00041 if property_list is None:
00042 property_list = ['Primordial', 'Usage']
00043 else:
00044 property_list = merge_list(property_list, ['Primordial', 'Usage'])
00045
00046 cim_pools = smis_common.Associators(
00047 cim_sys_path,
00048 AssocClass='CIM_HostedStoragePool',
00049 ResultClass='CIM_StoragePool',
00050 PropertyList=property_list)
00051
00052 rc = []
00053 for cim_pool in cim_pools:
00054 if 'Primordial' in cim_pool and cim_pool['Primordial']:
00055 continue
00056 if 'Usage' in cim_pool and cim_pool['Usage'] == dmtf.POOL_USAGE_SPARE:
00057 continue
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 if cim_pool.classname == 'IBMTSDS_ArrayPool' or \
00077 cim_pool.classname == 'IBMTSDS_ArraySitePool':
00078 continue
00079 rc.append(cim_pool)
00080
00081 return rc
00082
00083
00084 def cim_pool_id_pros():
00085 """
00086 Return a list of CIM_StoragePool properties required to generate
00087 lsm.Pool.id
00088 """
00089 return ['InstanceID']
00090
00091
00092 def pool_id_of_cim_pool(cim_pool):
00093 if 'InstanceID' in cim_pool:
00094 return cim_pool['InstanceID']
00095 else:
00096 raise LsmError(
00097 ErrorNumber.PLUGIN_BUG,
00098 "pool_id_of_cim_pool(): Got CIM_StoragePool with no 'InstanceID' "
00099 "property: %s, %s" % (cim_pool.items(), cim_pool.path))
00100
00101
00102 def cim_pool_pros():
00103 """
00104 Return a list of CIM_StoragePool properties required to generate lsm.Pool.
00105 """
00106 pool_pros = cim_pool_id_pros()
00107 pool_pros.extend(['ElementName', 'TotalManagedSpace',
00108 'RemainingManagedSpace', 'Usage',
00109 'OperationalStatus'])
00110 return pool_pros
00111
00112
00113 def _pool_element_type(smis_common, cim_pool):
00114 """
00115 Return a set (Pool.element_type, Pool.unsupported)
00116 Using CIM_StorageConfigurationCapabilities
00117 'SupportedStorageElementFeatures' and 'SupportedStorageElementTypes'
00118 property.
00119 For MegaRAID, just return (Pool.ELEMENT_TYPE_VOLUME, 0)
00120 """
00121 if smis_common.is_megaraid():
00122 return Pool.ELEMENT_TYPE_VOLUME | Pool.ELEMENT_TYPE_VOLUME_FULL, 0
00123
00124 element_type = 0
00125 unsupported = 0
00126
00127
00128 cim_sccs = smis_common.Associators(
00129 cim_pool.path,
00130 AssocClass='CIM_ElementCapabilities',
00131 ResultClass='CIM_StorageConfigurationCapabilities',
00132 PropertyList=['SupportedStorageElementFeatures',
00133 'SupportedStorageElementTypes'])
00134
00135
00136
00137
00138 if len(cim_sccs) == 1:
00139 cim_scc = cim_sccs[0]
00140 if 'SupportedStorageElementFeatures' in cim_scc:
00141 supported_features = cim_scc['SupportedStorageElementFeatures']
00142 supported_types = cim_scc['SupportedStorageElementTypes']
00143
00144 if dmtf.SUPPORT_VOL_CREATE in supported_features:
00145 element_type = Pool.ELEMENT_TYPE_VOLUME
00146 if dmtf.ELEMENT_THIN_VOLUME in supported_types:
00147 element_type |= Pool.ELEMENT_TYPE_VOLUME_THIN
00148 if dmtf.ELEMENT_THICK_VOLUME in supported_types:
00149 element_type |= Pool.ELEMENT_TYPE_VOLUME_FULL
00150 if dmtf.SUPPORT_ELEMENT_EXPAND not in supported_features:
00151 unsupported |= Pool.UNSUPPORTED_VOLUME_GROW
00152 if dmtf.SUPPORT_ELEMENT_REDUCE not in supported_features:
00153 unsupported |= Pool.UNSUPPORTED_VOLUME_SHRINK
00154
00155 else:
00156
00157
00158
00159
00160
00161
00162 if cim_pool.classname == 'IBMTSDS_VirtualPool' or \
00163 cim_pool.classname == 'IBMTSDS_ExtentPool':
00164 element_type = Pool.ELEMENT_TYPE_VOLUME
00165 elif cim_pool.classname == 'IBMTSDS_RankPool':
00166 element_type = Pool.ELEMENT_TYPE_POOL
00167 elif cim_pool.classname == 'LSIESG_StoragePool':
00168 element_type = Pool.ELEMENT_TYPE_VOLUME
00169
00170 if 'Usage' in cim_pool:
00171 usage = cim_pool['Usage']
00172
00173 if usage == dmtf.POOL_USAGE_UNRESTRICTED:
00174 element_type |= Pool.ELEMENT_TYPE_VOLUME
00175 if usage == dmtf.POOL_USAGE_RESERVED_FOR_SYSTEM or \
00176 usage > dmtf.POOL_USAGE_DELTA:
00177 element_type |= Pool.ELEMENT_TYPE_SYS_RESERVED
00178 if usage == dmtf.POOL_USAGE_DELTA:
00179
00180 element_type = Pool.ELEMENT_TYPE_DELTA
00181
00182 return element_type, unsupported
00183
00184
00185 _LSM_POOL_OP_STATUS_CONV = {
00186 dmtf.OP_STATUS_OK: Pool.STATUS_OK,
00187 dmtf.OP_STATUS_ERROR: Pool.STATUS_ERROR,
00188 dmtf.OP_STATUS_DEGRADED: Pool.STATUS_OK | Pool.STATUS_DEGRADED,
00189 dmtf.OP_STATUS_NON_RECOVERABLE_ERROR: Pool.STATUS_ERROR,
00190 dmtf.OP_STATUS_SUPPORTING_ENTITY_IN_ERROR: Pool.STATUS_ERROR,
00191 }
00192
00193
00194 def _pool_status_of_cim_pool(dmtf_op_status_list):
00195 """
00196 Convert CIM_StoragePool['OperationalStatus'] to LSM
00197 """
00198 return dmtf.op_status_list_conv(
00199 _LSM_POOL_OP_STATUS_CONV, dmtf_op_status_list,
00200 Pool.STATUS_UNKNOWN, Pool.STATUS_OTHER)
00201
00202
00203 def cim_pool_to_lsm_pool(smis_common, cim_pool, system_id):
00204 """
00205 Return a Pool object base on information of cim_pool.
00206 Assuming cim_pool already holding correct properties.
00207 """
00208 status_info = ''
00209 pool_id = pool_id_of_cim_pool(cim_pool)
00210 name = ''
00211 total_space = Pool.TOTAL_SPACE_NOT_FOUND
00212 free_space = Pool.FREE_SPACE_NOT_FOUND
00213 status = Pool.STATUS_OK
00214 if 'ElementName' in cim_pool:
00215 name = cim_pool['ElementName']
00216 if 'TotalManagedSpace' in cim_pool:
00217 total_space = cim_pool['TotalManagedSpace']
00218 if 'RemainingManagedSpace' in cim_pool:
00219 free_space = cim_pool['RemainingManagedSpace']
00220 if 'OperationalStatus' in cim_pool:
00221 (status, status_info) = _pool_status_of_cim_pool(
00222 cim_pool['OperationalStatus'])
00223
00224 element_type, unsupported = _pool_element_type(smis_common, cim_pool)
00225
00226 plugin_data = cim_path_to_path_str(cim_pool.path)
00227
00228 return Pool(pool_id, name, element_type, unsupported,
00229 total_space, free_space,
00230 status, status_info, system_id, plugin_data)
00231
00232
00233 def lsm_pool_to_cim_pool_path(smis_common, lsm_pool):
00234 """
00235 Convert lsm.Pool to CIMInstanceName of CIM_StoragePool using
00236 lsm.Pool.plugin_data
00237 """
00238 if not lsm_pool.plugin_data:
00239 raise LsmError(
00240 ErrorNumber.PLUGIN_BUG,
00241 "Got lsm.Pool instance with empty plugin_data")
00242 if smis_common.system_list and \
00243 lsm_pool.system_id not in smis_common.system_list:
00244 raise LsmError(
00245 ErrorNumber.NOT_FOUND_SYSTEM,
00246 "System filtered in URI")
00247
00248 return path_str_to_cim_path(lsm_pool.plugin_data)
00249
00250
00251 def pool_id_of_cim_vol(smis_common, cim_vol_path):
00252 """
00253 Find out the lsm.Pool.id of CIM_StorageVolume
00254 """
00255 property_list = cim_pool_id_pros()
00256 cim_pools = smis_common.Associators(
00257 cim_vol_path,
00258 AssocClass='CIM_AllocatedFromStoragePool',
00259 ResultClass='CIM_StoragePool',
00260 PropertyList=property_list)
00261 if len(cim_pools) != 1:
00262 raise LsmError(
00263 ErrorNumber.PLUGIN_BUG,
00264 "pool_id_of_cim_vol(): Got unexpected count(%d) of cim_pool " %
00265 len(cim_pools) +
00266 "associated to cim_vol: %s, %s" % (cim_vol_path, cim_pools))
00267 return pool_id_of_cim_pool(cim_pools[0])