Fix NVIDIA GPU/NVSwitch parsing and Reanimator export statuses

This commit is contained in:
2026-02-15 21:00:30 +03:00
parent 0af3cee9b6
commit c7b2a7ab29
12 changed files with 695 additions and 92 deletions

View File

@@ -27,8 +27,6 @@ func ConvertToReanimator(result *models.AnalysisResult) (*ReanimatorExport, erro
// Determine target host (optional field)
targetHost := inferTargetHost(result.TargetHost, result.Filename)
boardSerial := result.Hardware.BoardInfo.SerialNumber
export := &ReanimatorExport{
Filename: result.Filename,
SourceType: normalizeSourceType(result.SourceType),
@@ -41,7 +39,7 @@ func ConvertToReanimator(result *models.AnalysisResult) (*ReanimatorExport, erro
CPUs: convertCPUs(result.Hardware.CPUs),
Memory: convertMemory(result.Hardware.Memory),
Storage: convertStorage(result.Hardware.Storage),
PCIeDevices: convertPCIeDevices(result.Hardware, boardSerial),
PCIeDevices: convertPCIeDevices(result.Hardware),
PowerSupplies: convertPowerSupplies(result.Hardware.PowerSupply),
},
}
@@ -174,16 +172,12 @@ func convertStorage(storage []models.Storage) []ReanimatorStorage {
}
// convertPCIeDevices converts PCIe devices, GPUs, and network adapters to Reanimator format
func convertPCIeDevices(hw *models.HardwareConfig, boardSerial string) []ReanimatorPCIe {
func convertPCIeDevices(hw *models.HardwareConfig) []ReanimatorPCIe {
result := make([]ReanimatorPCIe, 0)
// Convert regular PCIe devices
for _, pcie := range hw.PCIeDevices {
serialNumber := pcie.SerialNumber
if serialNumber == "" || serialNumber == "N/A" {
// Generate serial number
serialNumber = generatePCIeSerialNumber(boardSerial, pcie.Slot, pcie.BDF)
}
serialNumber := normalizedSerial(pcie.SerialNumber)
// Determine model (prefer PartNumber, fallback to DeviceClass)
model := pcie.PartNumber
@@ -211,11 +205,7 @@ func convertPCIeDevices(hw *models.HardwareConfig, boardSerial string) []Reanima
// Convert GPUs as PCIe devices
for _, gpu := range hw.GPUs {
serialNumber := gpu.SerialNumber
if serialNumber == "" {
// Generate serial number
serialNumber = generatePCIeSerialNumber(boardSerial, gpu.Slot, gpu.BDF)
}
serialNumber := normalizedSerial(gpu.SerialNumber)
// Determine device class
deviceClass := "DisplayController"
@@ -244,11 +234,7 @@ func convertPCIeDevices(hw *models.HardwareConfig, boardSerial string) []Reanima
continue
}
serialNumber := nic.SerialNumber
if serialNumber == "" {
// Generate serial number
serialNumber = generatePCIeSerialNumber(boardSerial, nic.Slot, "")
}
serialNumber := normalizedSerial(nic.SerialNumber)
result = append(result, ReanimatorPCIe{
Slot: nic.Slot,
@@ -339,17 +325,17 @@ func inferCPUManufacturer(model string) string {
return ""
}
// generatePCIeSerialNumber generates a serial number for PCIe device
func generatePCIeSerialNumber(boardSerial, slot, bdf string) string {
if slot != "" {
return fmt.Sprintf("%s-PCIE-%s", boardSerial, slot)
func normalizedSerial(serial string) string {
s := strings.TrimSpace(serial)
if s == "" {
return ""
}
if bdf != "" {
// Use BDF as identifier (e.g., "0000:18:00.0" -> "0000-18-00-0")
safeBDF := strings.ReplaceAll(strings.ReplaceAll(bdf, ":", "-"), ".", "-")
return fmt.Sprintf("%s-PCIE-%s", boardSerial, safeBDF)
switch strings.ToUpper(s) {
case "N/A", "NA", "NONE", "NULL", "UNKNOWN", "-":
return ""
default:
return s
}
return fmt.Sprintf("%s-PCIE-UNKNOWN", boardSerial)
}
// inferStorageStatus determines storage device status
@@ -392,10 +378,14 @@ func normalizeStatus(status string, allowEmpty bool) string {
switch strings.ToLower(strings.TrimSpace(status)) {
case "ok":
return "OK"
case "pass":
return "OK"
case "warning":
return "Warning"
case "critical":
return "Critical"
case "fail":
return "Critical"
case "unknown":
return "Unknown"
case "empty":