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

Implement fixup of firmware inventory

Redfish raw firmware inventory is given a facelift for
the sake of being more user friendly.

Change-Id: If6e1fa326c8b3d43c9e49e67b062c9b544f2f010
This commit is contained in:
Jarrod Johnson
2024-08-30 11:21:31 -04:00
parent 8045c2517f
commit 505a1d3d07
4 changed files with 40 additions and 3 deletions

View File

@@ -963,7 +963,7 @@ class Command(object):
def get_firmware(self, components=()):
try:
for firminfo in self.oem.get_firmware_inventory(components):
for firminfo in self.oem.get_firmware_inventory(components, self):
yield firminfo
except exc.BypassGenericBehavior:
return

View File

@@ -522,7 +522,7 @@ class OEMHandler(object):
def get_description(self):
return {}
def get_firmware_inventory(self, components):
def get_firmware_inventory(self, components, fishclient):
return []
def set_credentials(self, username, password):

View File

@@ -674,7 +674,7 @@ class OEMHandler(generic.OEMHandler):
for diskent in adp.get('aimDisks', ()):
yield self._get_disk_firmware_single(diskent)
def get_firmware_inventory(self, components):
def get_firmware_inventory(self, components, fishclient):
sysinf = self.wc.grab_json_response('/api/dataset/sys_info')
for item in sysinf.get('items', {}):
for firm in item.get('firmware', []):

View File

@@ -1,4 +1,6 @@
import pyghmi.redfish.oem.generic as generic
import pyghmi.exceptions as pygexc
class OEMHandler(generic.OEMHandler):
@@ -91,4 +93,39 @@ class OEMHandler(generic.OEMHandler):
currsettings[setting] = val
return currsettings, reginfo
def get_firmware_inventory(self, components, fishclient):
fwlist = fishclient._do_web_request(fishclient._fwinventory)
rawfwurls = [x['@odata.id'] for x in fwlist.get('Members', [])]
fwurls = []
for fwurl in rawfwurls:
if fwurl.startswith('/redfish/v1/UpdateService/FirmwareInventory/Bundle.'):
continue # skip Bundle information for now
fwurls.append(fwurl)
self._fwnamemap = {}
for res in fishclient._do_bulk_requests(fwurls):
redres = res[0]
if redres.get('Name', '').startswith('Firmware:'):
redres['Name'] = redres['Name'].replace('Firmware:', '')
if redres['Name'].startswith('Firmware-PSoC') and 'Drive_Backplane' in redres["@odata.id"]:
redres['Name'] = 'Drive Backplane'
if redres['Name'].startswith('DEVICE-'):
redres['Name'] = redres['Name'].replace('DEVICE-', '')
if redres['Name'].startswith('POWER-PSU'):
redres['Name'] = redres['Name'].replace('POWER-', '')
swid = redres.get('SoftwareId', '')
buildid = ''
version = redres.get('Version', None)
if swid.startswith('FPGA-') or swid.startswith('UEFI-') or swid.startswith('BMC-'):
buildid = swid.split('-')[1] + version.split('-')[0]
version = '-'.join(version.split('-')[1:])
if version:
redres['Version'] = version
cres = fishclient._extract_fwinfo(res)
if cres[0] is None:
continue
if buildid:
cres[1]['build'] = buildid
yield cres
raise pygexc.BypassGenericBehavior()