diff options
author | Ilya Mashchenko <ilya@netdata.cloud> | 2024-06-17 22:35:26 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-17 22:35:26 +0300 |
commit | 3aaf6bfe691963073a3778e4d0fcf98e2888a1c1 (patch) | |
tree | 90d6316d0fbb508c40de5a89835f3ede9c0162ac /src | |
parent | aa9c105ded4d7d203eef9cc1b01cffbc53583db3 (diff) |
go.d storcli add initial support for mpt3sas controllers (#17938)
Diffstat (limited to 'src')
8 files changed, 2411 insertions, 40 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/storcli/charts.go b/src/go/collectors/go.d.plugin/modules/storcli/charts.go index f12b2d1a78..9730c14e72 100644 --- a/src/go/collectors/go.d.plugin/modules/storcli/charts.go +++ b/src/go/collectors/go.d.plugin/modules/storcli/charts.go @@ -11,7 +11,8 @@ import ( ) const ( - prioControllerStatus = module.Priority + iota + prioControllerHealthStatus = module.Priority + iota + prioControllerStatus prioControllerBBUStatus prioPhysDriveErrors @@ -22,12 +23,30 @@ const ( prioBBUTemperature ) -var controllerChartsTmpl = module.Charts{ +var controllerMegaraidChartsTmpl = module.Charts{ + controllerHealthStatusChartTmpl.Copy(), controllerStatusChartTmpl.Copy(), controllerBBUStatusChartTmpl.Copy(), } +var controllerMpt3sasChartsTmpl = module.Charts{ + controllerHealthStatusChartTmpl.Copy(), +} + var ( + controllerHealthStatusChartTmpl = module.Chart{ + ID: "controller_%s_health_status", + Title: "Controller health status", + Units: "status", + Fam: "cntrl status", + Ctx: "storcli.controller_health_status", + Type: module.Line, + Priority: prioControllerHealthStatus, + Dims: module.Dims{ + {ID: "cntrl_%s_health_status_healthy", Name: "healthy"}, + {ID: "cntrl_%s_health_status_unhealthy", Name: "unhealthy"}, + }, + } controllerStatusChartTmpl = module.Chart{ ID: "controller_%s_status", Title: "Controller status", @@ -139,7 +158,16 @@ var ( ) func (s *StorCli) addControllerCharts(cntrl controllerInfo) { - charts := controllerChartsTmpl.Copy() + var charts *module.Charts + + switch cntrl.Version.DriverName { + case driverNameMegaraid: + charts = controllerMegaraidChartsTmpl.Copy() + case driverNameSas: + charts = controllerMpt3sasChartsTmpl.Copy() + default: + return + } num := strconv.Itoa(cntrl.Basics.Controller) @@ -147,7 +175,8 @@ func (s *StorCli) addControllerCharts(cntrl controllerInfo) { chart.ID = fmt.Sprintf(chart.ID, num) chart.Labels = []module.Label{ {Key: "controller_number", Value: num}, - {Key: "model", Value: cntrl.Basics.Model}, + {Key: "model", Value: strings.TrimSpace(cntrl.Basics.Model)}, + {Key: "driver_name", Value: cntrl.Version.DriverName}, } for _, dim := range chart.Dims { dim.ID = fmt.Sprintf(dim.ID, num) diff --git a/src/go/collectors/go.d.plugin/modules/storcli/collect.go b/src/go/collectors/go.d.plugin/modules/storcli/collect.go index d9b1c9af2f..df2b09d87f 100644 --- a/src/go/collectors/go.d.plugin/modules/storcli/collect.go +++ b/src/go/collectors/go.d.plugin/modules/storcli/collect.go @@ -4,6 +4,11 @@ package storcli import "fmt" +const ( + driverNameMegaraid = "megaraid_sas" + driverNameSas = "mpt3sas" +) + func (s *StorCli) collect() (map[string]int64, error) { cntrlResp, err := s.queryControllersInfo() if err != nil { @@ -12,20 +17,28 @@ func (s *StorCli) collect() (map[string]int64, error) { mx := make(map[string]int64) - if err := s.collectControllersInfo(mx, cntrlResp); err != nil { - return nil, fmt.Errorf("error collecting controller info: %s", err) - } - - drives := cntrlResp.Controllers[0].ResponseData.PDList driver := cntrlResp.Controllers[0].ResponseData.Version.DriverName - if driver == "megaraid_sas" && len(drives) > 0 { - drivesResp, err := s.queryDrivesInfo() - if err != nil { - return nil, fmt.Errorf("error collecting drives info: %s", err) + + switch driver { + case driverNameMegaraid: + if err := s.collectMegaraidControllersInfo(mx, cntrlResp); err != nil { + return nil, fmt.Errorf("failed to collect megaraid controller info: %s", err) + } + if len(cntrlResp.Controllers[0].ResponseData.PDList) > 0 { + drivesResp, err := s.queryDrivesInfo() + if err != nil { + return nil, fmt.Errorf("failed to collect megaraid drive info: %s", err) + } + if err := s.collectMegaRaidDrives(mx, drivesResp); err != nil { + return nil, err + } } - if err := s.collectMegaRaidDrives(mx, drivesResp); err != nil { - return nil, err + case driverNameSas: + if err := s.collectMpt3sasControllersInfo(mx, cntrlResp); err != nil { + return nil, fmt.Errorf("failed to collect mpt3sas controller info: %s", err) } + default: + return nil, fmt.Errorf("unknown driver: %s", driver) } return mx, nil diff --git a/src/go/collectors/go.d.plugin/modules/storcli/collect_controllers.go b/src/go/collectors/go.d.plugin/modules/storcli/collect_controllers.go index d1302aea01..64d6159464 100644 --- a/src/go/collectors/go.d.plugin/modules/storcli/collect_controllers.go +++ b/src/go/collectors/go.d.plugin/modules/storcli/collect_controllers.go @@ -30,8 +30,8 @@ type ( DriverName string `json:"Driver Name"` } `json:"Version"` Status struct { - ControllerStatus string `json:"Controller Status"` - BBUStatus storNumber `json:"BBU Status"` + ControllerStatus string `json:"Controller Status"` + BBUStatus *storNumber `json:"BBU Status"` } `json:"Status"` BBUInfo []struct { Model string `json:"Model"` @@ -43,7 +43,7 @@ type ( } ) -func (s *StorCli) collectControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error { +func (s *StorCli) collectMegaraidControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error { for _, v := range resp.Controllers { cntrl := v.ResponseData @@ -56,22 +56,33 @@ func (s *StorCli) collectControllersInfo(mx map[string]int64, resp *controllersI px := fmt.Sprintf("cntrl_%s_", cntrlNum) + for _, st := range []string{"healthy", "unhealthy"} { + mx[px+"health_status_"+st] = 0 + } + if strings.ToLower(cntrl.Status.ControllerStatus) == "optimal" { + mx[px+"health_status_healthy"] = 1 + } else { + mx[px+"health_status_unhealthy"] = 1 + } + for _, st := range []string{"optimal", "degraded", "partially_degraded", "failed"} { mx[px+"status_"+st] = 0 } mx[px+"status_"+strings.ToLower(cntrl.Status.ControllerStatus)] = 1 - for _, st := range []string{"healthy", "unhealthy", "na"} { - mx[px+"bbu_status_"+st] = 0 - } - // https://github.com/prometheus-community/node-exporter-textfile-collector-scripts/issues/27 - switch cntrl.Status.BBUStatus { - case "0", "8", "4096": // 0 good, 8 charging - mx[px+"bbu_status_healthy"] = 1 - case "NA", "N/A": - mx[px+"bbu_status_na"] = 1 - default: - mx[px+"bbu_status_unhealthy"] = 1 + if cntrl.Status.BBUStatus != nil { + for _, st := range []string{"healthy", "unhealthy", "na"} { + mx[px+"bbu_status_"+st] = 0 + } + // https://github.com/prometheus-community/node-exporter-textfile-collector-scripts/issues/27 + switch *cntrl.Status.BBUStatus { + case "0", "8", "4096": // 0 good, 8 charging + mx[px+"bbu_status_healthy"] = 1 + case "NA", "N/A": + mx[px+"bbu_status_na"] = 1 + default: + mx[px+"bbu_status_unhealthy"] = 1 + } } for i, bbu := range cntrl.BBUInfo { @@ -92,6 +103,32 @@ func (s *StorCli) collectControllersInfo(mx map[string]int64, resp *controllersI return nil } +func (s *StorCli) collectMpt3sasControllersInfo(mx map[string]int64, resp *controllersInfoResponse) error { + for _, v := range resp.Controllers { + cntrl := v.ResponseData + + cntrlNum := strconv.Itoa(cntrl.Basics.Controller) + + if !s.controllers[cntrlNum] { + s.controllers[cntrlNum] = true + s.addControllerCharts(cntrl) + } + + px := fmt.Sprintf("cntrl_%s_", cntrlNum) + + for _, st := range []string{"healthy", "unhealthy"} { + mx[px+"health_status_"+st] = 0 + } + if strings.ToLower(cntrl.Status.ControllerStatus) == "ok" { + mx[px+"health_status_healthy"] = 1 + } else { + mx[px+"health_status_unhealthy"] = 1 + } + } + + return nil +} + func (s *StorCli) queryControllersInfo() (*controllersInfoResponse, error) { bs, err := s.exec.controllersInfo() if err != nil { diff --git a/src/go/collectors/go.d.plugin/modules/storcli/collect_drives.go b/src/go/collectors/go.d.plugin/modules/storcli/collect_drives.go index c84ca4b1e2..5c2ecb3870 100644 --- a/src/go/collectors/go.d.plugin/modules/storcli/collect_drives.go +++ b/src/go/collectors/go.d.plugin/modules/storcli/collect_drives.go @@ -55,6 +55,10 @@ type storNumber string // some int values can be 'N/A' func (n *storNumber) UnmarshalJSON(b []byte) error { *n = storNumber(b); return nil } func (s *StorCli) collectMegaRaidDrives(mx map[string]int64, resp *drivesInfoResponse) error { + if resp == nil { + return nil + } + for _, cntrl := range resp.Controllers { var ids []string for k := range cntrl.ResponseData { diff --git a/src/go/collectors/go.d.plugin/modules/storcli/metadata.yaml b/src/go/collectors/go.d.plugin/modules/storcli/metadata.yaml index ab7866bcf9..7e807f056a 100644 --- a/src/go/collectors/go.d.plugin/modules/storcli/metadata.yaml +++ b/src/go/collectors/go.d.plugin/modules/storcli/metadata.yaml @@ -81,9 +81,9 @@ modules: problems: list: [] alerts: - - name: storcli_controller_status - metric: storcli.controller_status - info: RAID controller ${label:controller_number} health status is not optimal + - name: storcli_controller_health_status + metric: storcli.controller_health_status + info: RAID controller ${label:controller_number} is unhealthy link: https://github.com/netdata/netdata/blob/master/src/health/health.d/storcli.conf - name: storcli_controller_bbu_status metric: storcli.controller_bbu_status @@ -111,7 +111,16 @@ modules: description: Controller number (index) - name: model description: Controller model + - name: driver_name + description: Controller driver (megaraid_sas or mpt3sas) metrics: + - name: storcli.controller_health_status + description: Controller health status + unit: status + chart_type: line + dimensions: + - name: healthy + - name: unhealthy - name: storcli.controller_status description: Controller status unit: status diff --git a/src/go/collectors/go.d.plugin/modules/storcli/storcli_test.go b/src/go/collectors/go.d.plugin/modules/storcli/storcli_test.go index 74c92b8704..ad1b43f0e4 100644 --- a/src/go/collectors/go.d.plugin/modules/storcli/storcli_test.go +++ b/src/go/collectors/go.d.plugin/modules/storcli/storcli_test.go @@ -19,15 +19,17 @@ var ( dataMegaControllerInfo, _ = os.ReadFile("testdata/megaraid-controllers-info.json") dataMegaDrivesInfo, _ = os.ReadFile("testdata/megaraid-drives-info.json") + + dataSasControllerInfo, _ = os.ReadFile("testdata/mpt3sas-controllers-info.json") ) func Test_testDataIsValid(t *testing.T) { for name, data := range map[string][]byte{ - "dataConfigJSON": dataConfigJSON, - "dataConfigYAML": dataConfigYAML, - + "dataConfigJSON": dataConfigJSON, + "dataConfigYAML": dataConfigYAML, "dataMegaControllerInfo": dataMegaControllerInfo, "dataMegaDrivesInfo": dataMegaDrivesInfo, + "dataSasControllerInfo": dataSasControllerInfo, } { require.NotNil(t, data, name) } @@ -147,12 +149,14 @@ func TestStorCli_Collect(t *testing.T) { }{ "success MegaRAID controller": { prepareMock: prepareMockMegaRaidOK, - wantCharts: len(controllerChartsTmpl)*1 + len(physDriveChartsTmpl)*6 + len(bbuChartsTmpl)*1, + wantCharts: len(controllerMegaraidChartsTmpl)*1 + len(physDriveChartsTmpl)*6 + len(bbuChartsTmpl)*1, wantMetrics: map[string]int64{ "bbu_0_cntrl_0_temperature": 34, "cntrl_0_bbu_status_healthy": 1, "cntrl_0_bbu_status_na": 0, "cntrl_0_bbu_status_unhealthy": 0, + "cntrl_0_health_status_healthy": 1, + "cntrl_0_health_status_unhealthy": 0, "cntrl_0_status_degraded": 0, "cntrl_0_status_failed": 0, "cntrl_0_status_optimal": 1, @@ -195,6 +199,14 @@ func TestStorCli_Collect(t *testing.T) { "phys_drive_5000C500E5659BA7_cntrl_0_temperature": 27, }, }, + "success SAS controller": { + prepareMock: prepareMockSasOK, + wantCharts: len(controllerMpt3sasChartsTmpl) * 1, + wantMetrics: map[string]int64{ + "cntrl_0_health_status_healthy": 1, + "cntrl_0_health_status_unhealthy": 0, + }, + }, "err on exec": { prepareMock: prepareMockErr, wantMetrics: nil, @@ -231,6 +243,13 @@ func prepareMockMegaRaidOK() *mockStorCliExec { } } +func prepareMockSasOK() *mockStorCliExec { + return &mockStorCliExec{ + controllersInfoData: dataSasControllerInfo, + drivesInfoData: nil, + } +} + func prepareMockErr() *mockStorCliExec { return &mockStorCliExec{ errOnInfo: true, diff --git a/src/go/collectors/go.d.plugin/modules/storcli/testdata/mpt3sas-controllers-info.json b/src/go/collectors/go.d.plugin/modules/storcli/testdata/mpt3sas-controllers-info.json new file mode 100644 index 0000000000..02eefd7196 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/storcli/testdata/mpt3sas-controllers-info.json @@ -0,0 +1,2260 @@ +{ + "Controllers": [ + { + "Command Status": { + "CLI Version": "007.2703.0000.0000 July 03, 2023", + "Operating system": "Linux 6.9.4-dx", + "Controller": 0, + "Status": "Success", + "Description": "None" + }, + "Response Data": { + "Basics": { + "Controller": 0, + "Adapter Type": " SAS3808(A0)", + "Model": "HBA 9500-8i", + "Serial Number": "REDACTED", + "Current System Date/time": "06/17/2024 18:39:45", + "Concurrent commands supported": 4992, + "SAS Address": " 500062b20828c940", + "PCI Address": "00:01:00:00" + }, + "Version": { + "Firmware Package Build": "28.00.00.00", + "Firmware Version": "28.00.00.00", + "Bios Version": "09.55.00.00_28.00.00.00", + "NVDATA Version": "28.01.00.12", + "PSOC FW Version": "0x0064", + "PSOC Part Number": "14790", + "Driver Name": "mpt3sas", + "Driver Version": "48.100.00.00" + }, + "PCI Version": { + "Vendor Id": 4096, + "Device Id": 230, + "SubVendor Id": 4096, + "SubDevice Id": 16512, + "Host Interface": "PCIE", + "Device Interface": "SAS-12G", + "Bus Number": 1, + "Device Number": 0, + "Function Number": 0, + "Domain ID": 0 + }, + "Pending Images in Flash": { + "Image name": "No pending images" + }, + "Status": { + "Controller Status": "OK", + "Memory Correctable Errors": 0, + "Memory Uncorrectable Errors": 0, + "Bios was not detected during boot": "No", + "Controller has booted into safe mode": "No", + "Controller has booted into certificate provision mode": "No", + "Package Stamp Mismatch": "No" + }, + "Supported Adapter Operations": { + "Alarm Control": "No", + "Cluster Support": "No", + "Self Diagnostic": "No", + "Deny SCSI Passthrough": "No", + "Deny SMP Passthrough": "No", + "Deny STP Passthrough": "No", + "Support more than 8 Phys": "Yes", + "FW and Event Time in GMT": "No", + "Support Enclosure Enumeration": "Yes", + "Support Allowed Operations": "Yes", + "Support Multipath": "Yes", + "Support Security": "Yes", + "Support Config Page Model": "No", + "Support the OCE without adding drives": "No", + "support EKM": "No", + "Snapshot Enabled": "No", + "Support PFK": "No", + "Support PI": "No", + "Support Shield State": "No", + "Support Set Link Speed": "No", + "Support JBOD": "No", + "Disable Online PFK Change": "No", + "Real Time Scheduler": "No", + "Support Reset Now": "No", + "Support Emulated Drives": "No", + "Support Secure Boot": "Yes", + "Support Platform Security": "No", + "Support Package Stamp Mismatch Reporting": "Yes", + "Support PSOC Update": "Yes", + "Support PSOC Part Information": "Yes", + "Support PSOC Version Information": "Yes" + }, + "HwCfg": { + "ChipRevision": " A0", + "BatteryFRU": "N/A", + "Front End Port Count": 1, + "Backend Port Count": 11, + "Serial Debugger": "Absent", + "NVRAM Size": "0KB", + "Flash Size": "16MB", + "On Board Memory Size": "0MB", + "On Board Expander": "Absent", + "Temperature Sensor for ROC": "Present", + "Temperature Sensor for Controller": "Absent", + "Current Size of CacheCade (GB)": 0, + "Current Size of FW Cache (MB)": 0, + "ROC temperature(Degree Celsius)": 44 + }, + "Policies": { + "Policies Table": [ + { + "Policy": "Predictive Fail Poll Interval", + "Current": "0 sec", + "Default": "" + }, + { + "Policy": "Interrupt Throttle Active Count", + "Current": "0", + "Default": "" + }, + { + "Policy": "Interrupt Throttle Completion", + "Current": "0 us", + "Default": "" + }, + { + "Policy": "Rebuild Rate", + "Current": "0 %", + "Default": "30%" + }, + { + "Policy": "PR Rate", + "Current": "0 %", + "Default": "30%" + }, + { + "Policy": "BGI Rate", + "Current": "0 %", + "Default": "30%" + }, + { + "Policy": "Check Consistency Rate", + "Current": "0 %", + "Default": "30%" + }, + { + "Policy": "Reconstruction Rate", + "Current": "0 %", + "Default": "30%" + }, + { + "Policy": "Cache Flush Interval", + "Current": "0s", + "Default": "" + } + ], + "Flush Time(Default)": "4s", + "Drive Coercion Mode": "none", + "Auto Rebuild": "Off", + "Battery Warning": "Off", + "ECC Bucket Size": 0, + "ECC Bucket Leak Rate (hrs)": 0, + "Restore HotSpare on Insertion": "Off", + "Expose Enclosure Devices": "Off", + "Maintain PD Fail History": "Off", + "Reorder Host Requests": "On", + "Auto detect BackPlane": "SGPIO/i2c SEP", + "Load Balance Mode": "None", + "Security Key Assigned": "Off", + "Disable Online Controller Reset": "Off", + "Use drive activity for locate": "Off" + }, + "Boot": { + "Max Drives to Spinup at One Time": 2, + "Maximum number of direct attached drives to spin up in 1 min": 60, + "Delay Among Spinup Groups (sec)": 2, + "Allow Boot with Preserved Cache": "On" + }, + "Defaults": { + "Phy Polarity": 0, + "Phy PolaritySplit": 0, + "Cached IO": "Off", + "Default spin down time (mins)": 0, + "Coercion Mode": "None", + "ZCR Config": "Unknown", + "Max Chained Enclosures": 0, + "Direct PD Mapping": "No", + "Restore Hot Spare on Insertion": "No", + "Expose Enclosure Devices": "No", + "Maintain PD Fail History": "No", + "Zero Based Enclosure Enumeration": "No", + "Disable Puncturing": "No", + "Un-Certified Hard Disk Drives": "Block", + "SMART Mode": "Mode 6", + "Enable LED Header": "No", + "LED Show Drive Activity": "No", + "Dirty LED Shows Drive Activity": "No", + "EnableCrashDump": "No", + "Disable Online Controller Reset": "No", + "Treat Single span R1E as R10": "No", + "Power Saving option": "Enable", + "TTY Log In Flash": "No", + "Auto Enhanced Import": "No", + "Enable Shield State": "No", + "Time taken to detect CME": "60 sec" + }, + "Capabilities": { + "Supported Drives": "SAS, SATA, NVMe", + "Enable JBOD": "Yes", + "Max Parallel Commands": 4992, + "Max SGE Count": 128, + "Max Data Transfer Size": "32 sectors", + "Max Strips PerIO": 0, + "Max Configurable CacheCade Size": 0, + "Min Strip Size": "512Bytes", + "Max Strip Size": "512Bytes" + }, + "Scheduled Tasks": "NA", + "Secure Boot": { + "Secure Boot Enabled": "Yes", + "Controller in Soft Secure Mode": "No", + "Controller in Hard Secure Mode": "Yes", + "Key Update Pending": "No", + "Remaining Secure Boot Key Slots": 7 + }, + "Security Protocol properties": { + "Security Protocol": "None" + }, + "Enclosure Information": [ + { + "EID": 23, + "State": "OK", + "Slots": 24, + "PD": 23, + "PS": 0, + "Fans": 0, + "TSs": 2, + "Alms": 0, + "SIM": 0, + "ProdID": "SC846-P", + "VendorSpecific": "x40-66.16.11.0" + }, + { + "EID": 30, + "State": "OK", + "Slots": 12, + "PD": 6, + "PS": 0, + "Fans": 0, + "TSs": 2, + "Alms": 0, + "SIM": 0, + "ProdID": "SC826-P", + "VendorSpecific": "x28-66.16.11.0" + } + ], + "Physical Device Information": { + "Drive /c0/e23/s0": [ + { + "EID:Slt": "23:0", + "DID": 0, + "State": "JBOD", + "DG": "-", + "Size": "12.732 TB", + "Intf": "SATA", + "Med": "HDD", + "SED": "-", + "PI": "-", + "SeSz": "512B", + "Model": "ST14000NM001G-2KJ103", + "Sp": "-" + } + ], + "Drive /c0/e23/s0 - Detailed Information": { + "Drive /c0/e23/s0 State": { + "Shield Counter": "N/A", + "Media Error Count": "N/A", + "Other Error Count": "N/A", + "Predictive Failure Count": "N/A", + "S.M.A.R.T alert flagged by drive": "N/A" + }, + "Drive /c0/e23/s0 Device attributes": { + "Manufacturer Id": "ATA ", + "Model Number": "ST14000NM001G-2KJ103", + "NAND Vendor": "NA", + "SN": " REDACTED", + "WWN": "REDACTED", + "Firmware Revision": "SN03 ", + "Raw size": "12.732 TB [0x65ddfffff Sectors]", + "Coerced size": "12.732 TB [0x65ddfffff Sectors]", + "Non Coerced size": "12.732 TB [0x65ddfffff Sectors]", + "Device Speed": "6.0Gb/s", + "Link Speed": "12.0Gb/s", + "NCQ setting": "N/A", + "Sector Size": "512B", + "Config ID": "NA", + "Number of Blocks": 27344764927, + "Connector Name": "C0 & C1 " + }, + "Drive /c0/e23/s0 Policies/Settings": { + "Enclosure position": "0", + "Connected Port Number": "0(path0) ", + "Sequence Number": 0, + "Commissioned Spare": "No", + "Emergency Spare": "No", + "Last Predictive Failure Event Sequence Number": "N/A", + "Successful diagnostics completion on": "N/A", + "SED Capable": "N/A", + "SED Enabled": "N/A", + "Secured": "N/A", + "Needs EKM Attention": "N/A", + "PI Eligible": "N/A", + "Certified": "N/A", + "Wide Port Capable": "N/A", + "Multipath": "No", + "Port Information": [ + { + "Port": 0, + "Status": "Active", + "Linkspeed": "12.0Gb/s", + "SAS address": "0x5003048020db4540" + } + ] + }, + "Inquiry Data": "5a 0c ff 3f 37 c8 10 00 00 00 00 00 3f 00 00 00 00 00 00 00 20 20 20 20 20 20 20 20 20 20 20 20 4c 5a 4a 32 30 46 4b 34 00 00 00 00 00 00 4e 53 33 30 20 20 20 20 54 53 34 31 30 30 4e 30 30 4d 31 30 2d 47 4b 32 31 4a 33 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 80 00 40 00 2f 00 40 00 02 00 02 07 00 ff 3f 10 00 3f 00 10 fc fb 00 10 5d ff ff ff 0f 00 00 07 00 " + }, + "Drive /c0/e23/s1": [ + { + "EID:Slt": "23:1", + "DID": 1, + "State": "JBOD", + "DG": "-", + "Size": "1.819 TB", + "Intf": "SATA", + "Med": "SSD", + "SED": "-", + "PI": "-", + "SeSz": "512B", + "Model": "WDC WDS200T1R0A-68A4W0", + "Sp": "-" + } + ], + "Drive /c0/e23/s1 - Detailed Information": { + "Drive /c0/e23/s1 State": { + "Shield Counter": "N/A", + "Media Error Count": "N/A", + "Other Error Count": "N/A", + "Predictive Failure Count": "N/A", + "S.M.A.R.T alert flagged by drive": "N/A" + }, + "Drive /c0/e23/s1 Device attributes": { + "Manufacturer Id": "ATA ", + "Model Number": "WDC WDS200T1R0A-68A4W0", + "NAND Vendor": "NA", + "SN": "REDACTED ", + "WWN": "REDACTED", + "Firmware Revision": "411000WR", + "Raw size": "1.819 TB [0xe8e088af Sectors]", + "Coerced size": "1.819 TB [0xe8e088af Sectors]", + "Non Coerced size": "1.819 TB [0xe8e088af Sectors]", + "Device Speed": "6.0Gb/s", + "Link Speed": "12.0Gb/s", + "NCQ setting": "N/A", + "Sector Size": "512B", + "Config ID": "NA", + "Number of Blocks": 3907029167, + "Connector Name": "C0 & C1 " + }, + "Drive /c0/e23/s1 Policies/Settings": { + "Enclosure position": "0", + "Connected Port Number": "0(path0) ", + "Sequence Number": 0, + "Commissioned Spare": "No", + "Emergency Spare": "No", + "Last Predictive Failure Event Sequence Number": "N/A", + "Successful diagnostics completion on": "N/A", + "SED Capable": "N/A", + "SED Enabled": "N/A", + "Secured": "N/A", + "Needs EKM Attention": "N/A", + "PI Eligible": "N/A", + "Certified": "N/A", + "Wide Port Capable": "N/A", + "Multipath": "No", + "Port Information": [ + { + "Port": 0, + "Status": "Active", + "Linkspeed": "12.0Gb/s", + "SAS address": "0x5003048020db4541" + } + ] + }, + "Inquiry Data": "40 00 ff 3f 37 c8 10 00 00 00 00 00 3f 00 00 00 00 00 00 00 30 32 35 33 34 43 34 34 38 30 35 31 20 20 20 20 20 20 20 20 00 00 00 00 00 00 31 34 30 31 30 30 52 57 44 57 20 43 57 20 53 44 30 32 54 30 52 31 41 30 36 2d 41 38 57 34 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 01 80 00 40 00 2f 00 40 00 02 00 00 06 00 ff 3f 10 00 3f 00 10 fc fb 00 01 91 ff ff ff 0f 00 00 07 00 " + }, + "Drive /c0/e23/s2": [ + { + "EID:Slt": "23:2", + "DID": 2, + "State": "JBOD", + "DG": "-", + "Size": "16.370 TB", + "Intf": "SATA", + "Med": "HDD", + "SED": "-", + "PI": "-", + "SeSz": "512B", + "Model": "ST18000NM000J-2TV103", + "Sp": "-" + } + ], + "Drive /c0/e23/s2 - Detailed Information": { + "Drive /c0/e23/s2 State": { + "Shield Counter": "N/A", + "Media Error Count": "N/A", + "Other Error Count": "N/A", + "Predictive Failure Count": "N/A", + "S.M.A.R.T alert flagged by drive": "N/A" + }, + "Drive /c0/e23/s2 Device attributes": { + "Manufacturer Id": "ATA ", + "Model Number": "ST18000NM000J-2TV103", + "NAND Vendor": "NA", + "SN": " REDACTED", + "WWN": "REDACTED", + "Firmware Revision": "SN02 ", + "Raw size": "16.370 TB [0x82f7fffff Sectors]", + "Coerced size": "16.370 TB [0x82f7fffff Sectors]", + "Non Coerced size": "16.370 TB [0x82f7fffff Sectors]", + "Device Speed": "6.0Gb/s", + "Link Speed": "12.0Gb/s", + "NCQ setting": "N/A", + "Sector Size": "512B", + "Config ID": "NA", + "Number of Blocks": 35156656127, + "Connector Name": "C0 & C1 " + }, + "Drive /c0/e23/s2 Policies/Settings": { + "Enclosure position": "0", + "Connected Port Number": "0(path0) ", + "Sequence Number": 0, + "Commissioned Spare": "No", + "Emergency Spare": "No", + "Last Predictive Failure Event Sequence Number": "N/A", + "Successful diagnostics completion on": "N/A", + "SED Capable": "N/A", + "SED Enabled": "N/A", + "Secured": "N/A", + "Needs EKM Attention": "N/A", + "PI Eligible": "N/A", + "Certified": "N/A", + "Wide Port Capable": "N/A", + "Multipath": "No", + "Port Information": [ + { + "Port": 0, + "Status": "Active", + "Linkspeed": "12.0Gb/s", + "SAS address": "0x5003048020db4542" + } + ] + }, + "Inquiry Data": "5a 0c ff 3f 37 c8 10 00 00 00 00 00 3f 00 00 00 00 00 00 00 20 20 20 20 20 20 20 20 20 20 20 20 52 5a 33 35 47 57 50 30 00 00 00 00 00 00 4e 53 32 30 20 20 20 20 54 53 38 31 30 30 4e 30 30 4d 30 30 2d 4a 54 32 31 56 33 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10 80 00 40 00 2f 00 40 00 02 00 02 07 00 ff 3f 10 00 3f 00 10 fc fb 00 10 5d ff ff ff 0f 00 00 07 00 " + }, + "Drive /c0/e23/s3": [ + { + "EID:Slt": "23:3", + "DID": 3, + "State": "JBOD", + "DG": "-", + "Size": "1.819 TB", + "Intf": "SATA", + "Med": "SSD", + "SED": "-", + "PI": "-", + "SeSz": "512B", + "Model": "WDC WDS200T1R0A-68A4W0", + "Sp": "-" + } + ], + "Drive /c0/e23/s3 - Detailed Information": { + "Drive /c0/e23/s3 State": { + "Shield Counter": "N/A", + "Media Error Count": "N/A", + "Other Error Count": "N/A", + "Predictive Failure Count": "N/A", + "S.M.A.R.T alert flagged |