2
0
mirror of https://github.com/xcat2/confluent.git synced 2026-09-21 16:39:32 +00:00

Fix hardware management async dispatch

This commit is contained in:
Markus Hilger
2026-07-12 23:55:32 +02:00
parent 89d0fa81b9
commit 9c4f9e1935
4 changed files with 27 additions and 26 deletions
@@ -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:
@@ -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')
@@ -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())
@@ -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