From 134bed3eaeb0fd469aeb78dc9770f7745f2910dc Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Tue, 18 Aug 2026 14:44:52 +0300 Subject: [PATCH] refactor: dedupe status-severity ranking and small webui helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit statusSeverity was byte-for-byte duplicated in collector/contract.go and app/sat_overlay.go (same switch, same comment). Export it as collector.StatusSeverity and drop the app-package copy. page_topo.go inlined the same GPU/NIC/RAID class switch as its own pcieDeviceKind function in one spot — call the function instead. page_validate.go had its own copy of pages.go's firstNonEmpty (all call sites already pre-trim their inputs via validateTrimPtr, so the extra TrimSpace was redundant) — drop the duplicate. Co-Authored-By: Claude Sonnet 5 --- audit/internal/app/sat_overlay.go | 23 ++++------------------- audit/internal/collector/contract.go | 6 +++--- audit/internal/webui/page_topo.go | 11 ++--------- audit/internal/webui/page_validate.go | 20 +++++--------------- 4 files changed, 14 insertions(+), 46 deletions(-) diff --git a/audit/internal/app/sat_overlay.go b/audit/internal/app/sat_overlay.go index 87f857c..19ced3d 100644 --- a/audit/internal/app/sat_overlay.go +++ b/audit/internal/app/sat_overlay.go @@ -237,7 +237,7 @@ func parseStorageSATStatus(summary satSummary) map[string]satStatusResult { } } current := result[devName] - if !current.ok || statusSeverity(stepStatus) > statusSeverity(current.status) { + if !current.ok || collector.StatusSeverity(stepStatus) > collector.StatusSeverity(current.status) { result[devName] = satStatusResult{status: stepStatus, description: desc, ok: true} } } @@ -279,7 +279,7 @@ func mergeComponentStatus(component *schema.HardwareComponentStatus, changedAt, return } current := strings.TrimSpace(ptrString(component.Status)) - if current == "" || current == "Unknown" || statusSeverity(satStatus) > statusSeverity(current) { + if current == "" || current == "Unknown" || collector.StatusSeverity(satStatus) > collector.StatusSeverity(current) { component.Status = appStringPtr(satStatus) if strings.TrimSpace(description) != "" { component.ErrorDescription = appStringPtr(description) @@ -300,8 +300,8 @@ func mergeComponentStatusPreferDetail(component *schema.HardwareComponentStatus, return } current := strings.TrimSpace(ptrString(component.Status)) - newSeverity := statusSeverity(satStatus) - currentSeverity := statusSeverity(current) + newSeverity := collector.StatusSeverity(satStatus) + currentSeverity := collector.StatusSeverity(current) if current == "" || current == "Unknown" || newSeverity > currentSeverity { mergeComponentStatus(component, changedAt, satStatus, description) return @@ -320,21 +320,6 @@ func mergeComponentStatusPreferDetail(component *schema.HardwareComponentStatus, } } -func statusSeverity(status string) int { - switch strings.TrimSpace(status) { - case "Critical": - return 3 - case "Warning": - return 2 - case "OK": - return 1 - case "Unknown": - return 1 // same as OK — does not override OK from another source - default: - return 0 - } -} - func matchesGPUVendor(dev schema.HardwarePCIeDevice, vendor string) bool { if dev.DeviceClass == nil { return false diff --git a/audit/internal/collector/contract.go b/audit/internal/collector/contract.go index c6236a9..d75a697 100644 --- a/audit/internal/collector/contract.go +++ b/audit/internal/collector/contract.go @@ -70,10 +70,10 @@ func isRAIDClass(class string) bool { } } -// statusSeverity ranks component statuses so merges can only escalate, never +// StatusSeverity ranks component statuses so merges can only escalate, never // downgrade. Unknown ranks with OK: it means "couldn't tell", not "healthy", // so it must not silently clear a Warning/Critical raised by an earlier stage. -func statusSeverity(status string) int { +func StatusSeverity(status string) int { switch strings.TrimSpace(status) { case statusCritical: return 3 @@ -101,7 +101,7 @@ func mergeDeviceStatus(dev *schema.HardwarePCIeDevice, status, description strin if dev.Status != nil { current = strings.TrimSpace(*dev.Status) } - if current != "" && current != statusUnknown && statusSeverity(status) <= statusSeverity(current) { + if current != "" && current != statusUnknown && StatusSeverity(status) <= StatusSeverity(current) { return } dev.Status = &status diff --git a/audit/internal/webui/page_topo.go b/audit/internal/webui/page_topo.go index f1b6449..333b4be 100644 --- a/audit/internal/webui/page_topo.go +++ b/audit/internal/webui/page_topo.go @@ -614,15 +614,8 @@ func renderTopoMainDiagram(hw schema.HardwareSnapshot, exportDir string) string } var placed []placedDevice for _, dev := range hw.PCIeDevices { - var kind string - switch { - case dev.DeviceClass != nil && isGPUDeviceClass(*dev.DeviceClass): - kind = "gpu" - case isNICDeviceClassDev(dev): - kind = "nic" - case dev.DeviceClass != nil && isRAIDControllerClass(*dev.DeviceClass): - kind = "raid" - default: + kind := pcieDeviceKind(dev) + if kind == "" { continue } col := unknownCol diff --git a/audit/internal/webui/page_validate.go b/audit/internal/webui/page_validate.go index c06f39d..8be6475 100644 --- a/audit/internal/webui/page_validate.go +++ b/audit/internal/webui/page_validate.go @@ -517,7 +517,7 @@ func loadValidateInventory(opts HandlerOptions) validateInventory { continue } cpuTotal++ - addValidateModel(cpuCounts, validateFirstNonEmpty(validateTrimPtr(cpu.Model), validateTrimPtr(cpu.Manufacturer), "unknown")) + addValidateModel(cpuCounts, firstNonEmpty(validateTrimPtr(cpu.Model), validateTrimPtr(cpu.Manufacturer), "unknown")) } memCounts := map[string]int{} @@ -527,7 +527,7 @@ func loadValidateInventory(opts HandlerOptions) validateInventory { continue } memTotal++ - addValidateModel(memCounts, validateFirstNonEmpty(validateTrimPtr(dimm.PartNumber), validateTrimPtr(dimm.Type), validateTrimPtr(dimm.Manufacturer), "unknown")) + addValidateModel(memCounts, firstNonEmpty(validateTrimPtr(dimm.PartNumber), validateTrimPtr(dimm.Type), validateTrimPtr(dimm.Manufacturer), "unknown")) } storageCounts := map[string]int{} @@ -537,7 +537,7 @@ func loadValidateInventory(opts HandlerOptions) validateInventory { continue } storageTotal++ - addValidateModel(storageCounts, validateFirstNonEmpty(validateTrimPtr(dev.Model), validateTrimPtr(dev.Manufacturer), "unknown")) + addValidateModel(storageCounts, firstNonEmpty(validateTrimPtr(dev.Model), validateTrimPtr(dev.Manufacturer), "unknown")) } nvidiaCounts := map[string]int{} @@ -550,11 +550,11 @@ func loadValidateInventory(opts HandlerOptions) validateInventory { } if validateIsVendorGPU(dev, "nvidia") { nvidiaTotal++ - addValidateModel(nvidiaCounts, validateFirstNonEmpty(validateTrimPtr(dev.Model), validateTrimPtr(dev.Manufacturer), "unknown")) + addValidateModel(nvidiaCounts, firstNonEmpty(validateTrimPtr(dev.Model), validateTrimPtr(dev.Manufacturer), "unknown")) } if validateIsVendorGPU(dev, "amd") { amdTotal++ - addValidateModel(amdCounts, validateFirstNonEmpty(validateTrimPtr(dev.Model), validateTrimPtr(dev.Manufacturer), "unknown")) + addValidateModel(amdCounts, firstNonEmpty(validateTrimPtr(dev.Model), validateTrimPtr(dev.Manufacturer), "unknown")) } } @@ -613,16 +613,6 @@ func validateTrimPtr(value *string) string { return strings.TrimSpace(*value) } -func validateFirstNonEmpty(values ...string) string { - for _, value := range values { - value = strings.TrimSpace(value) - if value != "" { - return value - } - } - return "" -} - func validateIsVendorGPU(dev schema.HardwarePCIeDevice, vendor string) bool { if dev.VendorID != nil && *dev.VendorID == pciVendorAspeed { return false