Source code for openlmi.storage.LMI_VGStorageCapabilities

# Copyright (C) 2012 Red Hat, Inc.  All rights reserved.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#
# Authors: Jan Safranek <jsafrane@redhat.com>
# -*- coding: utf-8 -*-
""""
Module for LMI_VGStorageCapabilities class.

LMI_VGStorageCapabilities
-------------------------

.. autoclass:: LMI_VGStorageCapabilities
    :members:

"""

from openlmi.storage.CapabilitiesProvider import CapabilitiesProvider
from openlmi.storage.SettingManager import Setting
import pywbem
import openlmi.common.cmpi_logging as cmpi_logging
import openlmi.storage.util.units as units
from openlmi.storage.DeviceProvider import DeviceProvider

DEFAULT_EXTENT_SIZE = 4 * units.MEGABYTE

[docs]class LMI_VGStorageCapabilities(CapabilitiesProvider): """ LMI_VGStorageCapabilities provider implementation. """ INSTANCE_ID = "LMI:LMI_VGStorageCapabilities:Global" @cmpi_logging.trace_method
[docs] def __init__(self, *args, **kwargs): super(LMI_VGStorageCapabilities, self).__init__( "LMI_VGStorageCapabilities", *args, **kwargs) self.instances = [ { 'InstanceID': LMI_VGStorageCapabilities.INSTANCE_ID, 'ElementName': LMI_VGStorageCapabilities.INSTANCE_ID, 'DataRedundancyDefault': pywbem.Uint16(1), 'DataRedundancyMax': pywbem.Uint16(units.MAXINT16), 'DataRedundancyMin': pywbem.Uint16(1), 'NoSinglePointOfFailure': True, 'NoSinglePointOfFailureDefault': False, 'ExtentStripeLengthDefault': pywbem.Uint16(1), 'PackageRedundancyDefault': pywbem.Uint16(0), 'PackageRedundancyMax': pywbem.Uint16(units.MAXINT16), 'PackageRedundancyMin': pywbem.Uint16(0), 'ExtentSizeDefault': pywbem.Uint64(DEFAULT_EXTENT_SIZE), 'ParityLayoutDefault': pywbem.Uint16(0) }, ]
@cmpi_logging.trace_method
[docs] def enumerate_capabilities(self): """ Return an iterable with all capabilities instances, i.e. dictionaries property_name -> value. If the capabilities are the default ones, it must have '_default' as a property name. """ return self.instances
@cmpi_logging.trace_method # pylint: disable-msg=W0221
[docs] def create_setting_for_capabilities(self, capabilities, default=False): """ Create LMI_VGStorageSetting for given capabilities. Return CIMInstanceName of the setting or raise CIMError on error. """ setting_id = self.setting_manager.allocate_id( 'LMI_VGStorageSetting') if not setting_id: raise pywbem.CIMError(pywbem.CIM_ERR_FAILED, "Failed to allocate setting InstanceID") setting = self.setting_manager.create_setting( 'LMI_VGStorageSetting', Setting.TYPE_TRANSIENT, setting_id) if default: setting['ExtentSize'] = pywbem.Uint64( capabilities['ExtentSizeDefault']) setting['DataRedundancyGoal'] = pywbem.Uint16( capabilities['DataRedundancyDefault']) setting['DataRedundancyMax'] = pywbem.Uint16( capabilities['DataRedundancyDefault']) setting['DataRedundancyMin'] = pywbem.Uint16( capabilities['DataRedundancyDefault']) setting['ExtentStripeLength'] = pywbem.Uint16( capabilities['ExtentStripeLengthDefault']) setting['ExtentStripeLengthMax'] = pywbem.Uint16( capabilities['ExtentStripeLengthDefault']) setting['ExtentStripeLengthMin'] = pywbem.Uint16( capabilities['ExtentStripeLengthDefault']) setting['NoSinglePointOfFailure'] = \ capabilities['NoSinglePointOfFailureDefault'] setting['PackageRedundancyGoal'] = pywbem.Uint16( capabilities['PackageRedundancyDefault']) setting['PackageRedundancyMax'] = pywbem.Uint16( capabilities['PackageRedundancyDefault']) setting['PackageRedundancyMin'] = pywbem.Uint16( capabilities['PackageRedundancyDefault']) if capabilities['ParityLayoutDefault']: setting['ParityLayout'] = pywbem.Uint16( capabilities['ParityLayoutDefault'] - 1) else: setting['ParityLayout'] = None else: setting['ExtentSize'] = pywbem.Uint64( capabilities['ExtentSizeDefault']) setting['DataRedundancyGoal'] = pywbem.Uint16( capabilities['DataRedundancyDefault']) setting['DataRedundancyMax'] = pywbem.Uint16( capabilities['DataRedundancyMax']) setting['DataRedundancyMin'] = pywbem.Uint16( capabilities['DataRedundancyMin']) setting['ExtentStripeLength'] = pywbem.Uint16( capabilities['ExtentStripeLengthDefault']) setting['ExtentStripeLengthMax'] = pywbem.Uint16( capabilities['ExtentStripeLengthDefault']) setting['ExtentStripeLengthMin'] = pywbem.Uint16( capabilities['ExtentStripeLengthDefault']) setting['NoSinglePointOfFailure'] = \ capabilities['NoSinglePointOfFailureDefault'] setting['PackageRedundancyGoal'] = pywbem.Uint16( capabilities['PackageRedundancyDefault']) setting['PackageRedundancyMax'] = pywbem.Uint16( capabilities['PackageRedundancyMax']) setting['PackageRedundancyMin'] = pywbem.Uint16( capabilities['PackageRedundancyMin']) if capabilities['ParityLayoutDefault']: setting['ParityLayout'] = pywbem.Uint16( capabilities['ParityLayoutDefault'] - 1) else: setting['ParityLayout'] = None setting['ElementName'] = 'CreatedFrom' + capabilities['InstanceID'] self.setting_manager.set_setting('LMI_VGStorageSetting', setting) return pywbem.CIMInstanceName( classname='LMI_VGStorageSetting', namespace=self.config.namespace, keybindings={'InstanceID': setting_id})
@cmpi_logging.trace_method # pylint: disable-msg=W0221
[docs] def cim_method_createsetting(self, env, object_name, param_settingtype=None): """ Implements LMI_VGStorageCapabilities.CreateSetting() Method to create and populate a StorageSetting instance from a StorageCapability instance. This removes the need to populate default settings and other settings in the context of each StorageCapabilities (which could be numerous). If the underlying instrumentation supports the StorageSettingWithHints subclass, then an instance of that class will be created instead. """ default = False if param_settingtype: setting_types = self.Values.CreateSetting.SettingType if param_settingtype == setting_types.Default: default = True elif param_settingtype == setting_types.Goal: default = False else: raise pywbem.CIMError(pywbem.CIM_ERR_INVALID_PARAMETER, "Parameter SettingType has invalid value.") capabilities = self.get_capabilities_for_id(object_name['InstanceID']) if not capabilities: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Cannot find the Capabilities.") setting_name = self.create_setting_for_capabilities( capabilities, default) outparams = [pywbem.CIMParameter('newsetting', type='reference', value=setting_name)] rval = self.Values.CreateSetting.Success return (rval, outparams)
@cmpi_logging.trace_method
[docs] def cim_method_createvgstoragesetting(self, env, object_name, param_inextents=None): """ Implements LMI_VGStorageCapabilities.CreateVGStorageSetting() This method creates new instance of LMI_VGStorageSetting. Applications then do not need to calculate DataRedundancy, PackageRedundancy and ExtentStripeLength. """ if not param_inextents: # just return default setting return self.cim_method_createsetting(env, object_name) # find the common redundancy # create list of redundancies of all input devices # (assuming 'linear' composition) redundancies = [] for device_name in param_inextents: provider = self.provider_manager.get_device_provider_for_name( device_name) if not provider: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Cannot find provider for one of the input extents.") device = provider.get_device_for_name(device_name) if not device: raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Cannot find device for one of the input extents.") redundancy = provider.get_redundancy(device) redundancies.append(redundancy) final_redundancy = DeviceProvider.Redundancy.get_common_redundancy_list( redundancies) setting_id = self.setting_manager.allocate_id( 'LMI_VGStorageSetting') if not setting_id: raise pywbem.CIMError(pywbem.CIM_ERR_FAILED, "Failed to allocate setting InstanceID") setting = self.setting_manager.create_setting( 'LMI_VGStorageSetting', Setting.TYPE_TRANSIENT, setting_id) setting['ExtentSize'] = pywbem.Uint64(DEFAULT_EXTENT_SIZE) setting['DataRedundancyGoal'] = pywbem.Uint16( final_redundancy.data_redundancy) setting['DataRedundancyMax'] = pywbem.Uint16( final_redundancy.data_redundancy) setting['DataRedundancyMin'] = pywbem.Uint16( final_redundancy.data_redundancy) setting['ExtentStripeLength'] = pywbem.Uint16( final_redundancy.stripe_length) setting['ExtentStripeLengthMax'] = pywbem.Uint16( final_redundancy.stripe_length) setting['ExtentStripeLengthMin'] = pywbem.Uint16( final_redundancy.stripe_length) setting['NoSinglePointOfFailure'] = \ final_redundancy.no_single_point_of_failure setting['PackageRedundancyGoal'] = pywbem.Uint16( final_redundancy.package_redundancy) setting['PackageRedundancyMax'] = pywbem.Uint16( final_redundancy.package_redundancy) setting['PackageRedundancyMin'] = pywbem.Uint16( final_redundancy.package_redundancy) if final_redundancy.parity_layout is not None: setting['ParityLayout'] = pywbem.Uint16( final_redundancy.parity_layout) else: setting['ParityLayout'] = None setting['ElementName'] = 'CreatedFrom' + object_name['InstanceID'] self.setting_manager.set_setting('LMI_VGStorageSetting', setting) outparams = [ pywbem.CIMParameter('setting', type='reference', value=pywbem.CIMInstanceName( classname='LMI_VGStorageSetting', namespace=self.config.namespace, keybindings={'InstanceID': setting_id}))] return (self.Values.CreateVGStorageSetting.Success, outparams)
class Values(CapabilitiesProvider.Values): class CreateSetting(object): Success = pywbem.Uint32(0) Not_Supported = pywbem.Uint32(1) Unspecified_Error = pywbem.Uint32(2) Timeout = pywbem.Uint32(3) Failed = pywbem.Uint32(4) Invalid_Parameter = pywbem.Uint32(5) # DMTF_Reserved = .. # Vendor_Specific = 32768..65535 class SettingType(object): Default = pywbem.Uint16(2) Goal = pywbem.Uint16(3) class CreateVGStorageSetting(object): Success = pywbem.Uint32(0) Not_Supported = pywbem.Uint32(1) Failed = pywbem.Uint32(4) class ParityLayoutDefault(object): Non_Rotated_Parity = pywbem.Uint16(2) Rotated_Parity = pywbem.Uint16(3)