Stage alternate power meter support

It may be redundant with SDR
sensors, but stage it for
easier access should it come up
as a needed approach.

Change-Id: I765bbcbcc6c916da2573008bf53f2e88a2a35baa
This commit is contained in:
Jarrod Johnson 2023-03-24 16:29:02 -04:00
parent bcfbd8f1c5
commit 077dbd645b
2 changed files with 35 additions and 30 deletions

View File

@ -31,7 +31,9 @@ class EnergyManager(object):
try:
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
if len(rsp['data']) >= 8:
self.supportedmeters = ('DC Energy',)
self.supportedmeters = ('DC Energy',) # 'GPU Power',
# 'Node Power', 'Total Power')
self._mypowermeters = ('node power', 'total power', 'gpu power', 'riser 1 power', 'riser 2 power')
self._usefapm = True
return
except pygexc.IpmiException:
@ -57,6 +59,23 @@ class EnergyManager(object):
else:
self.supportedmeters = ('DC Energy',)
def supports(self, name):
if name.lower() in self._mypowermeters:
return True
return False
def get_sensor(self, name, ipmicmd):
if name.lower() not in self._mypowermeters:
raise pygexc.UnsupportedFunctionality('Unrecogcized sensor')
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 8, 0, 0, 0])
npow, gpupow, r1pow, r2pow = struct.unpack('<HHHH', rsp['data'][6:10])
if name.lower().startswith('node'):
return npow, 'W'
elif name.lower().startswith('gpu'):
return gpupow, 'W'
elif name.lower().startswith('total'):
return npow + gpupow, 'W'
def get_fapm_energy(self, ipmicmd):
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
j, mj = struct.unpack('<IH', rsp['data'][2:8])

View File

@ -684,8 +684,13 @@ class IMMClient(object):
return ()
def get_oem_sensor_descriptions(self, ipmicmd):
return [{'name': x, 'type': 'Energy'
} for x in self.get_oem_sensor_names(ipmicmd)]
desc = []
for x in self.get_oem_sensor_names(ipmicmd):
desc.append({
'name': x,
'type': 'Power' if 'Power' in x else 'Energy'
})
return desc
def get_oem_sensor_reading(self, name, ipmicmd):
if self._energymanager is None:
@ -694,8 +699,15 @@ class IMMClient(object):
kwh = self._energymanager.get_ac_energy(ipmicmd)
elif name == 'DC Energy':
kwh = self._energymanager.get_dc_energy(ipmicmd)
elif self._energymanager.supports(name):
value, units = self._energymanager.get_sensor(name, ipmicmd)
return sdr.SensorReading({
'name': name, 'imprecision': None,
'value': value,
'states': [], 'state_ids': [], 'health': pygconst.Health.Ok,
'type': 'Power'}, units)
else:
raise pygexc.UnsupportedFunctionality('No sunch sensor ' + name)
raise pygexc.UnsupportedFunctionality('No such sensor ' + name)
return sdr.SensorReading({'name': name, 'imprecision': None,
'value': kwh, 'states': [],
'state_ids': [],
@ -1626,32 +1638,6 @@ class XCCClient(IMMClient):
# oemsensornames = oemsensornames + (name,)
# return oemsensornames
def get_oem_sensor_descriptions(self, ipmicmd):
oemdesc = [{'name': x, 'type': 'Energy'} for x in super(
XCCClient, self).get_oem_sensor_names(ipmicmd)]
return oemdesc
# therminfo = self.grab_cacheable_json(
# '/api/dataset/pwrmgmt?params=GetThermalRealTimeData', 1)
# if therminfo:
# for name in sorted(therminfo['items'][0]):
# if 'DIMM' in name and 'Temp' in name:
# oemdesc.append({'name': name, 'type': 'Temperature'})
# return oemdesc
def get_oem_sensor_reading(self, name, ipmicmd):
if 'Energy' in name:
return super(XCCClient, self).get_oem_sensor_reading(name, ipmicmd)
therminfo = self.grab_cacheable_json(
'/api/dataset/pwrmgmt?params=GetThermalRealTimeData', 1)
temp = therminfo.get('items', [{}])[0].get(name, None)
if temp is None:
raise pygexc.UnsupportedFunctionality('No sunch sensor ' + name)
return sdr.SensorReading({'name': name, 'imprecision': None,
'value': temp, 'states': [],
'state_ids': [],
'health': pygconst.Health.Ok,
'type': 'Temperature'}, '°C')
def get_storage_configuration(self, logout=True):
rsp = self.wc.grab_json_response(
'/api/function/raid_alldevices?params=storage_GetAllDevices,0')