From 86abdc425727c2f13d68023da90dbb12da797ab8 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 4 Jun 2026 08:27:03 -0400 Subject: [PATCH] Bring changes forward from pyghmi HTTP boot enablement and fixes for the firmware parameters. --- confluent_server/aiohmi/ipmi/command.py | 1 + confluent_server/aiohmi/redfish/command.py | 1 + confluent_server/aiohmi/redfish/oem/generic.py | 10 +++++++++- confluent_server/aiohmi/redfish/oem/lenovo/tsma.py | 2 +- confluent_server/aiohmi/redfish/oem/lenovo/xcc.py | 6 +++--- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/confluent_server/aiohmi/ipmi/command.py b/confluent_server/aiohmi/ipmi/command.py index 94abca49..5efb7b4a 100644 --- a/confluent_server/aiohmi/ipmi/command.py +++ b/confluent_server/aiohmi/ipmi/command.py @@ -54,6 +54,7 @@ boot_devices = { 'net': 4, 'network': 4, 'pxe': 4, + 'http': 4, 'hd': 8, 'safe': 0xc, 'cd': 0x14, diff --git a/confluent_server/aiohmi/redfish/command.py b/confluent_server/aiohmi/redfish/command.py index 23b78144..dbb4e40b 100644 --- a/confluent_server/aiohmi/redfish/command.py +++ b/confluent_server/aiohmi/redfish/command.py @@ -61,6 +61,7 @@ boot_devices_read = { 'Pxe': 'network', 'Usb': 'usb', 'SDCard': 'sdcard', + 'UefiHttp': 'http', } diff --git a/confluent_server/aiohmi/redfish/oem/generic.py b/confluent_server/aiohmi/redfish/oem/generic.py index ae925baa..fe280dcc 100644 --- a/confluent_server/aiohmi/redfish/oem/generic.py +++ b/confluent_server/aiohmi/redfish/oem/generic.py @@ -118,6 +118,7 @@ boot_devices_write = { 'setup': 'BiosSetup', 'bios': 'BiosSetup', 'f1': 'BiosSetup', + 'http': 'UefiHttp', } boot_devices_read = { @@ -129,6 +130,7 @@ boot_devices_read = { 'Pxe': 'network', 'Usb': 'usb', 'SDCard': 'sdcard', + 'UefiHttp': 'http', } @@ -747,6 +749,11 @@ class OEMHandler(object): raise exc.InvalidParameterValue('Unsupported device %s' % repr(bootdev)) bootdev = boot_devices_write.get(bootdev, bootdev) + if bootdev == 'UefiHttp': # not universally supported, remap to Pxe + sysinfo = await self.sysinfo() + allowed = sysinfo.get('Boot', {}).get('BootSourceOverrideTarget@Redfish.AllowableValues', []) + if 'UefiHttp' not in allowed: + bootdev = 'Pxe' if bootdev == 'None': payload = {'Boot': {'BootSourceOverrideEnabled': 'Disabled'}} else: @@ -985,7 +992,8 @@ class OEMHandler(object): return None async def get_description(self): - for chassis in fishclient.sysinfo.get('Links', {}).get('Chassis', []): + sysinfo = await self.sysinfo() + for chassis in sysinfo.get('Links', {}).get('Chassis', []): chassisurl = chassis['@odata.id'] chassisinfo = await self._do_web_request(chassisurl) hmm = chassisinfo.get('HeightMm', None) diff --git a/confluent_server/aiohmi/redfish/oem/lenovo/tsma.py b/confluent_server/aiohmi/redfish/oem/lenovo/tsma.py index 7e2b6fac..afa4851f 100644 --- a/confluent_server/aiohmi/redfish/oem/lenovo/tsma.py +++ b/confluent_server/aiohmi/redfish/oem/lenovo/tsma.py @@ -442,7 +442,7 @@ class TsmHandler(generic.OEMHandler): self._wc = wc return wc - async def update_firmware(self, filename, data=None, progress=None, bank=None): + async def update_firmware(self, filename, data=None, progress=None, bank=None, otherfields=None): wc = await self.get_wc() wc.set_header('Content-Type', 'application/json') basefilename = os.path.basename(filename) diff --git a/confluent_server/aiohmi/redfish/oem/lenovo/xcc.py b/confluent_server/aiohmi/redfish/oem/lenovo/xcc.py index dcf079dc..818f931b 100644 --- a/confluent_server/aiohmi/redfish/oem/lenovo/xcc.py +++ b/confluent_server/aiohmi/redfish/oem/lenovo/xcc.py @@ -1302,7 +1302,7 @@ class OEMHandler(generic.OEMHandler): if progress: progress({'phase': 'complete'}) - async def redfish_update_firmware(self, usd, filename, data, progress, bank): + async def redfish_update_firmware(self, usd, filename, data, progress, bank, otherfields=None): if usd['HttpPushUriTargetsBusy']: raise pygexc.TemporaryError('Cannot run multtiple updates to ' 'same target concurrently') @@ -1417,14 +1417,14 @@ class OEMHandler(generic.OEMHandler): '/redfish/v1/UpdateService', {'HttpPushUriTargets': []}, method='PATCH') - async def update_firmware(self, filename, data=None, progress=None, bank=None): + async def update_firmware(self, filename, data=None, progress=None, bank=None, otherfields=None): result = None wc = await self.wc() usd = await self._do_web_request('/redfish/v1/UpdateService') rfishurl = usd.get('HttpPushUri', None) if rfishurl: return await self.redfish_update_firmware( - usd, filename, data, progress, bank) + usd, filename, data, progress, bank, otherfields) if self.updating: raise pygexc.TemporaryError('Cannot run multiple updates to same ' 'target concurrently')