Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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}))
Ejemplo n.º 3
0
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