From 505a1d3d07dfb296ca861b4f95b2e68ebeebc807 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Fri, 30 Aug 2024 11:21:31 -0400 Subject: [PATCH] Implement fixup of firmware inventory Redfish raw firmware inventory is given a facelift for the sake of being more user friendly. Change-Id: If6e1fa326c8b3d43c9e49e67b062c9b544f2f010 --- pyghmi/redfish/command.py | 2 +- pyghmi/redfish/oem/generic.py | 2 +- pyghmi/redfish/oem/lenovo/xcc.py | 2 +- pyghmi/redfish/oem/lenovo/xcc3.py | 37 +++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/pyghmi/redfish/command.py b/pyghmi/redfish/command.py index aa0cdd5f..4b39660d 100644 --- a/pyghmi/redfish/command.py +++ b/pyghmi/redfish/command.py @@ -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 diff --git a/pyghmi/redfish/oem/generic.py b/pyghmi/redfish/oem/generic.py index a0dc01e9..ac2993dd 100644 --- a/pyghmi/redfish/oem/generic.py +++ b/pyghmi/redfish/oem/generic.py @@ -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): diff --git a/pyghmi/redfish/oem/lenovo/xcc.py b/pyghmi/redfish/oem/lenovo/xcc.py index 15a30f0e..dcf40073 100644 --- a/pyghmi/redfish/oem/lenovo/xcc.py +++ b/pyghmi/redfish/oem/lenovo/xcc.py @@ -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', []): diff --git a/pyghmi/redfish/oem/lenovo/xcc3.py b/pyghmi/redfish/oem/lenovo/xcc3.py index e8457228..8d760750 100644 --- a/pyghmi/redfish/oem/lenovo/xcc3.py +++ b/pyghmi/redfish/oem/lenovo/xcc3.py @@ -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() +