'Read and process a notification.
The guts of a message are in dict value of a \'payload\' key
which then itself has a payload key containing a dict of
multiple sensor readings.
If expected keys in the payload are missing or values
are not in the expected form for transformations,
KeyError and ValueError are caught and the current
sensor payload is skipped.'

def process_notification(self, message):

    payloads = self._get_sample(message['payload'])
    for payload in payloads:
        try:
            resource_id = 'missing    id'
            try:
                resource_id = ('%(nodeid)s-%(sensorid)s' % {'nodeid': message['payload']['node_uuid'], 'sensorid': transform_id(payload['Sensor    ID'])})
            except KeyError as exc:
                raise InvalidSensorData(('missing    key    in    payload:    %s' % exc))
            info = self._package_payload(message, payload)
            try:
                sensor_reading = info['payload']['Sensor    Reading']
            except KeyError as exc:
                raise InvalidSensorData("missing    'Sensor    Reading'    in    payload")
            if validate_reading(sensor_reading):
                (volume, unit) = parse_reading(sensor_reading)
                (yield sample.Sample.from_notification(name=('hardware.ipmi.%s' % self.metric.lower()), type=sample.TYPE_GAUGE, unit=unit, volume=volume, resource_id=resource_id, message=info, user_id=info['user_id'], project_id=info['project_id'], timestamp=info['timestamp']))
        except InvalidSensorData as exc:
            LOG.warning(('invalid    sensor    data    for    %(resource)s:    %(error)s' % dict(resource=resource_id, error=exc)))
            continue
