# Copyright (C) 2012-2014 Peter Hatina <phatina@redhat.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
import abc
import sys
import re
from lmi.shell.LMIShellLogger import lmi_get_logger
from lmi.shell.LMIUtil import lmi_cast_to_lmi
logger = lmi_get_logger()
[docs]class LMIConstantValues(object):
"""
Abstract class for constant value objects.
:param cim_obj: this object is either of type
:py:class:`wbem.CIMParameter`, :py:class:`wbem.CIMProperty` or
:py:class:`wbem.CIMMethod`. Construction of this object requires to
have a member ``_cast_type`` to properly cast CIM object. When
constructing derived objects, make sure, that the mentioned member is
present before calling this constructor.
:param cast_type: parameter/property cast type
"""
__metaclass__ = abc.ABCMeta
def __init__(self, cim_obj, cast_type):
items = zip(
cim_obj.qualifiers["Values"].value,
cim_obj.qualifiers["ValueMap"].value)
self._value_map = {}
self._value_map_inv = {}
self._cast_type = cast_type
# Fill two dictionaries for bidirectional access to constant values.
cnt = 1
for key, value in items:
try:
# Cast constant value first. If we get ValueError, no key
# modifications are necessary.
val = lmi_cast_to_lmi(self._cast_type, value)
# Keys can contain various undesirable characters, such as
# python operators, etc. So we drop them.
mod_key = re.sub("\W", "", key)
if mod_key[0].isdigit():
mod_key = "Key_" + mod_key
if mod_key in self._value_map:
mod_key += str(cnt)
cnt += 1
logger.warn("Constant value mapped as: '%s' -> '%s'" %
(key, mod_key))
self._value_map[mod_key] = val
# For inverse mapping, we use unmodified key.
self._value_map_inv[val] = key
except ValueError, e:
# Can not cast such value as interval. Can be found in
# DMTFReserved, VendorReserved values.
pass
def __repr__(self):
"""
Returns a string of all constant names with corresponding value.
:returns: pretty string
"""
result = ""
for k, v in self._value_map.iteritems():
result += "%s = %s\n" % (k, v)
return result[:-1]
def __getattr__(self, name):
"""
Returns either a member of the class, or a constant value.
Simplifies the code and constant value can be retrieved by
:samp:`object.constant_value`.
:param string name: member to retrieve
:returns: class member
"""
if name in self._value_map:
return self._value_map[name]
raise AttributeError(name)
[docs] def print_values(self):
"""
Prints all available constant names.
**Usage:** :ref:`class_get_valuemap_properties`.
"""
for k in self._value_map.keys():
sys.stdout.write("%s\n" % k)
[docs] def values_dict(self):
"""
:returns: dictionary of constants' names and values
"""
return self._value_map
[docs] def values(self):
"""
:returns: list of all available constant values
"""
return self._value_map.keys()
[docs] def value(self, value_name):
"""
:param string value_name: constant name
:returns: constant value
**Usage:** :ref:`class_get_valuemap_property_value`.
"""
return getattr(self, value_name)
[docs] def value_name(self, value):
"""
:param int value: numeric constant value
:returns: constant value
:rtype: string
**Usage:** :ref:`class_get_valuemap_property_name`.
"""
return self._value_map_inv[value]
[docs]class LMIConstantValuesParamProp(LMIConstantValues):
"""
Derived class used for constant values of :py:class:`wbem.CIMProperty` and
:py:class:`wbem.CIMParameter`.
:param cim_property: :py:class:`wbem.CIMProperty` or
:py:class:`wbem.CIMParameter` object. Both objects have necessary
member ``type`` which is needed for proper casting.
"""
def __init__(self, cim_property):
super(LMIConstantValuesParamProp, self).__init__(
cim_property, cim_property.type)
[docs]class LMIConstantValuesMethodReturnType(LMIConstantValues):
"""
Derived class used for constant values of :py:class:`wbem.CIMMethod`.
:param CIMMethod cim_method: :py:class:`wbem.CIMMethod` object
"""
def __init__(self, cim_method):
super(LMIConstantValuesMethodReturnType, self).__init__(
cim_method, cim_method.return_type)