summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIlya Mashchenko <ilya@netdata.cloud>2024-06-17 22:35:26 +0300
committerGitHub <noreply@github.com>2024-06-17 22:35:26 +0300
commit3aaf6bfe691963073a3778e4d0fcf98e2888a1c1 (patch)
tree90d6316d0fbb508c40de5a89835f3ede9c0162ac /src
parentaa9c105ded4d7d203eef9cc1b01cffbc53583db3 (diff)
go.d storcli add initial support for mpt3sas controllers (#17938)
Diffstat (limited to 'src')
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/charts.go37
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/collect.go35
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/collect_controllers.go65
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/collect_drives.go4
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/metadata.yaml15
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/storcli_test.go27
-rw-r--r--src/go/collectors/go.d.plugin/modules/storcli/testdata/mpt3sas-controllers-info.json2260
-rw-r--r--src/health/health.d/storcli.conf8
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