From 9c4f9e19354bc8965319fa7d84bdc6c9ca479ea9 Mon Sep 17 00:00:00 2001 From: Markus Hilger Date: Sun, 12 Jul 2026 23:55:32 +0200 Subject: [PATCH] Fix hardware management async dispatch --- .../plugins/hardwaremanagement/deltapdu.py | 4 +-- .../plugins/hardwaremanagement/ipmi.py | 25 +++++++++---------- .../plugins/hardwaremanagement/pdu.py | 10 +++++--- .../plugins/hardwaremanagement/redfish.py | 14 +++++------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/deltapdu.py b/confluent_server/confluent/plugins/hardwaremanagement/deltapdu.py index 58d3b785..6a4b7bc0 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/deltapdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/deltapdu.py @@ -163,7 +163,7 @@ class PDUClient(object): self.wc.grab_response('/logout_wait.htm') async def get_outlet(self, outlet): - rsp = await self.wc.grab_response('/setting_admin4.xml') + rsp = self.wc.grab_response('/setting_admin4.xml') xd = fromstring(rsp[0]) for ch in xd: if 'relay' not in ch.tag: @@ -177,7 +177,7 @@ class PDUClient(object): outlet = int(outlet) ident = self.map_outlets[outlet] sitem = '/SetParm?item={}?content={}'.format(ident, state) - await self.wc.grab_response(sitem) + self.wc.grab_response(sitem) async def retrieve(nodes, element, configmanager, inputdata): if 'outlets' not in element: diff --git a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py index 04894407..7333d170 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py @@ -554,16 +554,16 @@ class IpmiHandler: if (self.error == 'timeout' or 'Insufficient resources' in self.error): self.error = self.error.replace(' reported in RAKP4', '') - self.output.put(msg.ConfluentTargetTimeout( + await self.output.put(msg.ConfluentTargetTimeout( self.node, self.error)) return elif 'Invalid Session ID' in self.error: - self.output.put(msg.ConfluentTargetTimeout( + await self.output.put(msg.ConfluentTargetTimeout( self.node, 'Temporary Login Error')) return elif ('Unauthorized' in self.error or 'Incorrect password' in self.error): - self.output.put( + await self.output.put( msg.ConfluentTargetInvalidCredentials(self.node)) return else: @@ -708,7 +708,7 @@ class IpmiHandler: if tmpvarbind.endswith('3183.1.1'): varbinddata = inputdata[tmpvarbind] varbinddata = hex2bin(varbinddata) - event = self.ipmicmd.decode_pet(specifictrap, varbinddata) + event = await self.ipmicmd.decode_pet(specifictrap, varbinddata) self.pyghmi_event_to_confluent(event) await self.output.put(msg.EventCollection((event,), name=self.node)) @@ -1007,7 +1007,7 @@ class IpmiHandler: if activeupdates: await self.output.put(msg.KeyValueData({'status': 'active'}, self.node)) else: - status = self.ipmicmd.get_update_status() + status = await self.ipmicmd.get_update_status() await self.output.put(msg.KeyValueData({'status': status}, self.node)) async def handle_inventory(self): @@ -1025,12 +1025,12 @@ class IpmiHandler: async def list_leds(self): await self.output.put(msg.ChildCollection('all')) - for category, info in self.ipmicmd.get_leds(): + async for category, info in self.ipmicmd.get_leds(): await self.output.put(msg.ChildCollection(simplify_name(category))) async def read_leds(self, component): led_categories = [] - for category, info in self.ipmicmd.get_leds(): + async for category, info in self.ipmicmd.get_leds(): if component == 'all' or component == simplify_name(category): led_categories.append({category: info}) await self.output.put(msg.LEDStatus(led_categories, self.node)) @@ -1054,7 +1054,7 @@ class IpmiHandler: await self.make_inventory_map() compname = self.invmap.get(component, None) if compname is None: - self.output.put(msg.ConfluentTargetNotFound()) + await self.output.put(msg.ConfluentTargetNotFound()) return invdata = await self.ipmicmd.get_inventory_of_component(compname) if invdata is None: @@ -1118,7 +1118,7 @@ class IpmiHandler: if len(storelem) < 2 or storelem[0] != 'volumes': raise exc.InvalidArgumentException('Must target a specific volume') volname = storelem[-1] - curr = self.ipmicmd.get_storage_configuration() + curr = await self.ipmicmd.get_storage_configuration() volumes = [] volsfound = False toremove = storage.ConfigSpec(arrays=[storage.Array(volumes=volumes)]) @@ -1131,7 +1131,7 @@ class IpmiHandler: await self.output.put(msg.ConfluentTargetNotFound( self.node, "No volume named '{0}' found".format(volname))) return - self.ipmicmd.remove_storage_configuration(toremove) + await self.ipmicmd.remove_storage_configuration(toremove) await self.output.put(msg.DeletedResource(volname)) async def _create_storage(self, storelem): @@ -1139,7 +1139,7 @@ class IpmiHandler: raise exc.InvalidArgumentException('Can only create volumes') vols = [] thedisks = None - currcfg = self.ipmicmd.get_storage_configuration() + currcfg = await self.ipmicmd.get_storage_configuration() currnames = [] for arr in currcfg.arrays: arrname = '{0}-{1}'.format(*arr.id) @@ -1345,7 +1345,7 @@ class IpmiHandler: async def list_sensors(self): try: - sensors = await self.ipmicmd.get_sensor_descriptions() + sensors = [sensor async for sensor in self.ipmicmd.get_sensor_descriptions()] except pygexc.IpmiException: await self.output.put(msg.ConfluentTargetTimeout(self.node)) return @@ -1760,4 +1760,3 @@ def delete(nodes, element, configmanager, inputdata): element, type='ffdc') return perform_requests( 'delete', nodes, element, configmanager, inputdata, 'delete') - diff --git a/confluent_server/confluent/plugins/hardwaremanagement/pdu.py b/confluent_server/confluent/plugins/hardwaremanagement/pdu.py index 7a5a5376..cefb9c1b 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/pdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/pdu.py @@ -71,9 +71,10 @@ async def readpdu(pdu, outletmap, configmanager, rspq): for outlet in outletmap: node, pgroup = outletmap[outlet] try: - for rsp in core.handle_path( + responses = await core.handle_path( '/nodes/{0}/power/outlets/{1}'.format(pdu, outlet), - 'retrieve', configmanager): + 'retrieve', configmanager) + async for rsp in core.iterate_responses(responses): await rspq.put(msg.KeyValueData({pgroup: rsp.kvpairs['state']['value']}, node)) except exc.TargetEndpointBadCredentials: await rspq.put(msg.ConfluentTargetInvalidCredentials(pdu)) @@ -137,8 +138,9 @@ async def updatepdu(pdu, outletmap, configmanager, inputdata, rspq): try: for outlet in outletmap: node, pgroup = outletmap[outlet] - for rsp in core.handle_path('/nodes/{0}/power/outlets/{1}'.format(pdu, outlet), - 'update', configmanager, inputdata={'state': inputdata.powerstate(node)}): + responses = await core.handle_path('/nodes/{0}/power/outlets/{1}'.format(pdu, outlet), + 'update', configmanager, inputdata={'state': inputdata.powerstate(node)}) + async for rsp in core.iterate_responses(responses): await rspq.put(msg.KeyValueData({pgroup: rsp.kvpairs['state']['value']}, node)) finally: await rspq.put(TaskDone()) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/redfish.py b/confluent_server/confluent/plugins/hardwaremanagement/redfish.py index d95ff71e..0ef6781f 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/redfish.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/redfish.py @@ -399,7 +399,7 @@ class IpmiHandler: tenant = cfg.tenant if (node, tenant) not in persistent_ipmicmds: try: - await persistent_ipmicmds[(node, tenant)].close_confluent() + persistent_ipmicmds[(node, tenant)].close_confluent() except KeyError: # was no previous session pass try: @@ -830,7 +830,7 @@ class IpmiHandler: async def make_sensor_map(self, sensors=None): if sensors is None: - sensors = await self.ipmicmd.get_sensor_descriptions() + sensors = self.ipmicmd.get_sensor_descriptions() async for sensor in sensors: resourcename = sensor['name'] self.sensormap[simplify_name(resourcename)] = resourcename @@ -1075,7 +1075,7 @@ class IpmiHandler: volsfound = True volumes.append(vol) if not volsfound: - self.output.put(msg.ConfluentTargetNotFound( + await self.output.put(msg.ConfluentTargetNotFound( self.node, "No volume named '{0}' found".format(volname))) return await self.ipmicmd.remove_storage_configuration(toremove) @@ -1128,14 +1128,14 @@ class IpmiHandler: vol.status, arrname)) return else: - self._show_storage(storelem[:1] + [vol['name']]) + await self._show_storage(storelem[:1] + [vol['name']]) async def _update_storage(self, storelem): if storelem[0] == 'disks': if len(storelem) == 1: raise exc.InvalidArgumentException('Must target a disk') - self.set_disk(storelem[-1], - self.inputdata.inputbynode[self.node]) + await self.set_disk(storelem[-1], + self.inputdata.inputbynode[self.node]) await self._show_storage(storelem) async def _show_storage(self, storelem): @@ -1292,7 +1292,7 @@ class IpmiHandler: async def list_sensors(self): try: - sensors = await self.ipmicmd.get_sensor_descriptions() + sensors = [sensor async for sensor in self.ipmicmd.get_sensor_descriptions()] except pygexc.IpmiException: await self.output.put(msg.ConfluentTargetTimeout(self.node)) return