From dfd64550cfef06f562973ba6a84ec895c9949bd1 Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Thu, 21 May 2026 14:18:15 +0300 Subject: [PATCH] fix(inspur): infer DIMM size from part number when BMC reports size=0 When BMC firmware fails to read capacity for a present DIMM, size_mb stays 0. If another DIMM with the same part number in the same batch has a known size, use it to fill the gap. Co-Authored-By: Claude Sonnet 4.6 --- internal/parser/vendors/inspur/component.go | 19 +++++++++++++++++++ .../parser/vendors/inspur/cpu_mem_fix_test.go | 5 ++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/internal/parser/vendors/inspur/component.go b/internal/parser/vendors/inspur/component.go index 1330215..00397e6 100644 --- a/internal/parser/vendors/inspur/component.go +++ b/internal/parser/vendors/inspur/component.go @@ -204,6 +204,25 @@ func parseMemoryInfo(text string, hw *models.HardwareConfig) { } merged = append(merged, item) } + + // If a present DIMM has size=0 (BMC firmware glitch), infer size from + // another present DIMM with the same part number in the same batch. + partSize := make(map[string]int) + for _, m := range merged { + if m.Present && m.SizeMB > 0 && strings.TrimSpace(m.PartNumber) != "" { + partSize[strings.TrimSpace(m.PartNumber)] = m.SizeMB + } + } + for i := range merged { + if merged[i].Present && merged[i].SizeMB == 0 { + if pn := strings.TrimSpace(merged[i].PartNumber); pn != "" { + if sz, ok := partSize[pn]; ok { + merged[i].SizeMB = sz + } + } + } + } + hw.Memory = merged } diff --git a/internal/parser/vendors/inspur/cpu_mem_fix_test.go b/internal/parser/vendors/inspur/cpu_mem_fix_test.go index 2f14858..933ad75 100644 --- a/internal/parser/vendors/inspur/cpu_mem_fix_test.go +++ b/internal/parser/vendors/inspur/cpu_mem_fix_test.go @@ -61,7 +61,7 @@ func TestParseMemoryInfo_PresentWithZeroSize(t *testing.T) { t.Errorf("expected 2 present DIMMs, got %d", presentCount) } - // Find CPU1_C0D0 (size=0 but serial present) + // Find CPU1_C0D0 (size=0 but serial present — size should be inferred from same part number) found := false for _, m := range hw.Memory { if m.Slot == "CPU1_C0D0" { @@ -72,6 +72,9 @@ func TestParseMemoryInfo_PresentWithZeroSize(t *testing.T) { if m.SerialNumber != "K0UX000401205D2037" { t.Errorf("wrong serial: %s", m.SerialNumber) } + if m.SizeMB != 32768 { + t.Errorf("expected SizeMB=32768 inferred from part number, got %d", m.SizeMB) + } } } if !found {