fix(parser): parse Dell iDRAC10 TSR inventory from captured Redfish walk
iDRAC10-generation TSR bundles no longer ship sysinfo_dcim_view.xml / sysinfo_dcim_softwareidentity.xml, so the dell parser produced events but no hardware inventory for them. These bundles instead carry redfishidracwalk.tar.gz, a captured dump of the iDRAC's own Redfish tree. Add vendors/redfishtree, a shared helper that reconstructs a path->document map from a tar.gz/zip-packaged Redfish walk (vendor-independent detection: path hint + /redfish/v1 service-root/Systems/Chassis structural check) and replays it through the existing collector.ReplayRedfishFromRawPayloads. vendors/dell uses it to enrich DCIM-XML-derived data (append-only, existing dedupe passes resolve overlaps). Also register vendors/redfishwalk, a low-confidence fallback VendorParser using the same helpers, so any other vendor that starts shipping this kind of raw Redfish walk is picked up automatically without a dedicated parser. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
6e1a8232ec
commit
f599215760
@@ -58,6 +58,7 @@ When `vendor_id` and `device_id` are known but the model name is missing or gene
|
||||
| `lenovo_xcc` | Lenovo XCC mini-log ZIP archives | JSON inventory + platform event logs |
|
||||
| `nvidia` | HGX Field Diagnostics | GPU- and fabric-heavy diagnostic input |
|
||||
| `nvidia_bug_report` | `nvidia-bug-report-*.log.gz` | dmidecode, lspci, NVIDIA driver sections |
|
||||
| `redfish_walk` | Any archive carrying a captured Redfish directory-tree walk (tar.gz/zip of `<path>/index.json` docs) | Low-confidence (35) vendor-agnostic fallback; see `dell` for the first known source and `redfishtree` helper package |
|
||||
| `unraid` | Unraid diagnostics/log bundles | Server and storage-focused parsing |
|
||||
| `xfusion` | xFusion iBMC `tar.gz` dump / file export | AppDump + RTOSDump + LogDump merge for hardware and firmware |
|
||||
| `xigmanas` | XigmaNAS plain logs | FreeBSD/NAS-oriented inventory |
|
||||
@@ -216,6 +217,51 @@ and `LogDump/` trees.
|
||||
|
||||
---
|
||||
|
||||
### Dell TSR (`dell`)
|
||||
|
||||
**Status:** Ready (v3.0). Two inventory source generations, both handled by the same parser.
|
||||
|
||||
**Archive format:** TSR nested zip (`signature` + `TSR*.pl.zip`).
|
||||
|
||||
**Extracted data:**
|
||||
- Older/DCIM-XML generation: `sysinfo_dcim_view.xml` (board/CPU/NIC/etc.), `sysinfo_dcim_softwareidentity.xml`
|
||||
(firmware), `sysinfo_cim_sensor.xml` (sensors), `curr_lclog.xml` (Lifecycle Controller events),
|
||||
`tsr/metadata.json` (board identity fallback).
|
||||
- iDRAC10-generation: same `metadata.json`/`curr_lclog.xml`, but no DCIM-XML files — instead
|
||||
`tsr/hardware/sysinfo/inventory/redfishidracwalk.tar.gz` holds a captured Redfish directory-tree
|
||||
walk. Parsed via the shared `redfishtree` helper package and replayed through
|
||||
`collector.ReplayRedfishFromRawPayloads` (`internal/parser/vendors/dell/redfish_walk.go`), then
|
||||
append-merged into the same `Hardware`/`Sensors`/`FRU`/`Events` slices the DCIM-XML path fills, so
|
||||
the existing dedupe passes resolve any overlap in favor of DCIM-derived data. See ADL-048.
|
||||
|
||||
---
|
||||
|
||||
### Generic Redfish walk fallback (`redfish_walk`)
|
||||
|
||||
**Status:** Ready (v1.0.0).
|
||||
|
||||
**Confidence:** 35 (above the `generic` fallback's 15, below every dedicated vendor parser — wins
|
||||
`Detect()` only when no dedicated parser also recognizes the archive).
|
||||
|
||||
**Purpose:** Vendor-agnostic catch-all for any archive that carries a captured Redfish
|
||||
directory-tree walk (one JSON document per resource, e.g.
|
||||
`redfish/v1/Systems/System.Embedded.1/index.json`) but isn't otherwise claimed by a dedicated vendor
|
||||
parser. First known source is Dell iDRAC10 TSR bundles (handled directly by `dell`, see above); this
|
||||
exists so any other vendor shipping the same kind of raw Redfish walk is picked up automatically.
|
||||
|
||||
**Detection (`internal/parser/vendors/redfishtree`):** two-step, vendor-independent —
|
||||
1. Path hint: an archive member path containing `redfish` and ending in `.tar.gz`/`.tgz`/`.zip`.
|
||||
2. Structural confirmation: the unpacked tree must contain a document whose own `@odata.id` is
|
||||
exactly `/redfish/v1`, plus a `/redfish/v1/Systems` or `/redfish/v1/Chassis` collection.
|
||||
|
||||
Documents are keyed by their own `@odata.id`, not the on-disk directory name (some resource names
|
||||
are URL-encoded on disk, e.g. `Assembly%23`, but not in the JSON payload).
|
||||
|
||||
**Extracted data:** whatever `collector.ReplayRedfishFromRawPayloads` produces from the replayed
|
||||
tree — board identity, firmware, CPUs, memory, storage, PCIe, GPUs, NICs, PSUs, sensors, events.
|
||||
|
||||
---
|
||||
|
||||
### Generic text fallback (`generic`)
|
||||
|
||||
**Status:** Ready (v1.0.0).
|
||||
@@ -234,7 +280,8 @@ and `LogDump/` trees.
|
||||
|
||||
| Vendor | ID | Status | Tested on |
|
||||
|--------|----|--------|-----------|
|
||||
| Dell TSR | `dell` | Ready | TSR nested zip archives |
|
||||
| Dell TSR | `dell` | Ready | TSR nested zip archives (DCIM-XML and iDRAC10 Redfish-walk generations) |
|
||||
| Generic Redfish walk | `redfish_walk` | Ready (fallback) | Any archive with a captured Redfish tree dump |
|
||||
| Reanimator Easy Bee | `easy_bee` | Ready | `bee-support-*.tar.gz` support bundles |
|
||||
| HPE iLO AHS | `hpe_ilo_ahs` | Ready | iLO 6 `.ahs` exports |
|
||||
| Inspur / Kaytus | `inspur` | Ready | KR4268X2 onekeylog |
|
||||
|
||||
@@ -1229,3 +1229,44 @@ later content-free duplicate cannot blank out an earlier real reading.
|
||||
Revisit only if a real archive needs that specific data and asset.json does not cover it.
|
||||
- Any future component/*.txt GETALL consumer should reuse `parseDBusGetAllObjects` rather than
|
||||
re-implementing block splitting or field extraction.
|
||||
|
||||
---
|
||||
|
||||
## ADL-048 — Dell iDRAC10 TSR bundles ship inventory as a raw Redfish walk, not DCIM-XML
|
||||
|
||||
**Date:** 2026-08-11
|
||||
**Context:** A TSR from a PowerEdge R7715 (`TSR20260721231613_1TVFYL4.zip`, iDRAC10-generation
|
||||
firmware) parsed as `dell` and showed events but no hardware inventory. The `dell` parser
|
||||
(`internal/parser/vendors/dell/parser.go`) built the entire `Hardware` tree from three files inside
|
||||
the `.pl.zip`: `sysinfo_dcim_view.xml`, `sysinfo_dcim_softwareidentity.xml`, `sysinfo_cim_sensor.xml`.
|
||||
This iDRAC generation does not produce those files at all; `tsr/hardware/sysinfo/inventory/` instead
|
||||
contains `redfishidracwalk.tar.gz` — a captured crawl of the iDRAC's own Redfish tree (one JSON
|
||||
document per resource, stored as `<url-path>/index.json`, e.g.
|
||||
`redfish/v1/Systems/System.Embedded.1/index.json`). `Hardware` therefore stayed effectively empty
|
||||
(only `BoardInfo`/one iDRAC firmware entry from `metadata.json`), while `curr_lclog.xml` still
|
||||
populated `Events` normally — hence "shows only logs".
|
||||
**Decision:** Added `internal/parser/vendors/redfishtree` (shared, non-registering helper package)
|
||||
that reconstructs a `path -> document` tree from a tar.gz- or zip-packaged Redfish walk and feeds it
|
||||
to the existing `collector.ReplayRedfishFromRawPayloads` replay machinery (previously only used for
|
||||
live BMC collection and reanimator import). Detection is two-step and vendor-independent: (1) a path
|
||||
hint — an archive member path containing `redfish` and ending in `.tar.gz`/`.tgz`/`.zip`; (2)
|
||||
structural confirmation — the unpacked tree must contain a document whose own `@odata.id` is exactly
|
||||
`/redfish/v1`, plus a `/redfish/v1/Systems` or `/redfish/v1/Chassis` collection. The tree is keyed by
|
||||
each document's own `@odata.id` (not the on-disk directory name), since some resource names are
|
||||
URL-encoded on disk (e.g. `Assembly%23`) but not in the JSON payload.
|
||||
`internal/parser/vendors/dell/redfish_walk.go` uses this to enrich the DCIM-XML-derived result:
|
||||
append-only merge (`mergeRedfishReplay`) into the same slices the existing `dedupeX` calls already
|
||||
resolve, so DCIM-derived entries (appended first) win over duplicates from the replay, and the
|
||||
replay only fills in what DCIM-XML didn't provide. Also registered a new low-confidence fallback
|
||||
vendor parser, `internal/parser/vendors/redfishwalk` (`Vendor()` = `redfish_walk`, confidence 35 —
|
||||
above the `generic` fallback's 15, below every dedicated vendor parser), using the same
|
||||
`redfishtree` helpers directly as its `Parse()`, so any other vendor that starts shipping this kind
|
||||
of raw Redfish walk is picked up automatically without a dedicated parser.
|
||||
**Consequences:**
|
||||
- Dell iDRAC10 TSR bundles now populate full hardware inventory (CPUs, memory, storage, PCIe, NICs,
|
||||
PSUs, firmware) from `redfishidracwalk.tar.gz` when DCIM-XML is absent, verified end-to-end on
|
||||
the R7715 archive above (1 CPU, 2 DIMMs, 2 storage, 2 PCIe, 1 NIC, 2 PSU, 19 firmware entries).
|
||||
- Any future vendor parser that wants to consume a captured Redfish walk as enrichment should reuse
|
||||
`redfishtree.FindCandidateArchives` + `redfishtree.Build`, not re-implement tar/zip walking.
|
||||
- `redfishwalk` is a genuine fallback: it only wins `Detect()` when no dedicated vendor parser
|
||||
scores higher on the same archive, per the registry's highest-confidence-wins rule.
|
||||
|
||||
Reference in New Issue
Block a user