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:
parent
bcfbd8f1c5
commit
077dbd645b
@ -31,7 +31,9 @@ class EnergyManager(object):
|
|||||||
try:
|
try:
|
||||||
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
|
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
|
||||||
if len(rsp['data']) >= 8:
|
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
|
self._usefapm = True
|
||||||
return
|
return
|
||||||
except pygexc.IpmiException:
|
except pygexc.IpmiException:
|
||||||
@ -57,6 +59,23 @@ class EnergyManager(object):
|
|||||||
else:
|
else:
|
||||||
self.supportedmeters = ('DC Energy',)
|
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):
|
def get_fapm_energy(self, ipmicmd):
|
||||||
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
|
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
|
||||||
j, mj = struct.unpack('<IH', rsp['data'][2:8])
|
j, mj = struct.unpack('<IH', rsp['data'][2:8])
|
||||||
|
@ -684,8 +684,13 @@ class IMMClient(object):
|
|||||||
return ()
|
return ()
|
||||||
|
|
||||||
def get_oem_sensor_descriptions(self, ipmicmd):
|
def get_oem_sensor_descriptions(self, ipmicmd):
|
||||||
return [{'name': x, 'type': 'Energy'
|
desc = []
|
||||||
} for x in self.get_oem_sensor_names(ipmicmd)]
|
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):
|
def get_oem_sensor_reading(self, name, ipmicmd):
|
||||||
if self._energymanager is None:
|
if self._energymanager is None:
|
||||||
@ -694,8 +699,15 @@ class IMMClient(object):
|
|||||||
kwh = self._energymanager.get_ac_energy(ipmicmd)
|
kwh = self._energymanager.get_ac_energy(ipmicmd)
|
||||||
elif name == 'DC Energy':
|
elif name == 'DC Energy':
|
||||||
kwh = self._energymanager.get_dc_energy(ipmicmd)
|
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:
|
else:
|
||||||
raise pygexc.UnsupportedFunctionality('No sunch sensor ' + name)
|
raise pygexc.UnsupportedFunctionality('No such sensor ' + name)
|
||||||
return sdr.SensorReading({'name': name, 'imprecision': None,
|
return sdr.SensorReading({'name': name, 'imprecision': None,
|
||||||
'value': kwh, 'states': [],
|
'value': kwh, 'states': [],
|
||||||
'state_ids': [],
|
'state_ids': [],
|
||||||
@ -1626,32 +1638,6 @@ class XCCClient(IMMClient):
|
|||||||
# oemsensornames = oemsensornames + (name,)
|
# oemsensornames = oemsensornames + (name,)
|
||||||
# return oemsensornames
|
# 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):
|
def get_storage_configuration(self, logout=True):
|
||||||
rsp = self.wc.grab_json_response(
|
rsp = self.wc.grab_json_response(
|
||||||
'/api/function/raid_alldevices?params=storage_GetAllDevices,0')
|
'/api/function/raid_alldevices?params=storage_GetAllDevices,0')
|
||||||
|
Loading…
Reference in New Issue
Block a user