From 0b94605ffd904b01a4ff3c031faed066fc98e4b1 Mon Sep 17 00:00:00 2001 From: Penghui Cui Date: Fri, 8 Oct 2021 19:49:21 +0800 Subject: [PATCH] Support alarm level definition extention Change-Id: I38ec04e46bf5a70dc87991a8f187f5421902b6d5 --- pyghmi/ipmi/command.py | 4 ++++ pyghmi/ipmi/events.py | 15 ++++++++------- pyghmi/ipmi/oem/generic.py | 4 ++++ pyghmi/ipmi/sdr.py | 16 ++++++++-------- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/pyghmi/ipmi/command.py b/pyghmi/ipmi/command.py index 890a3415..f650acf1 100644 --- a/pyghmi/ipmi/command.py +++ b/pyghmi/ipmi/command.py @@ -584,6 +584,10 @@ class Command(object): self._sdr = sdr.SDR(self, self._sdrcachedir) return self._sdr + def get_event_constants(self): + self.oem_init() + return self._oem.get_oem_event_const() + def get_event_log(self, clear=False): """Retrieve the log of events, optionally clearing diff --git a/pyghmi/ipmi/events.py b/pyghmi/ipmi/events.py index ea653fa4..1710e9d6 100644 --- a/pyghmi/ipmi/events.py +++ b/pyghmi/ipmi/events.py @@ -17,7 +17,6 @@ import time import pyghmi.constants as pygconst import pyghmi.exceptions as pygexc -import pyghmi.ipmi.private.constants as ipmiconst try: range = xrange @@ -188,7 +187,7 @@ fru_states = { } -def decode_eventdata(sensor_type, offset, eventdata, sdr): +def decode_eventdata(sensor_type, offset, eventdata, event_consts, sdr): """Decode extra event data from an alert or log Provide a textual summary of eventdata per descriptions in @@ -198,6 +197,7 @@ def decode_eventdata(sensor_type, offset, eventdata, sdr): :param sensor_type: The sensor type number from the event :param offset: Sensor specific offset :param eventdata: The three bytes from the log or alert + :param event_consts: event definition including severity. :param sdr: The sdr locator entry to help clarify how to parse data """ if sensor_type == 5 and offset == 4: # link loss, indicates which port @@ -280,7 +280,7 @@ def decode_eventdata(sensor_type, offset, eventdata, sdr): if oldstate != offset: try: cause += '(change from {0})'.format( - ipmiconst.sensor_type_offsets[0x2c][oldstate]['desc']) + event_consts.sensor_type_offsets[0x2c][oldstate]['desc']) except KeyError: pass @@ -404,6 +404,7 @@ class EventHandler(object): def __init__(self, sdr, ipmicmd): self._sdr = sdr self._ipmicmd = ipmicmd + self.event_consts = ipmicmd.get_event_constants() def _populate_event(self, deassertion, event, event_data, event_type, sensor_type, sensorid): @@ -427,9 +428,9 @@ class EventHandler(object): event['component_type_id'] = sensor_type event['event_id'] = '{0}.{1}'.format(event_type, evtoffset) # use generic offset decode for event description - event['component_type'] = ipmiconst.sensor_type_codes.get( + event['component_type'] = self.event_consts.sensor_type_codes.get( sensor_type, '') - evreading = ipmiconst.generic_type_offsets.get( + evreading = self.event_consts.generic_type_offsets.get( event_type, {}).get(evtoffset, {}) if event['deassertion']: event['event'] = evreading.get('deassertion_desc', '') @@ -442,9 +443,9 @@ class EventHandler(object): elif event_type == 0x6f: event['component_type_id'] = sensor_type event['event_id'] = '{0}.{1}'.format(event_type, evtoffset) - event['component_type'] = ipmiconst.sensor_type_codes.get( + event['component_type'] = self.event_consts.sensor_type_codes.get( sensor_type, '') - evreading = ipmiconst.sensor_type_offsets.get( + evreading = self.event_consts.sensor_type_offsets.get( sensor_type, {}).get(evtoffset, {}) if event['deassertion']: event['event'] = evreading.get('deassertion_desc', '') diff --git a/pyghmi/ipmi/oem/generic.py b/pyghmi/ipmi/oem/generic.py index 40739d34..2aaef5a6 100644 --- a/pyghmi/ipmi/oem/generic.py +++ b/pyghmi/ipmi/oem/generic.py @@ -13,6 +13,7 @@ # limitations under the License. import pyghmi.exceptions as exc +import pyghmi.ipmi.private.constants as event_const class OEMHandler(object): @@ -432,3 +433,6 @@ class OEMHandler(object): :return: power capping value. """ return None + + def get_oem_event_const(self): + return event_const diff --git a/pyghmi/ipmi/sdr.py b/pyghmi/ipmi/sdr.py index b438c09b..daa7fcb0 100644 --- a/pyghmi/ipmi/sdr.py +++ b/pyghmi/ipmi/sdr.py @@ -40,7 +40,6 @@ import six import pyghmi.constants as const import pyghmi.exceptions as exc -import pyghmi.ipmi.private.constants as ipmiconst try: import cPickle as pickle @@ -288,10 +287,11 @@ class SDREntry(object): external code to pay attention to this class. """ - def __init__(self, entrybytes, reportunsupported=False, + def __init__(self, entrybytes, event_consts, reportunsupported=False, mfg_id=0, prod_id=0): self.mfg_id = mfg_id self.prod_id = prod_id + self.event_consts = event_consts # ignore record id for now, we only care about the sensor number for # moment self.readable = True @@ -379,7 +379,7 @@ class SDREntry(object): self.sensor_owner = entry[0] self.sensor_lun = entry[1] & 0x03 self.sensor_number = entry[2] - self.entity = ipmiconst.entity_ids.get( + self.entity = self.event_consts.entity_ids.get( entry[3], 'Unknown entity {0}'.format(entry[3])) if self.rectype == 3: self.sensor_type_number = entry[5] @@ -388,7 +388,7 @@ class SDREntry(object): self.sensor_type_number = entry[7] self.reading_type = entry[8] # table 42-1 try: - self.sensor_type = ipmiconst.sensor_type_codes[ + self.sensor_type = self.event_consts.sensor_type_codes[ self.sensor_type_number] except KeyError: self.sensor_type = "UNKNOWN type " + str(self.sensor_type_number) @@ -456,13 +456,13 @@ class SDREntry(object): self.decode_formula(entry[19:25]) def _decode_state(self, state): - mapping = ipmiconst.generic_type_offsets + mapping = self.event_consts.generic_type_offsets try: if self.reading_type in mapping: desc = mapping[self.reading_type][state]['desc'] health = mapping[self.reading_type][state]['severity'] elif self.reading_type == 0x6f: - mapping = ipmiconst.sensor_type_offsets + mapping = self.event_consts.sensor_type_offsets desc = mapping[self.sensor_type_number][state]['desc'] health = mapping[self.sensor_type_number][state]['severity'] elif self.reading_type >= 0x70 and self.reading_type <= 0x7f: @@ -853,8 +853,8 @@ class SDR(object): yield number def add_sdr(self, sdrbytes): - newent = SDREntry(sdrbytes, False, self.mfg_id, - self.prod_id) + newent = SDREntry(sdrbytes, self.ipmicmd.get_event_constants(), + False, self.mfg_id, self.prod_id) if newent.sdrtype == TYPE_SENSOR: id = '{0}.{1}.{2}'.format( newent.sensor_owner, newent.sensor_number, newent.sensor_lun)