fix: dedup GPUs across multiple chassis PCIeDevice trees in Redfish collector
Supermicro HGX exposes each GPU under both Chassis/1/PCIeDevices and a dedicated Chassis/HGX_GPU_SXM_N/PCIeDevices. gpuDocDedupKey was keying by @odata.id path, so identical GPUs with the same serial were not deduplicated across sources. Now stable identifiers (serial → BDF → slot+model) take priority over path. Also includes Inspur parser improvements: NVMe model/serial enrichment from devicefrusdr.log and audit.log, RAID drive slot normalization to BP notation, PSU slot normalization, BMC/CPLD/VR firmware from RESTful version info section, and parser version bump to 1.8. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
25
internal/parser/vendors/inspur/asset.go
vendored
25
internal/parser/vendors/inspur/asset.go
vendored
@@ -94,8 +94,12 @@ type AssetJSON struct {
|
||||
} `json:"PcieInfo"`
|
||||
}
|
||||
|
||||
// ParseAssetJSON parses Inspur asset.json content
|
||||
func ParseAssetJSON(content []byte) (*models.HardwareConfig, error) {
|
||||
// ParseAssetJSON parses Inspur asset.json content.
|
||||
// - pcieSlotDeviceNames: optional map from integer PCIe slot ID to device name string,
|
||||
// sourced from devicefrusdr.log PCIe REST section. Fills missing NVMe model names.
|
||||
// - pcieSlotSerials: optional map from integer PCIe slot ID to serial number string,
|
||||
// sourced from audit.log SN-changed events. Fills missing NVMe serial numbers.
|
||||
func ParseAssetJSON(content []byte, pcieSlotDeviceNames map[int]string, pcieSlotSerials map[int]string) (*models.HardwareConfig, error) {
|
||||
var asset AssetJSON
|
||||
if err := json.Unmarshal(content, &asset); err != nil {
|
||||
return nil, err
|
||||
@@ -175,6 +179,23 @@ func ParseAssetJSON(content []byte) (*models.HardwareConfig, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Enrich model name from PCIe device name (supplied from devicefrusdr.log).
|
||||
// BMC does not populate HddInfo.ModelName for NVMe drives, but the PCIe REST
|
||||
// section in devicefrusdr.log carries the drive model as device_name.
|
||||
if modelName == "" && hdd.PcieSlot > 0 && len(pcieSlotDeviceNames) > 0 {
|
||||
if devName, ok := pcieSlotDeviceNames[hdd.PcieSlot]; ok && devName != "" {
|
||||
modelName = devName
|
||||
}
|
||||
}
|
||||
|
||||
// Enrich serial number from audit.log SN-changed events (supplied via pcieSlotSerials).
|
||||
// BMC asset.json does not carry NVMe serial numbers; audit.log logs every SN change.
|
||||
if serial == "" && hdd.PcieSlot > 0 && len(pcieSlotSerials) > 0 {
|
||||
if sn, ok := pcieSlotSerials[hdd.PcieSlot]; ok && sn != "" {
|
||||
serial = sn
|
||||
}
|
||||
}
|
||||
|
||||
storageType := "HDD"
|
||||
if hdd.DiskInterfaceType == 5 {
|
||||
storageType = "NVMe"
|
||||
|
||||
Reference in New Issue
Block a user