def _parse_ipmi_sel_data(node, sel_data): """Parse the IPMI sensors data and format to the dict grouping by type. We run 'ipmitool' command with 'sdr -v' options, which can return sensor details in human-readable format, we need to format them to JSON string dict-based data for Ceilometer Collector which can be sent it as payload out via notification bus and consumed by Ceilometer Collector. :param sel_data: the sensor data returned by ipmitool command. :returns: the sel data with JSON format, grouped by sensor type. :raises: FailedToParselData when error encountered during parsing. """ sels_data_dict = {} package_dic = {} event_name = "N" if not sel_data: return sels_data_dict sels_data_array = sel_data.split('\n') for sel_data in sels_data_array: try: event_name, sel_event = _process_sel(sel_data) except Exception as e: continue LOG.warn( _LW("Failed to get sensor data for node %(node)s. " "Error: %(error)s"), { 'node': node_uuid, 'error': str(e) }) if len(event_name) > 0: sels_data_dict[event_name] = sel_event # sensor_type = _get_sensor_type(node, sensor_data_dict) # # # ignore the sensors which has no current 'Sensor Reading' data # if 'Sensor Reading' in sensor_data_dict: # sensors_data_dict.setdefault(sensor_type, # {})[sensor_data_dict['Sensor ID']] = sensor_data_dict # # # get nothing, no valid sensor data if not sels_data_dict: raise exception.FailedToParseSensorData( node=node.uuid, error=(_("parse ipmi sensor data failed, get nothing with input" " data: %(sensors_data)s") % { 'sensors_data': sel_data })) package_dic['sel'] = sels_data_dict return package_dic
def _get_sensor_type(node, sensor_data_dict): # Have only three sensor type name IDs: 'Sensor Type (Analog)' # 'Sensor Type (Discrete)' and 'Sensor Type (Threshold)' for key in ('Sensor Type (Analog)', 'Sensor Type (Discrete)', 'Sensor Type (Threshold)'): try: return sensor_data_dict[key].split(' ', 1)[0] except KeyError: continue raise exception.FailedToParseSensorData( node=node.uuid, error=(_("parse ipmi sensor data failed, unknown sensor type" " data: %(sensors_data)s"), {'sensors_data': sensor_data_dict}))
def _parse_ipmi_sensors_data(node, sensors_data): """Parse the IPMI sensors data and format to the dict grouping by type. We run 'ipmitool' command with 'sdr -v' options, which can return sensor details in human-readable format, we need to format them to JSON string dict-based data for Ceilometer Collector which can be sent it as payload out via notification bus and consumed by Ceilometer Collector. :param sensors_data: the sensor data returned by ipmitool command. :returns: the sensor data with JSON format, grouped by sensor type. :raises: FailedToParseSensorData when error encountered during parsing. """ sensors_data_dict = {} if not sensors_data: return sensors_data_dict sensors_data_array = sensors_data.split('\n\n') for sensor_data in sensors_data_array: sensor_data_dict = _process_sensor(sensor_data) if not sensor_data_dict: continue sensor_type = _get_sensor_type(node, sensor_data_dict) # ignore the sensors which has no current 'Sensor Reading' data if 'Sensor Reading' in sensor_data_dict: sensors_data_dict.setdefault( sensor_type, {})[sensor_data_dict['Sensor ID']] = sensor_data_dict # get nothing, no valid sensor data if not sensors_data_dict: raise exception.FailedToParseSensorData( node=node.uuid, error=(_("parse ipmi sensor data failed, get nothing with input" " data: %(sensors_data)s") % { 'sensors_data': sensors_data })) return sensors_data_dict