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

Call a firmware entry something that identifies it

This bmc gives all three of its firmware entries the same Name, "Software
Inventory", and puts what they actually are in the description.  The first
entry took that name, and the two after it fell back to their ids, so
nodefirmware answered with "Software Inventory", "cpld_active" and
"d1dc9e4b" for what are the host, cpld and bmc images.

Decide the labels across the collection rather than one entry at a time,
so a name the platform repeats can be recognised as no name at all.  Where
that happens, use a description that does tell them apart, and the id when
even that is shared.  A platform whose names are already distinct keeps
exactly the names it had.

The labels are what a caller addresses an entry by, so this also turns
inventory/firmware/all/d1dc9e4b into inventory/firmware/all/bmc_image.
This commit is contained in:
Markus Hilger
2026-08-14 03:05:13 +02:00
parent 586b2f1d77
commit 6ce03f5081
+28 -3
View File
@@ -1329,8 +1329,11 @@ class Command(object):
fwurls = [x['@odata.id'] for x in fwlist.get('Members', [])]
wantcategory = category if category not in (None, 'all') else None
entries = []
async for res in self._do_bulk_requests(fwurls):
entries.append((self._fwcategory(res[0]), self._extract_fwinfo(res)))
results = [res async for res in self._do_bulk_requests(fwurls)]
labels = self._firmware_labels(results)
for res in results:
entries.append((self._fwcategory(res[0]),
self._extract_fwinfo(res, labels)))
categorised = any(x[0] for x in entries)
for fwcategory, res in entries:
if res[0] is None:
@@ -1346,10 +1349,32 @@ class Command(object):
continue
yield res
def _extract_fwinfo(self, inf):
def _firmware_labels(self, results):
"""Pick something to call each firmware entry.
A platform is free to give every entry the same Name, which then tells
them apart from nothing, so where that happens look for a description
that does, and fall back to the id.
"""
names = [x[0].get('Name', 'Unknown') for x in results]
descs = [x[0].get('Description', '') for x in results]
labels = {}
for idx, (fwi, url) in enumerate(results):
label = names[idx]
if names.count(label) > 1:
if descs[idx] and descs.count(descs[idx]) == 1:
label = descs[idx]
else:
label = fwi.get('Id', label)
labels[url] = label
return labels
def _extract_fwinfo(self, inf, labels=None):
currinf = self._oem._extract_fwinfo(inf)
fwi, url = inf
fwname = fwi.get('Name', 'Unknown')
if labels:
fwname = labels.get(url, fwname)
if fwname in self._fwnamemap:
fwname = fwi.get('Id', fwname)
if fwname in self._fwnamemap: