2
0
mirror of https://opendev.org/x/pyghmi synced 2026-01-11 02:32:31 +00:00

Add XCC3 specific health check

The active events interface is more useful and informative than
generic redfish.

Change-Id: I20af532f32dfde1b596ac8c974ba1089705b5aae
This commit is contained in:
Jarrod Johnson
2025-02-07 14:51:51 -05:00
parent 2a91bb3f80
commit 2cde74a34f

View File

@@ -13,6 +13,7 @@
# limitations under the License.
import copy
import json
import pyghmi.constants as pygconst
import pyghmi.redfish.oem.generic as generic
import pyghmi.exceptions as pygexc
import pyghmi.util.webclient as webclient
@@ -20,6 +21,22 @@ import zipfile
import time
import os.path
class SensorReading(object):
def __init__(self, healthinfo, sensor=None, value=None, units=None,
unavailable=False):
if sensor:
self.name = sensor['name']
else:
self.name = healthinfo['name']
self.health = healthinfo['health']
self.states = healthinfo['states']
self.state_ids = healthinfo.get('state_ids', None)
self.value = value
self.imprecision = None
self.units = units
self.unavailable = unavailable
class OEMHandler(generic.OEMHandler):
def supports_expand(self, url):
@@ -64,6 +81,42 @@ class OEMHandler(generic.OEMHandler):
powerinfo = fishclient._do_web_request('/redfish/v1/Chassis/1/Sensors/power_Sys_Power')
return powerinfo['Reading']
def get_health(self, fishclient, verbose=True):
rsp = self._do_web_request('/api/providers/imm_active_events')
summary = {'badreadings': [], 'health': pygconst.Health.Ok}
fallbackdata = []
hmap = {
0 : pygconst.Health.Ok,
3: pygconst.Health.Critical,
2: pygconst.Health.Warning,
}
infoevents = False
existingevts = set([])
for item in rsp.get('items', ()):
# while usually the ipmi interrogation shall explain things,
# just in case there is a gap, make sure at least the
# health field is accurately updated
itemseverity = hmap.get(item.get('Severity', 2),
pygconst.Health.Critical)
if itemseverity == pygconst.Health.Ok:
infoevents = True
continue
if (summary['health'] < itemseverity):
summary['health'] = itemseverity
evtsrc = item.get('Oem', {}).get('Lenovo', {}).get('Source', '')
currevt = '{}:{}'.format(evtsrc, item['Message'])
if currevt in existingevts:
continue
existingevts.add(currevt)
fallbackdata.append(SensorReading({
'name': evtsrc,
'states': [item['Message']],
'health': itemseverity,
'type': evtsrc,
}, ''))
summary['badreadings'] = fallbackdata
return summary
def _get_cpu_temps(self, fishclient):
cputemps = []
for reading in super()._get_cpu_temps(fishclient):