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 <noreply@anthropic.com>
This commit is contained in:
19
internal/parser/vendors/inspur/component.go
vendored
19
internal/parser/vendors/inspur/component.go
vendored
@@ -204,6 +204,25 @@ func parseMemoryInfo(text string, hw *models.HardwareConfig) {
|
|||||||
}
|
}
|
||||||
merged = append(merged, item)
|
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
|
hw.Memory = merged
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ func TestParseMemoryInfo_PresentWithZeroSize(t *testing.T) {
|
|||||||
t.Errorf("expected 2 present DIMMs, got %d", presentCount)
|
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
|
found := false
|
||||||
for _, m := range hw.Memory {
|
for _, m := range hw.Memory {
|
||||||
if m.Slot == "CPU1_C0D0" {
|
if m.Slot == "CPU1_C0D0" {
|
||||||
@@ -72,6 +72,9 @@ func TestParseMemoryInfo_PresentWithZeroSize(t *testing.T) {
|
|||||||
if m.SerialNumber != "K0UX000401205D2037" {
|
if m.SerialNumber != "K0UX000401205D2037" {
|
||||||
t.Errorf("wrong serial: %s", m.SerialNumber)
|
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 {
|
if !found {
|
||||||
|
|||||||
Reference in New Issue
Block a user