Files
bee/audit/internal/collector/raid_storcli2_test.go
T
Mikhail ChusavitinandClaude Sonnet 5 b7f015c713 raid: add storcli2 support for Tri-Mode controllers (SAS3808-iMR/9500 series)
storcli64 enumerates these controllers but reports zero drives; storcli2
is the tool Broadcom ships for Tri-Mode/MegaRAID8 hardware and uses a
compatible JSON schema for drive listing. Wires storcli2 into both the
collector (structured drive data) and the webui RAID Management page
(dedup so a controller isn't double-listed if storcli64 already sees it
with zero drives), plus techdump raw collection and the ISO vendor-tool
build step.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 15:25:06 +03:00

76 lines
2.6 KiB
Go

package collector
import "testing"
// Fixture shape matches Broadcom's published storcli2 system-schema.json
// ("show all" -> Controllers[0].Response Data.System Overview[].Ctrl).
func TestParseStorcli2ControllerIndices(t *testing.T) {
raw := []byte(`{
"Controllers": [
{
"Command Status": {"Status": "Success"},
"Response Data": {
"Number of Controllers": 2,
"System Overview": [
{"Ctrl": 0, "Product Name": "SAS3808-iMR", "Personality": "RAID", "Status": "Optimal", "PD(s)": 2, "VD(s)": 0},
{"Ctrl": 1, "Product Name": "SAS3808-iMR", "Personality": "RAID", "Status": "Optimal", "PD(s)": 4, "VD(s)": 1}
]
}
}
]
}`)
got := parseStorcli2ControllerIndices(raw)
if len(got) != 2 || got[0] != 0 || got[1] != 1 {
t.Fatalf("indices=%v want [0 1]", got)
}
}
func TestParseStorcli2ControllerIndicesEmptyOrMalformed(t *testing.T) {
if got := parseStorcli2ControllerIndices([]byte("not json")); got != nil {
t.Fatalf("malformed input should return nil, got %v", got)
}
if got := parseStorcli2ControllerIndices([]byte(`{"Controllers":[]}`)); got != nil {
t.Fatalf("no controllers should return nil, got %v", got)
}
}
// TestCollectStorcli2DrivesEndToEnd exercises the full path this bug fix
// targets: storcli64 sees the Tri-Mode controller but no drives (real
// support-bundle behavior for SAS3808-iMR), storcli2 is the tool that
// actually finds them.
func TestCollectStorcli2DrivesEndToEnd(t *testing.T) {
orig := raidToolQuery
t.Cleanup(func() { raidToolQuery = orig })
raidToolQuery = func(name string, args ...string) ([]byte, error) {
switch name {
case "storcli2":
if len(args) > 0 && args[0] == "show" {
return []byte(`{"Controllers":[{"Response Data":{"System Overview":[{"Ctrl":0,"Product Name":"SAS3808-iMR"}]}}]}`), nil
}
// per-controller drive listing: /c0/eall/sall show all J
return []byte(`{
"Controllers": [
{
"Response Data": {
"Drive Information": [
{"EID:Slt": "252:0", "State": "Onln", "Size": "1.746 TB", "Intf": "NVMe", "Med": "SSD", "Model": "SAMSUNG MZQL21T9HCJR", "SN": "S6EYNE0T123456"},
{"EID:Slt": "252:1", "State": "UGood", "Size": "1.746 TB", "Intf": "NVMe", "Med": "SSD", "Model": "SAMSUNG MZQL21T9HCJR", "SN": "S6EYNE0T654321"}
]
}
}
]
}`), nil
}
return nil, nil
}
drives := collectStorcli2Drives()
if len(drives) != 2 {
t.Fatalf("drives=%d want 2 (%#v)", len(drives), drives)
}
if drives[0].SerialNumber == nil || *drives[0].SerialNumber != "S6EYNE0T123456" {
t.Fatalf("drives[0]=%#v want serial S6EYNE0T123456", drives[0])
}
}