Fix NVIDIA GPU/NVSwitch parsing and Reanimator export statuses
This commit is contained in:
@@ -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":
|
||||
|
||||
Reference in New Issue
Block a user