summaryrefslogtreecommitdiff
path: root/ceilometer/ipmi/platform/ipmi_sensor.py
diff options
context:
space:
mode:
Diffstat (limited to 'ceilometer/ipmi/platform/ipmi_sensor.py')
-rw-r--r--ceilometer/ipmi/platform/ipmi_sensor.py115
1 files changed, 115 insertions, 0 deletions
diff --git a/ceilometer/ipmi/platform/ipmi_sensor.py b/ceilometer/ipmi/platform/ipmi_sensor.py
new file mode 100644
index 00000000..9749c485
--- /dev/null
+++ b/ceilometer/ipmi/platform/ipmi_sensor.py
@@ -0,0 +1,115 @@
+# Copyright 2014 Intel Corporation.
+#
+# Author: Zhai Edwin <edwin.zhai@intel.com>
+#
+# 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.
+
+"""IPMI sensor to collect various sensor data of compute node"""
+
+from ceilometer.ipmi.platform import exception as ipmiexcept
+from ceilometer.ipmi.platform import ipmitool
+from ceilometer.openstack.common.gettextutils import _
+
+IPMICMD = {"sdr_dump": "sdr dump",
+ "sdr_info": "sdr info",
+ "sensor_dump": "sdr -v",
+ "sensor_dump_temperature": "sdr -v type Temperature",
+ "sensor_dump_current": "sdr -v type Current",
+ "sensor_dump_fan": "sdr -v type Fan",
+ "sensor_dump_voltage": "sdr -v type Voltage"}
+
+# Requires translation of output into dict
+DICT_TRANSLATE_TEMPLATE = {"translate": 1}
+
+
+class IPMISensor(object):
+ """The python implementation of IPMI sensor using ipmitool
+
+ The class implements the IPMI sensor to get various sensor data of
+ compute node. It uses ipmitool to execute the IPMI command and parse
+ the output into dict.
+ """
+ _inited = False
+ _instance = None
+
+ def __new__(cls, *args, **kwargs):
+ """Singleton to avoid duplicated initialization."""
+ if not cls._instance:
+ cls._instance = super(IPMISensor, cls).__new__(cls, *args,
+ **kwargs)
+ return cls._instance
+
+ def __init__(self):
+ if not (self._instance and self._inited):
+ self.ipmi_support = False
+ self._inited = True
+
+ self.ipmi_support = self.check_ipmi()
+
+ @ipmitool.execute_ipmi_cmd()
+ def _get_sdr_info(self):
+ """Get the SDR info."""
+ return IPMICMD['sdr_info']
+
+ @ipmitool.execute_ipmi_cmd(DICT_TRANSLATE_TEMPLATE)
+ def _read_sensor_all(self):
+ """Get the sensor data for type."""
+ return IPMICMD['sensor_dump']
+
+ @ipmitool.execute_ipmi_cmd(DICT_TRANSLATE_TEMPLATE)
+ def _read_sensor_temperature(self):
+ """Get the sensor data for Temperature."""
+ return IPMICMD['sensor_dump_temperature']
+
+ @ipmitool.execute_ipmi_cmd(DICT_TRANSLATE_TEMPLATE)
+ def _read_sensor_voltage(self):
+ """Get the sensor data for Voltage."""
+ return IPMICMD['sensor_dump_voltage']
+
+ @ipmitool.execute_ipmi_cmd(DICT_TRANSLATE_TEMPLATE)
+ def _read_sensor_current(self):
+ """Get the sensor data for Current."""
+ return IPMICMD['sensor_dump_current']
+
+ @ipmitool.execute_ipmi_cmd(DICT_TRANSLATE_TEMPLATE)
+ def _read_sensor_fan(self):
+ """Get the sensor data for Fan."""
+ return IPMICMD['sensor_dump_fan']
+
+ def read_sensor_any(self, sensor_type=''):
+ """Get the sensor data for type."""
+ if not self.ipmi_support:
+ return {}
+
+ mapping = {'': self._read_sensor_all,
+ 'Temperature': self._read_sensor_temperature,
+ 'Fan': self._read_sensor_fan,
+ 'Voltage': self._read_sensor_voltage,
+ 'Current': self._read_sensor_current}
+
+ try:
+ return mapping[sensor_type]()
+ except KeyError:
+ raise ipmiexcept.IPMIException(_('Wrong sensor type'))
+
+ def check_ipmi(self):
+ """IPMI capability checking
+
+ This function is used to detect if compute node is IPMI capable
+ platform. Just run a simple IPMI command to get SDR info for check.
+ """
+ try:
+ self._get_sdr_info()
+ except ipmiexcept.IPMIException:
+ return False
+ return True