def _get_sensors_data(task): """Get sensors data method. It gets sensor data from the task's node via SCCI, and convert the data from XML to the dict format. :param task: A TaskManager instance. :raises: FailedToGetSensorData when getting the sensor data fails. :returns: Returns a consistent formatted dict of sensor data grouped by sensor type, which can be processed by Ceilometer. """ try: report = irmc_common.get_irmc_report(task.node) sensor = scci.get_sensor_data(report) except (exception.InvalidParameterValue, exception.MissingParameterValue, scci.SCCIInvalidInputError, scci.SCCIClientError) as e: LOG.error(_LE("SCCI get sensor data failed for node %(node_id)s " "with the following error: %(error)s"), {'node_id': task.node.uuid, 'error': e}) raise exception.FailedToGetSensorData( node=task.node.uuid, error=e) sensors_data = {} for sdr in sensor: sensor_type_name = sdr.find('./Data/Decoded/Sensor/TypeName') sensor_type_number = sdr.find('./Data/Decoded/Sensor/Type') entity_name = sdr.find('./Data/Decoded/Entity/Name') entity_id = sdr.find('./Data/Decoded/Entity/ID') if None in (sensor_type_name, sensor_type_number, entity_name, entity_id): continue sensor_type = ('%s (%s)' % (sensor_type_name.text, sensor_type_number.text)) sensor_id = ('%s (%s)' % (entity_name.text, entity_id.text)) reading_value = sdr.find( './Data/Decoded/Sensor/Thresholds/*/Normalized') reading_value_text = "None" if ( reading_value is None) else str(reading_value.text) reading_units = sdr.find('./Data/Decoded/Sensor/BaseUnitName') reading_units_text = "None" if ( reading_units is None) else str(reading_units.text) sensor_reading = '%s %s' % (reading_value_text, reading_units_text) sensors_data.setdefault(sensor_type, {})[sensor_id] = { 'Sensor Reading': sensor_reading, 'Sensor ID': sensor_id, 'Units': reading_units_text, } return sensors_data
def _get_sensors_data(driver_info): """Get sensors data. :param driver_info: node's driver info :raises: FailedToGetSensorData when getting the sensor data fails. :returns: returns a dict of sensor data group by sensor type. """ try: ipmicmd = ipmi_command.Command(bmc=driver_info['address'], userid=driver_info['username'], password=driver_info['password']) ret = ipmicmd.get_sensor_data() except Exception as e: LOG.error( _LE("IPMI get sensor data failed for node %(node_id)s " "with the following error: %(error)s"), { 'node_id': driver_info['uuid'], 'error': e }) raise exception.FailedToGetSensorData(node=driver_info['uuid'], error=e) if not ret: return {} sensors_data = {} for reading in ret: # ignore the sensor data which has no sensor reading value if not reading.value: continue sensors_data.setdefault(reading.type, {})[reading.name] = { 'Sensor Reading': '%s %s' % (reading.value, reading.units), 'Sensor ID': reading.name, 'States': str(reading.states), 'Units': reading.units, 'Health': str(reading.health) } return sensors_data
def get_sensors_data(self, task): """Get sensors data. :param task: a TaskManager instance. :raises: FailedToGetSensorData when getting the sensor data fails. :raises: FailedToParseSensorData when parsing sensor data fails. :raises: InvalidParameterValue if required ipmi parameters are missing :raises: MissingParameterValue if a required parameter is missing. :returns: returns a dict of sensor data group by sensor type. """ driver_info = _parse_driver_info(task.node) # with '-v' option, we can get the entire sensor data including the # extended sensor informations cmd = "sdr -v" try: out, err = _exec_ipmitool(driver_info, cmd) except (exception.PasswordFileFailedToCreate, processutils.ProcessExecutionError) as e: raise exception.FailedToGetSensorData(node=task.node.uuid, error=e) return _parse_ipmi_sensors_data(task.node, out)