summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/scaleio/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/go/collectors/go.d.plugin/modules/scaleio/client')
-rw-r--r--src/go/collectors/go.d.plugin/modules/scaleio/client/client.go316
-rw-r--r--src/go/collectors/go.d.plugin/modules/scaleio/client/client_test.go142
-rw-r--r--src/go/collectors/go.d.plugin/modules/scaleio/client/server.go149
-rw-r--r--src/go/collectors/go.d.plugin/modules/scaleio/client/types.go1096
4 files changed, 1703 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/scaleio/client/client.go b/src/go/collectors/go.d.plugin/modules/scaleio/client/client.go
new file mode 100644
index 000000000..c75f79aa7
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/scaleio/client/client.go
@@ -0,0 +1,316 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package client
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+ "net/url"
+ "path"
+ "strconv"
+ "strings"
+ "sync"
+
+ "github.com/netdata/netdata/go/go.d.plugin/pkg/web"
+)
+
+/*
+The REST API is served from the VxFlex OS Gateway.
+The FxFlex Gateway connects to a single MDM and serves requests by querying the MDM
+and reformatting the answers it receives from the MDM in s RESTful manner, back to a REST API.
+The Gateway is stateless. It requires the MDM username and password for the login requests.
+The login returns a token in the response, that is used for later authentication for other requests.
+
+The token is valid for 8 hours from the time it was created, unless there has been no activity
+for 10 minutes, of if the client has sent a logout request.
+
+General URI:
+- /api/login
+- /api/logout
+- /api/version
+- /api/instances/ // GET all instances
+- /api/types/{type}/instances // POST (create) / GET all objects for a given type
+- /api/instances/{type::id} // GET by ID
+- /api/instances/{type::id}/relationships/{Relationship name} // GET
+- /api/instances/querySelectedStatistics // POST Query selected statistics
+- /api/instances/{type::id}/action/{actionName} // POST a special action on an object
+- /api/types/{type}/instances/action/{actionName} // POST a special action on a given type
+
+Types:
+- System
+- Sds
+- StoragePool
+- ProtectionDomain
+- Device
+- Volume
+- VTree
+- Sdc
+- User
+- FaultSet
+- RfcacheDevice
+- Alerts
+
+Actions:
+- querySelectedStatistics // All types except Alarm and User
+- querySystemLimits // System
+- queryDisconnectedSdss // Sds
+- querySdsNetworkLatencyMeters // Sds
+- queryFailedDevices" // Device. Note: works strange!
+
+Relationships:
+- Statistics // All types except Alarm and User
+- ProtectionDomain // System
+- Sdc // System
+- User // System
+- StoragePool // ProtectionDomain
+- FaultSet // ProtectionDomain
+- Sds // ProtectionDomain
+- RfcacheDevice // Sds
+- Device // Sds, StoragePool
+- Volume // Sdc, StoragePool
+- VTree // StoragePool
+*/
+
+// New creates new ScaleIO client.
+func New(client web.Client, request web.Request) (*Client, error) {
+ httpClient, err := web.NewHTTPClient(client)
+ if err != nil {
+ return nil, err
+ }
+ return &Client{
+ Request: request,
+ httpClient: httpClient,
+ token: newToken(),
+ }, nil
+}
+
+// Client represents ScaleIO client.
+type Client struct {
+ Request web.Request
+ httpClient *http.Client
+ token *token
+}
+
+// LoggedIn reports whether the client is logged in.
+func (c Client) LoggedIn() bool {
+ return c.token.isSet()
+}
+
+// Login connects to FxFlex Gateway to get the token that is used for later authentication for other requests.
+func (c *Client) Login() error {
+ if c.LoggedIn() {
+ _ = c.Logout()
+ }
+ req := c.createLoginRequest()
+ resp, err := c.doOK(req)
+ defer closeBody(resp)
+ if err != nil {
+ return err
+ }
+
+ token, err := decodeToken(resp.Body)
+ if err != nil {
+ return err
+ }
+
+ c.token.set(token)
+ return nil
+}
+
+// Logout sends logout request and unsets token.
+func (c *Client) Logout() error {
+ if !c.LoggedIn() {
+ return nil
+ }
+ req := c.createLogoutRequest()
+ c.token.unset()
+
+ resp, err := c.do(req)
+ defer closeBody(resp)
+ return err
+}
+
+// APIVersion returns FxFlex Gateway API version.
+func (c *Client) APIVersion() (Version, error) {
+ req := c.createAPIVersionRequest()
+ resp, err := c.doOK(req)
+ defer closeBody(resp)
+ if err != nil {
+ return Version{}, err
+ }
+ return decodeVersion(resp.Body)
+}
+
+// SelectedStatistics returns selected statistics.
+func (c *Client) SelectedStatistics(query SelectedStatisticsQuery) (SelectedStatistics, error) {
+ b, _ := json.Marshal(query)
+ req := c.createSelectedStatisticsRequest(b)
+ var stats SelectedStatistics
+ err := c.doJSONWithRetry(&stats, req)
+ return stats, err
+}
+
+// Instances returns all instances.
+func (c *Client) Instances() (Instances, error) {
+ req := c.createInstancesRequest()
+ var instances Instances
+ err := c.doJSONWithRetry(&instances, req)
+ return instances, err
+}
+
+func (c Client) createLoginRequest() web.Request {
+ req := c.Request.Copy()
+ u, _ := url.Parse(req.URL)
+ u.Path = path.Join(u.Path, "/api/login")
+ req.URL = u.String()
+ return req
+}
+
+func (c Client) createLogoutRequest() web.Request {
+ req := c.Request.Copy()
+ u, _ := url.Parse(req.URL)
+ u.Path = path.Join(u.Path, "/api/logout")
+ req.URL = u.String()
+ req.Password = c.token.get()
+ return req
+}
+
+func (c Client) createAPIVersionRequest() web.Request {
+ req := c.Request.Copy()
+ u, _ := url.Parse(req.URL)
+ u.Path = path.Join(u.Path, "/api/version")
+ req.URL = u.String()
+ req.Password = c.token.get()
+ return req
+}
+
+func (c Client) createSelectedStatisticsRequest(query []byte) web.Request {
+ req := c.Request.Copy()
+ u, _ := url.Parse(req.URL)
+ u.Path = path.Join(u.Path, "/api/instances/querySelectedStatistics")
+ req.URL = u.String()
+ req.Password = c.token.get()
+ req.Method = http.MethodPost
+ req.Headers = map[string]string{
+ "Content-Type": "application/json",
+ }
+ req.Body = string(query)
+ return req
+}
+
+func (c Client) createInstancesRequest() web.Request {
+ req := c.Request.Copy()
+ u, _ := url.Parse(req.URL)
+ u.Path = path.Join(u.Path, "/api/instances")
+ req.URL = u.String()
+ req.Password = c.token.get()
+ return req
+}
+
+func (c *Client) do(req web.Request) (*http.Response, error) {
+ httpReq, err := web.NewHTTPRequest(req)
+ if err != nil {
+ return nil, fmt.Errorf("error on creating http request to %s: %v", req.URL, err)
+ }
+ return c.httpClient.Do(httpReq)
+}
+
+func (c *Client) doOK(req web.Request) (*http.Response, error) {
+ resp, err := c.do(req)
+ if err != nil {
+ return nil, err
+ }
+ if err = checkStatusCode(resp); err != nil {
+ err = fmt.Errorf("%s returned %v", req.URL, err)
+ }
+ return resp, err
+}
+
+func (c *Client) doOKWithRetry(req web.Request) (*http.Response, error) {
+ resp, err := c.do(req)
+ if err != nil {
+ return nil, err
+ }
+ if resp.StatusCode == http.StatusUnauthorized {
+ if err = c.Login(); err != nil {
+ return resp, err
+ }
+ req.Password = c.token.get()
+ return c.doOK(req)
+ }
+ if err = checkStatusCode(resp); err != nil {
+ err = fmt.Errorf("%s returned %v", req.URL, err)
+ }
+ return resp, err
+}
+
+func (c *Client) doJSONWithRetry(dst interface{}, req web.Request) error {
+ resp, err := c.doOKWithRetry(req)
+ defer closeBody(resp)
+ if err != nil {
+ return err
+ }
+ return json.NewDecoder(resp.Body).Decode(dst)
+}
+
+func closeBody(resp *http.Response) {
+ if resp != nil && resp.Body != nil {
+ _, _ = io.Copy(io.Discard, resp.Body)
+ _ = resp.Body.Close()
+ }
+}
+
+func checkStatusCode(resp *http.Response) error {
+ // For all 4xx and 5xx return codes, the body may contain an apiError
+ // instance with more specifics about the failure.
+ if resp.StatusCode >= 400 {
+ e := error(&apiError{})
+ if err := json.NewDecoder(resp.Body).Decode(e); err != nil {
+ e = err
+ }
+ return fmt.Errorf("HTTP status code %d : %v", resp.StatusCode, e)
+ }
+
+ // 200(OK), 201(Created), 202(Accepted), 204 (No Content).
+ if resp.StatusCode < 200 || resp.StatusCode > 299 {
+ return fmt.Errorf("HTTP status code %d", resp.StatusCode)
+ }
+ return nil
+}
+
+func decodeVersion(reader io.Reader) (ver Version, err error) {
+ bs, err := io.ReadAll(reader)
+ if err != nil {
+ return ver, err
+ }
+ parts := strings.Split(strings.Trim(string(bs), "\n "), ".")
+ if len(parts) != 2 {
+ return ver, fmt.Errorf("can't parse: %s", string(bs))
+ }
+ if ver.Major, err = strconv.ParseInt(parts[0], 10, 64); err != nil {
+ return ver, err
+ }
+ ver.Minor, err = strconv.ParseInt(parts[1], 10, 64)
+ return ver, err
+}
+
+func decodeToken(reader io.Reader) (string, error) {
+ bs, err := io.ReadAll(reader)
+ if err != nil {
+ return "", err
+ }
+ return strings.Trim(string(bs), `"`), nil
+}
+
+type token struct {
+ mux *sync.RWMutex
+ value string
+}
+
+func newToken() *token { return &token{mux: &sync.RWMutex{}} }
+func (t *token) get() string { t.mux.RLock(); defer t.mux.RUnlock(); return t.value }
+func (t *token) set(v string) { t.mux.Lock(); defer t.mux.Unlock(); t.value = v }
+func (t *token) unset() { t.set("") }
+func (t *token) isSet() bool { return t.get() != "" }
diff --git a/src/go/collectors/go.d.plugin/modules/scaleio/client/client_test.go b/src/go/collectors/go.d.plugin/modules/scaleio/client/client_test.go
new file mode 100644
index 000000000..ea82814c2
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/scaleio/client/client_test.go
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package client
+
+import (
+ "net/http/httptest"
+ "testing"
+
+ "github.com/netdata/netdata/go/go.d.plugin/pkg/web"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestNew(t *testing.T) {
+ _, err := New(web.Client{}, web.Request{})
+ assert.NoError(t, err)
+}
+
+func TestClient_Login(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ assert.NoError(t, client.Login())
+ assert.Equal(t, testToken, client.token.get())
+}
+
+func TestClient_Logout(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ require.NoError(t, client.Login())
+
+ assert.NoError(t, client.Logout())
+ assert.False(t, client.token.isSet())
+
+}
+
+func TestClient_LoggedIn(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ assert.False(t, client.LoggedIn())
+ assert.NoError(t, client.Login())
+ assert.True(t, client.LoggedIn())
+}
+
+func TestClient_APIVersion(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ err := client.Login()
+ require.NoError(t, err)
+
+ version, err := client.APIVersion()
+ assert.NoError(t, err)
+ assert.Equal(t, Version{Major: 2, Minor: 5}, version)
+}
+
+func TestClient_Instances(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ err := client.Login()
+ require.NoError(t, err)
+
+ instances, err := client.Instances()
+ assert.NoError(t, err)
+ assert.Equal(t, testInstances, instances)
+}
+
+func TestClient_Instances_RetryOnExpiredToken(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ instances, err := client.Instances()
+ assert.NoError(t, err)
+ assert.Equal(t, testInstances, instances)
+}
+
+func TestClient_SelectedStatistics(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ err := client.Login()
+ require.NoError(t, err)
+
+ stats, err := client.SelectedStatistics(SelectedStatisticsQuery{})
+ assert.NoError(t, err)
+ assert.Equal(t, testStatistics, stats)
+}
+
+func TestClient_SelectedStatistics_RetryOnExpiredToken(t *testing.T) {
+ srv, client := prepareSrvClient(t)
+ defer srv.Close()
+
+ stats, err := client.SelectedStatistics(SelectedStatisticsQuery{})
+ assert.Equal(t, testStatistics, stats)
+ assert.NoError(t, err)
+ assert.Equal(t, testStatistics, stats)
+}
+
+func prepareSrvClient(t *testing.T) (*httptest.Server, *Client) {
+ t.Helper()
+ srv := httptest.NewServer(MockScaleIOAPIServer{
+ User: testUser,
+ Password: testPassword,
+ Version: testVersion,
+ Token: testToken,
+ Instances: testInstances,
+ Statistics: testStatistics,
+ })
+ client, err := New(web.Client{}, web.Request{
+ URL: srv.URL,
+ Username: testUser,
+ Password: testPassword,
+ })
+ assert.NoError(t, err)
+ return srv, client
+}
+
+var (
+ testUser = "user"
+ testPassword = "password"
+ testVersion = "2.5"
+ testToken = "token"
+ testInstances = Instances{
+ StoragePoolList: []StoragePool{
+ {ID: "id1", Name: "Marketing", SparePercentage: 10},
+ {ID: "id2", Name: "Finance", SparePercentage: 10},
+ },
+ SdcList: []Sdc{
+ {ID: "id1", SdcIp: "10.0.0.1", MdmConnectionState: "Connected"},
+ {ID: "id2", SdcIp: "10.0.0.2", MdmConnectionState: "Connected"},
+ },
+ }
+ testStatistics = SelectedStatistics{
+ System: SystemStatistics{NumOfDevices: 1},
+ Sdc: map[string]SdcStatistics{"id1": {}, "id2": {}},
+ StoragePool: map[string]StoragePoolStatistics{"id1": {}, "id2": {}},
+ }
+)
diff --git a/src/go/collectors/go.d.plugin/modules/scaleio/client/server.go b/src/go/collectors/go.d.plugin/modules/scaleio/client/server.go
new file mode 100644
index 000000000..b7269d339
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/scaleio/client/server.go
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package client
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+)
+
+// MockScaleIOAPIServer represents VxFlex OS Gateway.
+type MockScaleIOAPIServer struct {
+ User string
+ Password string
+ Token string
+ Version string
+ Instances Instances
+ Statistics SelectedStatistics
+}
+
+func (s MockScaleIOAPIServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ default:
+ w.WriteHeader(http.StatusNotFound)
+ msg := fmt.Sprintf("unknown URL path: %s", r.URL.Path)
+ writeAPIError(w, msg)
+ case "/api/login":
+ s.handleLogin(w, r)
+ case "/api/logout":
+ s.handleLogout(w, r)
+ case "/api/version":
+ s.handleVersion(w, r)
+ case "/api/instances":
+ s.handleInstances(w, r)
+ case "/api/instances/querySelectedStatistics":
+ s.handleQuerySelectedStatistics(w, r)
+ }
+}
+
+func (s MockScaleIOAPIServer) handleLogin(w http.ResponseWriter, r *http.Request) {
+ if user, pass, ok := r.BasicAuth(); !ok || user != s.User || pass != s.Password {
+ w.WriteHeader(http.StatusUnauthorized)
+ msg := fmt.Sprintf("user got/expected: %s/%s, pass got/expected: %s/%s", user, s.User, pass, s.Password)
+ writeAPIError(w, msg)
+ return
+ }
+ if r.Method != http.MethodGet {
+ w.WriteHeader(http.StatusBadRequest)
+ msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet)
+ writeAPIError(w, msg)
+ return
+ }
+ _, _ = w.Write([]byte(s.Token))
+}
+
+func (s MockScaleIOAPIServer) handleLogout(w http.ResponseWriter, r *http.Request) {
+ if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token {
+ w.WriteHeader(http.StatusUnauthorized)
+ msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token)
+ writeAPIError(w, msg)
+ return
+ }
+ if r.Method != http.MethodGet {
+ w.WriteHeader(http.StatusBadRequest)
+ msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet)
+ writeAPIError(w, msg)
+ return
+ }
+}
+
+func (s MockScaleIOAPIServer) handleVersion(w http.ResponseWriter, r *http.Request) {
+ if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token {
+ w.WriteHeader(http.StatusUnauthorized)
+ msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token)
+ writeAPIError(w, msg)
+ return
+ }
+ if r.Method != http.MethodGet {
+ w.WriteHeader(http.StatusBadRequest)
+ msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet)
+ writeAPIError(w, msg)
+ return
+ }
+ _, _ = w.Write([]byte(s.Version))
+}
+
+func (s MockScaleIOAPIServer) handleInstances(w http.ResponseWriter, r *http.Request) {
+ if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token {
+ w.WriteHeader(http.StatusUnauthorized)
+ msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token)
+ writeAPIError(w, msg)
+ return
+ }
+ if r.Method != http.MethodGet {
+ w.WriteHeader(http.StatusBadRequest)
+ msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet)
+ writeAPIError(w, msg)
+ return
+ }
+ b, err := json.Marshal(s.Instances)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ msg := fmt.Sprintf("marshal Instances: %v", err)
+ writeAPIError(w, msg)
+ return
+ }
+ _, _ = w.Write(b)
+}
+
+func (s MockScaleIOAPIServer) handleQuerySelectedStatistics(w http.ResponseWriter, r *http.Request) {
+ if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token {
+ w.WriteHeader(http.StatusUnauthorized)
+ msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token)
+ writeAPIError(w, msg)
+ return
+ }
+ if r.Method != http.MethodPost {
+ w.WriteHeader(http.StatusBadRequest)
+ msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodPost)
+ writeAPIError(w, msg)
+ return
+ }
+ if r.Header.Get("Content-Type") != "application/json" {
+ w.WriteHeader(http.StatusBadRequest)
+ writeAPIError(w, "no \"Content-Type: application/json\" in the header")
+ return
+ }
+ if err := json.NewDecoder(r.Body).Decode(&SelectedStatisticsQuery{}); err != nil {
+ w.WriteHeader(http.StatusBadRequest)
+ msg := fmt.Sprintf("body decode error: %v", err)
+ writeAPIError(w, msg)
+ return
+ }
+ b, err := json.Marshal(s.Statistics)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ msg := fmt.Sprintf("marshal SelectedStatistics: %v", err)
+ writeAPIError(w, msg)
+ return
+ }
+ _, _ = w.Write(b)
+}
+
+func writeAPIError(w io.Writer, msg string) {
+ err := apiError{Message: msg}
+ b, _ := json.Marshal(err)
+ _, _ = w.Write(b)
+}
diff --git a/src/go/collectors/go.d.plugin/modules/scaleio/client/types.go b/src/go/collectors/go.d.plugin/modules/scaleio/client/types.go
new file mode 100644
index 000000000..c85bddf8d
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/scaleio/client/types.go
@@ -0,0 +1,1096 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package client
+
+// https://github.com/dell/goscaleio/blob/master/types/v1/types.go
+
+// For all 4xx and 5xx return codes, the body may contain an apiError instance
+// with more specifics about the failure.
+type apiError struct {
+ Message string
+ HTTPStatusCode int
+ ErrorCode int
+}
+
+func (e apiError) Error() string {
+ return e.Message
+}
+
+// Version represents API version.
+type Version struct {
+ Major int64
+ Minor int64
+}
+
+// Bwc Bwc.
+type Bwc struct {
+ NumOccured int64
+ NumSeconds int64
+ TotalWeightInKb int64
+}
+
+// Sdc represents ScaleIO Data Client.
+type Sdc struct {
+ ID string
+ SdcIp string
+ MdmConnectionState string
+}
+
+// StoragePool represents ScaleIO Storage Pool.
+type StoragePool struct {
+ ID string
+ Name string
+ SparePercentage int64
+ CapacityAlertCriticalThreshold int64
+ CapacityAlertHighThreshold int64
+}
+
+// Instances represents '/api/instances' response.
+type Instances struct {
+ StoragePoolList []StoragePool
+ SdcList []Sdc
+}
+
+type (
+ // SelectedStatisticsQuery represents '/api/instances/querySelectedStatistics' query.
+ SelectedStatisticsQuery struct {
+ List []SelectedObject `json:"selectedStatisticsList"`
+ }
+ // SelectedObject represents '/api/instances/querySelectedStatistics' query object.
+ SelectedObject struct {
+ Type string `json:"type"` // object type (System, ProtectionDomain, Sds, StoragePool, Device, Volume, VTree, Sdc, FaultSet, RfcacheDevice).
+
+ // the following parameters are not relevant to the System type and can be omitted:
+ IDs []string `json:"ids,omitempty"` // list of objects ids
+ AllIDs allIds `json:"allIds,omitempty"` // all available objects
+
+ Properties []string `json:"properties"` // list of properties to fetch
+ }
+ allIds bool
+)
+
+func (b allIds) MarshalJSON() ([]byte, error) {
+ // should be set to empty value if AllIDs is true.
+ if b {
+ return []byte("[]"), nil
+ }
+ return nil, nil
+}
+func (b *allIds) UnmarshalJSON([]byte) error {
+ *b = true
+ return nil
+}
+
+// SelectedStatistics represents '/api/instances/querySelectedStatistics' response.
+type SelectedStatistics struct {
+ System SystemStatistics
+ Sdc map[string]SdcStatistics
+ StoragePool map[string]StoragePoolStatistics
+}
+
+// Those commented out structure fields are not deleted on purpose. We need them to see what other metrics can be collected.
+type (
+ // CapacityStatistics is System/StoragePool capacity statistics.
+ CapacityStatistics struct {
+ CapacityAvailableForVolumeAllocationInKb int64
+ MaxCapacityInKb int64
+ CapacityLimitInKb int64
+ ProtectedCapacityInKb int64
+ DegradedFailedCapacityInKb int64
+ DegradedHealthyCapacityInKb int64
+ SpareCapacityInKb int64
+ FailedCapacityInKb int64
+ UnreachableUnusedCapacityInKb int64
+ InMaintenanceCapacityInKb int64
+ ThinCapacityAllocatedInKb int64
+ ThinCapacityInUseInKb int64
+ ThickCapacityInUseInKb int64
+ SnapCapacityInUseOccupiedInKb int64
+ CapacityInUseInKb int64
+ }
+ SystemStatistics struct {
+ CapacityStatistics
+
+ NumOfDevices int64
+ NumOfFaultSets int64
+ NumOfProtectionDomains int64
+ NumOfRfcacheDevices int64
+ NumOfSdc int64
+ NumOfSds int64
+ NumOfSnapshots int64
+ NumOfStoragePools int64
+ NumOfVolumes int64
+ NumOfVtrees int64
+ NumOfThickBaseVolumes int64
+ NumOfThinBaseVolumes int64
+ NumOfMappedToAllVolumes int64
+ NumOfUnmappedVolumes int64
+
+ RebalanceReadBwc Bwc
+ RebalanceWriteBwc Bwc
+ PendingRebalanceCapacityInKb int64
+
+ PendingNormRebuildCapacityInKb int64
+ PendingBckRebuildCapacityInKb int64
+ PendingFwdRebuildCapacityInKb int64
+ NormRebuildReadBwc Bwc // TODO: ???
+ NormRebuildWriteBwc Bwc // TODO: ???
+ BckRebuildReadBwc Bwc // failed node/disk is back alive
+ BckRebuildWriteBwc Bwc // failed node/disk is back alive
+ FwdRebuildReadBwc Bwc // node/disk fails
+ FwdRebuildWriteBwc Bwc // node/disk fails
+
+ PrimaryReadBwc Bwc // Backend (SDSs + Devices) Primary - Mater MDM
+ PrimaryWriteBwc Bwc // Backend (SDSs + Devices) Primary - Mater MDM
+ SecondaryReadBwc Bwc // Backend (SDSs + Devices, 2nd) Secondary - Slave MDM
+ SecondaryWriteBwc Bwc // Backend (SDSs + Devices, 2nd) Secondary - Slave MDM
+ UserDataReadBwc Bwc // Frontend (Volumes + SDCs)
+ UserDataWriteBwc Bwc // Frontend (Volumes + SDCs)
+ TotalReadBwc Bwc // *ReadBwc
+ TotalWriteBwc Bwc // *WriteBwc
+
+ //SnapCapacityInUseInKb int64
+ //BackgroundScanCompareCount int64
+ //BackgroundScannedInMB int64
+ //ActiveBckRebuildCapacityInKb int64
+ //ActiveFwdRebuildCapacityInKb int64
+ //ActiveMovingCapacityInKb int64
+ //ActiveMovingInBckRebuildJobs int64
+ //ActiveMovingInFwdRebuildJobs int64
+ //ActiveMovingInNormRebuildJobs int64
+ //ActiveMovingInRebalanceJobs int64
+ //ActiveMovingOutBckRebuildJobs int64
+ //ActiveMovingOutFwdRebuildJobs int64
+ //ActiveMovingOutNormRebuildJobs int64
+ //ActiveMovingRebalanceJobs int64
+ //ActiveNormRebuildCapacityInKb int64
+ //ActiveRebalanceCapacityInKb int64
+ //AtRestCapacityInKb int64
+ //BckRebuildCapacityInKb int64
+ //DegradedFailedVacInKb int64
+ //DegradedHealthyVacInKb int64
+ //FailedVacInKb int64
+ //FixedReadErrorCount int64
+ //FwdRebuildCapacityInKb int64
+ //InMaintenanceVacInKb int64
+ //InUseVacInKb int64
+ //MovingCapacityInKb int64
+ //NormRebuildCapacityInKb int64
+ //NumOfScsiInitiators int64 // removed from version 3 of ScaleIO/VxFlex API
+ //PendingMovingCapacityInKb int64
+ //PendingMovingInBckRebuildJobs int64
+ //PendingMovingInFwdRebuildJobs int64
+ //PendingMovingInNormRebuildJobs int64
+ //PendingMovingInRebalanceJobs int64
+ //PendingMovingOutBckRebuildJobs int64
+ //PendingMovingOutFwdRebuildJobs int64
+ //PendingMovingOutNormrebuildJobs int64
+ //PendingMovingRebalanceJobs int64
+ //PrimaryReadFromDevBwc int64
+ //PrimaryReadFromRmcacheBwc int64
+ //PrimaryVacInKb int64
+ //ProtectedVacInKb int64
+ //ProtectionDomainIds int64
+ //RebalanceCapacityInKb int64
+ //RebalancePerReceiveJobNetThrottlingInKbps int64
+ //RebalanceWaitSendQLength int64
+ //RebuildPerReceiveJobNetThrottlingInKbps int64
+ //RebuildWaitSendQLength int64
+ //RfacheReadHit int64
+ //RfacheWriteHit int64
+ //RfcacheAvgReadTime int64
+ //RfcacheAvgWriteTime int64
+ //RfcacheFdAvgReadTime int64
+ //RfcacheFdAvgWriteTime int64
+ //RfcacheFdCacheOverloaded int64
+ //RfcacheFdInlightReads int64
+ //RfcacheFdInlightWrites int64
+ //RfcacheFdIoErrors int64
+ //RfcacheFdMonitorErrorStuckIo int64
+ //RfcacheFdReadTimeGreater1Min int64
+ //RfcacheFdReadTimeGreater1Sec int64
+ //RfcacheFdReadTimeGreater500Millis int64
+ //RfcacheFdReadTimeGreater5Sec int64
+ //RfcacheFdReadsReceived int64
+ //RfcacheFdWriteTimeGreater1Min int64
+ //RfcacheFdWriteTimeGreater1Sec int64
+ //RfcacheFdWriteTimeGreater500Millis int64
+ //RfcacheFdWriteTimeGreater5Sec int64
+ //RfcacheFdWritesReceived int64
+ //RfcacheIoErrors int64
+ //RfcacheIosOutstanding int64
+ //RfcacheIosSkipped int64
+ //RfcachePooIosOutstanding int64
+ //RfcachePoolCachePages int64
+ //RfcachePoolEvictions int64
+ //RfcachePoolInLowMemoryCondition int64
+ //RfcachePoolIoTimeGreater1Min int64
+ //RfcachePoolLockTimeGreater1Sec int64
+ //RfcachePoolLowResourcesInitiatedPassthroughMode int64
+ //RfcachePoolNumCacheDevs int64
+ //RfcachePoolNumSrcDevs int64
+ //RfcachePoolPagesInuse int64
+ //RfcachePoolReadHit int64
+ //RfcachePoolReadMiss int64
+ //RfcachePoolReadPendingG10Millis int64
+ //RfcachePoolReadPendingG1Millis int64
+ //RfcachePoolReadPendingG1Sec int64
+ //RfcachePoolReadPendingG500Micro int64
+ //RfcachePoolReadsPending int64
+ //RfcachePoolSize int64
+ //RfcachePoolSourceIdMismatch int64
+ //RfcachePoolSuspendedIos int64
+ //RfcachePoolSuspendedPequestsRedundantSearchs int64
+ //RfcachePoolWriteHit int64
+ //RfcachePoolWriteMiss int64
+ //RfcachePoolWritePending int64
+ //RfcachePoolWritePendingG10Millis int64
+ //RfcachePoolWritePendingG1Millis int64
+ //RfcachePoolWritePendingG1Sec int64
+ //RfcachePoolWritePendingG500Micro int64
+ //RfcacheReadMiss int64
+ //RfcacheReadsFromCache int64
+ //RfcacheReadsPending int64
+ //RfcacheReadsReceived int64
+ //RfcacheReadsSkipped int64
+ //RfcacheReadsSkippedAlignedSizeTooLarge int64
+ //RfcacheReadsSkippedHeavyLoad int64
+ //RfcacheReadsSkippedInternalError int64
+ //RfcacheReadsSkippedLockIos int64
+ //RfcacheReadsSkippedLowResources int64
+ //RfcacheReadsSkippedMaxIoSize int64
+ //RfcacheReadsSkippedStuckIo int64
+ //RfcacheSkippedUnlinedWrite int64
+ //RfcacheSourceDeviceReads int64
+ //RfcacheSourceDeviceWrites int64
+ //RfcacheWriteMiss int64
+ //RfcacheWritePending int64
+ //RfcacheWritesReceived int64
+ //RfcacheWritesSkippedCacheMiss int64
+ //RfcacheWritesSkippedHeavyLoad int64
+ //RfcacheWritesSkippedInternalError int64
+ //RfcacheWritesSkippedLowResources int64
+ //RfcacheWritesSkippedMaxIoSize int64
+ //RfcacheWritesSkippedStuckIo int64
+ //RmPendingAllocatedInKb int64
+ //Rmcache128kbEntryCount int64
+ //Rmcache16kbEntryCount int64
+ //Rmcache32kbEntryCount int64
+ //Rmcache4kbEntryCount int64
+ //Rmcache64kbEntryCount int64
+ //Rmcache8kbEntryCount int64
+ //RmcacheBigBlockEvictionCount int64
+ //RmcacheBigBlockEvictionSizeCountInKb int64
+ //RmcacheCurrNumOf128kbEntries int64
+ //RmcacheCurrNumOf16kbEntries int64
+ //RmcacheCurrNumOf32kbEntries int64
+ //RmcacheCurrNumOf4kbEntries int64
+ //RmcacheCurrNumOf64kbEntries int64
+ //RmcacheCurrNumOf8kbEntries int64
+ //RmcacheEntryEvictionCount int64
+ //RmcacheEntryEvictionSizeCountInKb int64
+ //RmcacheNoEvictionCount int64
+ //RmcacheSizeInKb int64
+ //RmcacheSizeInUseInKb int64
+ //RmcacheSkipCountCacheAllBusy int64
+ //RmcacheSkipCountLargeIo int64
+ //RmcacheSkipCountUnaligned4kbIo int64
+ //ScsiInitiatorIds int64
+ //SdcIds int64
+ //SecondaryReadFromDevBwc int64
+ //SecondaryReadFromRmcacheBwc int64
+ //SecondaryVacInKb int64
+ //SemiProtectedCapacityInKb int64
+ //SemiProtectedVacInKb int64
+ //SnapCapacityInUseOccupiedInKb int64
+ //UnusedCapacityInKb int64
+ }
+ SdcStatistics struct {
+ NumOfMappedVolumes int64
+ UserDataReadBwc Bwc
+ UserDataWriteBwc Bwc
+ //VolumeIds int64
+ }
+ StoragePoolStatistics struct {
+ CapacityStatistics
+
+ NumOfDevices int64
+ NumOfVolumes int64
+ NumOfVtrees int64
+ NumOfSnapshots int64
+
+ //SnapCapacityInUseInKb int64
+ //BackgroundScanCompareCount int64
+ //BackgroundScannedInMB int64
+ //ActiveBckRebuildCapacityInKb int64
+ //ActiveFwdRebuildCapacityInKb int64
+ //ActiveMovingCapacityInKb int64
+ //ActiveMovingInBckRebuildJobs int64
+ //ActiveMovingInFwdRebuildJobs int64
+ //ActiveMovingInNormRebuildJobs int64
+ //ActiveMovingInRebalanceJobs int64
+ //ActiveMovingOutBckRebuildJobs int64
+ //ActiveMovingOutFwdRebuildJobs int64
+ //ActiveMovingOutNormRebuildJobs int64
+ //ActiveMovingRebalanceJobs int64
+ //ActiveNormRebuildCapacityInKb int64
+ //ActiveRebalanceCapacityInKb int64
+ //AtRestCapacityInKb int64
+ //BckRebuildCapacityInKb int64
+ //BckRebuildReadBwc int64
+ //BckRebuildWriteBwc int64
+ //DegradedFailedVacInKb int64
+ //DegradedHealthyVacInKb int64
+ //DeviceIds int64
+ //FailedVacInKb int64
+ //FixedReadErrorCount int64
+ //FwdRebuildCapacityInKb int64
+ //FwdRebuildReadBwc int64
+ //FwdRebuildWriteBwc int64
+ //InMaintenanceVacInKb int64
+ //InUseVacInKb int64
+ //MovingCapacityInKb int64
+ //NormRebuildCapacityInKb int64
+ //NormRebuildReadBwc int64
+ //NormRebuildWriteBwc int64
+ //NumOfMappedToAllVolumes int64
+ //NumOfThickBaseVolumes int64
+ //NumOfThinBaseVolumes int64
+ //NumOfUnmappedVolumes int64
+ //NumOfVolumesInDeletion int64
+ //PendingBckRebuildCapacityInKb int64
+ //PendingFwdRebuildCapacityInKb int64
+ //PendingMovingCapacityInKb int64
+ //PendingMovingInBckRebuildJobs int64
+ //PendingMovingInFwdRebuildJobs int64
+ //PendingMovingInNormRebuildJobs int64
+ //PendingMovingInRebalanceJobs int64
+ //PendingMovingOutBckRebuildJobs int64
+ //PendingMovingOutFwdRebuildJobs int64
+ //PendingMovingOutNormrebuildJobs int64
+ //PendingMovingRebalanceJobs int64
+ //PendingNormRebuildCapacityInKb int64
+ //PendingRebalanceCapacityInKb int64
+ //PrimaryReadBwc int64
+ //PrimaryReadFromDevBwc int64
+ //PrimaryReadFromRmcacheBwc int64
+ //PrimaryVacInKb int64
+ //PrimaryWriteBwc int64
+ //ProtectedVacInKb int64
+ //RebalanceCapacityInKb int64
+ //RebalanceReadBwc int64
+ //RebalanceWriteBwc int64
+ //RfacheReadHit int64
+ //RfacheWriteHit int64
+ //RfcacheAvgReadTime int64
+ //RfcacheAvgWriteTime int64
+ //RfcacheIoErrors int64
+ //RfcacheIosOutstanding int64
+ //RfcacheIosSkipped int64
+ //RfcacheReadMiss int64
+ //RfcacheReadsFromCache int64
+ //RfcacheReadsPending int64
+ //RfcacheReadsReceived int64
+ //RfcacheReadsSkipped int64
+ //RfcacheReadsSkippedAlignedSizeTooLarge int64
+ //RfcacheReadsSkippedHeavyLoad int64
+ //RfcacheReadsSkippedInternalError int64
+ //RfcacheReadsSkippedLockIos int64
+ //RfcacheReadsSkippedLowResources int64
+ //RfcacheReadsSkippedMaxIoSize int64
+ //RfcacheReadsSkippedStuckIo int64
+ //RfcacheSkippedUnlinedWrite int64
+ //RfcacheSourceDeviceReads int64
+ //RfcacheSourceDeviceWrites int64
+ //RfcacheWriteMiss int64
+ //RfcacheWritePending int64
+ //RfcacheWritesReceived int64
+ //RfcacheWritesSkippedCacheMiss int64
+ //RfcacheWritesSkippedHeavyLoad int64
+ //RfcacheWritesSkippedInternalError int64
+ //RfcacheWritesSkippedLowResources int64
+ //RfcacheWritesSkippedMaxIoSize int64
+ //RfcacheWritesSkippedStuckIo int64
+ //RmPendingAllocatedInKb int64
+ //SecondaryReadBwc int64
+ //SecondaryReadFromDevBwc int64
+ //SecondaryReadFromRmcacheBwc int64
+ //SecondaryVacInKb int64
+ //SecondaryWriteBwc int64
+ //SemiProtectedCapacityInKb int64
+ //SemiProtectedVacInKb int64
+ //SnapCapacityInUseOccupiedInKb int64
+ //TotalReadBwc int64
+ //TotalWriteBwc int64
+ //UnusedCapacityInKb int64
+ //UserDataReadBwc int64
+ //UserDataWriteBwc int64
+ //VolumeIds int64
+ //VtreeIds int64
+ }
+ DeviceStatistic struct {
+ // BackgroundScanCompareCount int64
+ // BackgroundScannedInMB int64
+ // ActiveMovingInBckRebuildJobs int64
+ // ActiveMovingInFwdRebuildJobs int64
+ // ActiveMovingInNormRebuildJobs int64
+ // ActiveMovingInRebalanceJobs int64
+ // ActiveMovingOutBckRebuildJobs int64
+ // ActiveMovingOutFwdRebuildJobs int64
+ // ActiveMovingOutNormRebuildJobs int64
+ // ActiveMovingRebalanceJobs int64
+ // AvgReadLatencyInMicrosec int64
+ // AvgReadSizeInBytes int64
+ // AvgWriteLatencyInMicrosec int64
+ // AvgWriteSizeInBytes int64
+ // BckRebuildReadBwc int64
+ // BckRebuildWriteBwc int64
+ // CapacityInUseInKb int64
+ // CapacityLimitInKb int64
+ // DegradedFailedVacInKb int64
+ // DegradedHealthyVacInKb int64
+ // FailedVacInKb int64
+ // FixedReadErrorCount int64
+ // FwdRebuildReadBwc int64
+ // FwdRebuildWriteBwc int64
+ // InMaintenanceVacInKb int64
+ // InUseVacInKb int64
+ // MaxCapacityInKb int64
+ // NormRebuildReadBwc int64
+ // NormRebuildWriteBwc int64
+ // PendingMovingInBckRebuildJobs int64
+ // PendingMovingInFwdRebuildJobs int64
+ // PendingMovingInNormRebuildJobs int64
+ // PendingMovingInRebalanceJobs int64
+ // PendingMovingOutBckRebuildJobs int64
+ // PendingMovingOutFwdRebuildJobs int64
+ // PendingMovingOutNormrebuildJobs int64
+ // PendingMovingRebalanceJobs int64
+ // PrimaryReadBwc int64
+ // PrimaryReadFromDevBwc int64
+ // PrimaryReadFromRmcacheBwc int64
+ // PrimaryVacInKb int64
+ // PrimaryWriteBwc int64
+ // ProtectedVacInKb int64
+ // RebalanceReadBwc int64
+ // RebalanceWriteBwc int64
+ // RfacheReadHit int64
+ // RfacheWriteHit int64
+ // RfcacheAvgReadTime int64
+ // RfcacheAvgWriteTime int64
+ // RfcacheIoErrors int64
+ // RfcacheIosOutstanding int64
+ // RfcacheIosSkipped int64
+ // RfcacheReadMiss int64
+ // RfcacheReadsFromCache int64
+ // RfcacheReadsPending int64
+ // RfcacheReadsReceived int64
+ // RfcacheReadsSkipped int64
+ // RfcacheReadsSkippedAlignedSizeTooLarge int64
+ // RfcacheReadsSkippedHeavyLoad int64
+ // RfcacheReadsSkippedInternalError int64
+ // RfcacheReadsSkippedLockIos int64
+ // RfcacheReadsSkippedLowResources int64
+ // RfcacheReadsSkippedMaxIoSize int64
+ // RfcacheReadsSkippedStuckIo int64
+ // RfcacheSkippedUnlinedWrite int64
+ // RfcacheSourceDeviceReads int64
+ // RfcacheSourceDeviceWrites int64
+ // RfcacheWriteMiss int64
+ // RfcacheWritePending int64
+ // RfcacheWritesReceived int64
+ // RfcacheWritesSkippedCacheMiss int64
+ // RfcacheWritesSkippedHeavyLoad int64
+ // RfcacheWritesSkippedInternalError int64
+ // RfcacheWritesSkippedLowResources int64
+ // RfcacheWritesSkippedMaxIoSize int64
+ // RfcacheWritesSkippedStuckIo int64
+ // RmPendingAllocatedInKb int64
+ // SecondaryReadBwc int64
+ // SecondaryReadFromDevBwc int64
+ // SecondaryReadFromRmcacheBwc int64
+ // SecondaryVacInKb int64
+ // SecondaryWriteBwc int64
+ // SemiProtectedVacInKb int64
+ // SnapCapacityInUseInKb int64
+ // SnapCapacityInUseOccupiedInKb int64
+ // ThickCapacityInUseInKb int64
+ // ThinCapacityAllocatedInKb int64
+ // ThinCapacityInUseInKb int64
+ // TotalReadBwc int64
+ // TotalWriteBwc int64
+ // UnreachableUnusedCapacityInKb int64
+ // UnusedCapacityInKb int64
+ }
+ FaultSetStatistics struct {
+ // BackgroundScanCompareCount int64
+ // BackgroundScannedInMB int64
+ // ActiveMovingInBckRebuildJobs int64
+ // ActiveMovingInFwdRebuildJobs int64
+ // ActiveMovingInNormRebuildJobs int64
+ // ActiveMovingInRebalanceJobs int64
+ // ActiveMovingOutBckRebuildJobs int64
+ // ActiveMovingOutFwdRebuildJobs int64
+ // ActiveMovingOutNormRebuildJobs int64
+ // ActiveMovingRebalanceJobs int64
+ // BckRebuildReadBwc int64
+ // BckRebuildWriteBwc int64
+ // CapacityInUseInKb int64
+ // CapacityLimitInKb int64
+ // DegradedFailedVacInKb int64
+ // DegradedHealthyVacInKb int64
+ // FailedVacInKb int64
+ // FixedReadErrorCount int64
+ // FwdRebuildReadBwc int64
+ // FwdRebuildWriteBwc int64
+ // InMaintenanceVacInKb int64
+ // InUseVacInKb int64
+ // MaxCapacityInKb int64
+ // NormRebuildReadBwc int64
+ // NormRebuildWriteBwc int64
+ // NumOfSds int64
+ // PendingMovingInBckRebuildJobs int64
+ // PendingMovingInFwdRebuildJobs int64
+ // PendingMovingInNormRebuildJobs int64
+ // PendingMovingInRebalanceJobs int64
+ // PendingMovingOutBckRebuildJobs int64
+ // PendingMovingOutFwdRebuildJobs int64
+ // PendingMovingOutNormrebuildJobs int64
+ // PendingMovingRebalanceJobs int64
+ // PrimaryReadBwc int64
+ // PrimaryReadFromDevBwc int64
+ // PrimaryReadFromRmcacheBwc int64
+ // PrimaryVacInKb int64
+ // PrimaryWriteBwc int64
+ // ProtectedVacInKb int64
+ // RebalancePerReceiveJobNetThrottlingInKbps int64
+ // RebalanceReadBwc int64
+ // RebalanceWaitSendQLength int64
+ // RebalanceWriteBwc int64
+ // RebuildPerReceiveJobNetThrottlingInKbps int64
+ // RebuildWaitSendQLength int64
+ // RfacheReadHit int64
+ // RfacheWriteHit int64
+ // RfcacheAvgReadTime int64
+ // RfcacheAvgWriteTime int64
+ // RfcacheFdAvgReadTime int64
+ // RfcacheFdAvgWriteTime int64
+ // RfcacheFdCacheOverloaded int64
+ // RfcacheFdInlightReads int64
+ // RfcacheFdInlightWrites int64
+ // RfcacheFdIoErrors int64
+ // RfcacheFdMonitorErrorStuckIo int64
+ // RfcacheFdReadTimeGreater1Min int64
+ // RfcacheFdReadTimeGreater1Sec int64
+ // RfcacheFdReadTimeGreater500Millis int64
+ // RfcacheFdReadTimeGreater5Sec int64
+ // RfcacheFdReadsReceived int64
+ // RfcacheFdWriteTimeGreater1Min int64
+ // RfcacheFdWriteTimeGreater1Sec int64
+ // RfcacheFdWriteTimeGreater500Millis int64
+ // RfcacheFdWriteTimeGreater5Sec int64
+ // RfcacheFdWritesReceived int64
+ // RfcacheIoErrors int64
+ // RfcacheIosOutstanding int64
+ // RfcacheIosSkipped int64
+ // RfcachePooIosOutstanding int64
+ // RfcachePoolCachePages int64
+ // RfcachePoolEvictions int64
+ // RfcachePoolInLowMemoryCondition int64
+ // RfcachePoolIoTimeGreater1Min int64
+ // RfcachePoolLockTimeGreater1Sec int64
+ // RfcachePoolLowResourcesInitiatedPassthroughMode int64
+ // RfcachePoolNumCacheDevs int64
+ // RfcachePoolNumSrcDevs int64
+ // RfcachePoolPagesInuse int64
+ // RfcachePoolReadHit int64
+ // RfcachePoolReadMiss int64
+ // RfcachePoolReadPendingG10Millis int64
+ // RfcachePoolReadPendingG1Millis int64
+ // RfcachePoolReadPendingG1Sec int64
+ // RfcachePoolReadPendingG500Micro int64
+ // RfcachePoolReadsPending int64
+ // RfcachePoolSize int64
+ // RfcachePoolSourceIdMismatch int64
+ // RfcachePoolSuspendedIos int64
+ // RfcachePoolSuspendedPequestsRedundantSearchs int64
+ // RfcachePoolWriteHit int64
+ // RfcachePoolWriteMiss int64
+ // RfcachePoolWritePending int64
+ // RfcachePoolWritePendingG10Millis int64
+ // RfcachePoolWritePendingG1Millis int64
+ // RfcachePoolWritePendingG1Sec int64
+ // RfcachePoolWritePendingG500Micro int64
+ // RfcacheReadMiss int64
+ // RfcacheReadsFromCache int64
+ // RfcacheReadsPending int64
+ // RfcacheReadsReceived int64
+ // RfcacheReadsSkipped int64
+ // RfcacheReadsSkippedAlignedSizeTooLarge int64
+ // RfcacheReadsSkippedHeavyLoad int64
+ // RfcacheReadsSkippedInternalError int64
+ // RfcacheReadsSkippedLockIos int64
+ // RfcacheReadsSkippedLowResources int64
+ // RfcacheReadsSkippedMaxIoSize int64
+ // RfcacheReadsSkippedStuckIo int64
+ // RfcacheSkippedUnlinedWrite int64
+ // RfcacheSourceDeviceReads int64
+ // RfcacheSourceDeviceWrites int64
+ // RfcacheWriteMiss int64
+ // RfcacheWritePending int64
+ // RfcacheWritesReceived int64
+ // RfcacheWritesSkippedCacheMiss int64
+ // RfcacheWritesSkippedHeavyLoad int64
+ // RfcacheWritesSkippedInternalError int64
+ // RfcacheWritesSkippedLowResources int64
+ // RfcacheWritesSkippedMaxIoSize int64
+ // RfcacheWritesSkippedStuckIo int64
+ // RmPendingAllocatedInKb int64
+ // Rmcache128kbEntryCount int64
+ // Rmcache16kbEntryCount int64
+ // Rmcache32kbEntryCount int64
+ // Rmcache4kbEntryCount int64
+ // Rmcache64kbEntryCount int64
+ // Rmcache8kbEntryCount int64
+ // RmcacheBigBlockEvictionCount int64
+ // RmcacheBigBlockEvictionSizeCountInKb int64
+ // RmcacheCurrNumOf128kbEntries int64
+ // RmcacheCurrNumOf16kbEntries int64
+ // RmcacheCurrNumOf32kbEntries int64
+ // RmcacheCurrNumOf4kbEntries int64
+ // RmcacheCurrNumOf64kbEntries int64
+ // RmcacheCurrNumOf8kbEntries int64
+ // RmcacheEntryEvictionCount int64
+ // RmcacheEntryEvictionSizeCountInKb int64
+ // RmcacheNoEvictionCount int64
+ // RmcacheSizeInKb int64
+ // RmcacheSizeInUseInKb int64
+ // RmcacheSkipCountCacheAllBusy int64
+ // RmcacheSkipCountLargeIo int64
+ // RmcacheSkipCountUnaligned4kbIo int64
+ // SdsIds int64
+ // SecondaryReadBwc int64
+ // SecondaryReadFromDevBwc int64
+ // SecondaryReadFromRmcacheBwc int64
+ // SecondaryVacInKb int64
+ // SecondaryWriteBwc int64
+ // SemiProtectedVacInKb int64
+ // SnapCapacityInUseInKb int64
+ // SnapCapacityInUseOccupiedInKb int64
+ // ThickCapacityInUseInKb int64
+ // ThinCapacityAllocatedInKb int64
+ // ThinCapacityInUseInKb int64
+ // TotalReadBwc int64
+ // TotalWriteBwc int64
+ // UnreachableUnusedCapacityInKb int64
+ // UnusedCapacityInKb int64
+ }
+ ProtectionDomainStatistics struct {
+ // BackgroundScanCompareCount int64
+ // BackgroundScannedInMB int64
+ // ActiveBckRebuildCapacityInKb int64
+ // ActiveFwdRebuildCapacityInKb int64
+ // ActiveMovingCapacityInKb int64
+ // ActiveMovingInBckRebuildJobs int64
+ // ActiveMovingInFwdRebuildJobs int64
+ // ActiveMovingInNormRebuildJobs int64
+ // ActiveMovingInRebalanceJobs int64
+ // ActiveMovingOutBckRebuildJobs int64
+ // ActiveMovingOutFwdRebuildJobs int64
+ // ActiveMovingOutNormRebuildJobs int64
+ // ActiveMovingRebalanceJobs int64
+ // ActiveNormRebuildCapacityInKb int64
+ // ActiveRebalanceCapacityInKb int64
+ // AtRestCapacityInKb int64
+ // BckRebuildCapacityInKb int64
+ // BckRebuildReadBwc int64
+ // BckRebuildWriteBwc int64
+ // CapacityAvailableForVolumeAllocationInKb int64
+ // CapacityInUseInKb int64
+ // CapacityLimitInKb int64
+ // DegradedFailedCapacityInKb int64
+ // DegradedFailedVacInKb int64
+ // DegradedHealthyCapacityInKb int64
+ // DegradedHealthyVacInKb int64
+ // FailedCapacityInKb int64
+ // FailedVacInKb int64
+ // FaultSetIds int64
+ // FixedReadErrorCount int64
+ // FwdRebuildCapacityInKb int64
+ // FwdRebuildReadBwc int64
+ // FwdRebuildWriteBwc int64
+ // InMaintenanceCapacityInKb int64
+ // InMaintenanceVacInKb int64
+ // InUseVacInKb int64
+ // MaxCapacityInKb int64
+ // MovingCapacityInKb int64
+ // NormRebuildCapacityInKb int64
+ // NormRebuildReadBwc int64
+ // NormRebuildWriteBwc int64
+ // NumOfFaultSets int64
+ // NumOfMappedToAllVolumes int64
+ // NumOfSds int64
+ // NumOfSnapshots int64
+ // NumOfStoragePools int64
+ // NumOfThickBaseVolumes int64
+ // NumOfThinBaseVolumes int64
+ // NumOfUnmappedVolumes int64
+ // NumOfVolumesInDeletion int64
+ // PendingBckRebuildCapacityInKb int64
+ // PendingFwdRebuildCapacityInKb int64
+ // PendingMovingCapacityInKb int64
+ // PendingMovingInBckRebuildJobs int64
+ // PendingMovingInFwdRebuildJobs int64
+ // PendingMovingInNormRebuildJobs int64
+ // PendingMovingInRebalanceJobs int64
+ // PendingMovingOutBckRebuildJobs int64
+ // PendingMovingOutFwdRebuildJobs int64
+ // PendingMovingOutNormrebuildJobs int64
+ // PendingMovingRebalanceJobs int64
+ // PendingNormRebuildCapacityInKb int64
+ // PendingRebalanceCapacityInKb int64
+ // PrimaryReadBwc int64
+ // PrimaryReadFromDevBwc int64
+ // PrimaryReadFromRmcacheBwc int64
+ // PrimaryVacInKb int64
+ // PrimaryWriteBwc int64
+ // ProtectedCapacityInKb int64
+ // ProtectedVacInKb int64
+ // RebalanceCapacityInKb int64
+ // RebalancePerReceiveJobNetThrottlingInKbps int64
+ // RebalanceReadBwc int64
+ // RebalanceWaitSendQLength int64
+ // RebalanceWriteBwc int64
+ // RebuildPerReceiveJobNetThrottlingInKbps int64
+ // RebuildWaitSendQLength int64
+ // RfacheReadHit int64
+ // RfacheWriteHit int64
+ // RfcacheAvgReadTime int64
+ // RfcacheAvgWriteTime int64
+ // RfcacheFdAvgReadTime int64
+ // RfcacheFdAvgWriteTime int64
+ // RfcacheFdCacheOverloaded int64
+ // RfcacheFdInlightReads int64
+ // RfcacheFdInlightWrites int64
+ // RfcacheFdIoErrors int64
+ // RfcacheFdMonitorErrorStuckIo int64
+ // RfcacheFdReadTimeGreater1Min int64
+ // RfcacheFdReadTimeGreater1Sec int64
+ // RfcacheFdReadTimeGreater500Millis int64
+ // RfcacheFdReadTimeGreater5Sec int64
+ // RfcacheFdReadsReceived int64
+ // RfcacheFdWriteTimeGreater1Min int64
+ // RfcacheFdWriteTimeGreater1Sec int64
+ // RfcacheFdWriteTimeGreater500Millis int64
+ // RfcacheFdWriteTimeGreater5Sec int64
+ // RfcacheFdWritesReceived int64
+ // RfcacheIoErrors int64
+ // RfcacheIosOutstanding int64
+ // RfcacheIosSkipped int64
+ // RfcachePooIosOutstanding int64
+ // RfcachePoolCachePages int64
+ // RfcachePoolEvictions int64
+ // RfcachePoolInLowMemoryCondition int64
+ // RfcachePoolIoTimeGreater1Min int64
+ // RfcachePoolLockTimeGreater1Sec int64
+ // RfcachePoolLowResourcesInitiatedPassthroughMode int64
+ // RfcachePoolNumCacheDevs int64
+ // RfcachePoolNumSrcDevs int64
+ // RfcachePoolPagesInuse int64
+ // RfcachePoolReadHit int64
+ // RfcachePoolReadMiss int64
+ // RfcachePoolReadPendingG10Millis int64
+ // RfcachePoolReadPendingG1Millis int64
+ // RfcachePoolReadPendingG1Sec int64
+ // RfcachePoolReadPendingG500Micro int64
+ // RfcachePoolReadsPending int64
+ // RfcachePoolSize int64
+ // RfcachePoolSourceIdMismatch int64
+ // RfcachePoolSuspendedIos int64
+ // RfcachePoolSuspendedPequestsRedundantSearchs int64
+ // RfcachePoolWriteHit int64
+ // RfcachePoolWriteMiss int64
+ // RfcachePoolWritePending int64
+ // RfcachePoolWritePendingG10Millis int64
+ // RfcachePoolWritePendingG1Millis int64
+ // RfcachePoolWritePendingG1Sec int64
+ // RfcachePoolWritePendingG500Micro int64
+ // RfcacheReadMiss int64
+ // RfcacheReadsFromCache int64
+ // RfcacheReadsPending int64
+ // RfcacheReadsReceived int64
+ // RfcacheReadsSkipped int64
+ // RfcacheReadsSkippedAlignedSizeTooLarge int64
+ // RfcacheReadsSkippedHeavyLoad int64
+ // RfcacheReadsSkippedInternalError int64
+ // RfcacheReadsSkippedLockIos int64
+ // RfcacheReadsSkippedLowResources int64
+ // RfcacheReadsSkippedMaxIoSize int64
+ // RfcacheReadsSkippedStuckIo int64
+ // RfcacheSkippedUnlinedWrite int64
+ // RfcacheSourceDeviceReads int64
+ // RfcacheSourceDeviceWrites int64
+ // RfcacheWriteMiss int64
+ // RfcacheWritePending int64
+ // RfcacheWritesReceived int64
+ // RfcacheWritesSkippedCacheMiss int64
+ // RfcacheWritesSkippedHeavyLoad int64
+ // RfcacheWritesSkippedInternalError int64
+ // RfcacheWritesSkippedLowResources int64
+ // RfcacheWritesSkippedMaxIoSize int64
+ // RfcacheWritesSkippedStuckIo int64
+ // RmPendingAllocatedInKb int64
+ // Rmcache128kbEntryCount int64
+ // Rmcache16kbEntryCount int64
+ // Rmcache32kbEntryCount int64
+ // Rmcache4kbEntryCount int64
+ // Rmcache64kbEntryCount int64
+ // Rmcache8kbEntryCount int64
+ // RmcacheBigBlockEvictionCount int64
+ // RmcacheBigBlockEvictionSizeCountInKb int64
+ // RmcacheCurrNumOf128kbEntries int64
+ // RmcacheCurrNumOf16kbEntries int64
+ // RmcacheCurrNumOf32kbEntries int64
+ // RmcacheCurrNumOf4kbEntries int64
+ // RmcacheCurrNumOf64kbEntries int64
+ // RmcacheCurrNumOf8kbEntries int64
+ // RmcacheEntryEvictionCount int64
+ // RmcacheEntryEvictionSizeCountInKb int64
+ // RmcacheNoEvictionCount int64
+ // RmcacheSizeInKb int64
+ // RmcacheSizeInUseInKb int64
+ // RmcacheSkipCountCacheAllBusy int64
+ // RmcacheSkipCountLargeIo int64
+ // RmcacheSkipCountUnaligned4kbIo int64
+ // SdsIds int64
+ // SecondaryReadBwc int64
+ // SecondaryReadFromDevBwc int64
+ // SecondaryReadFromRmcacheBwc int64
+ // SecondaryVacInKb int64
+ // SecondaryWriteBwc int64
+ // SemiProtectedCapacityInKb int64
+ // SemiProtectedVacInKb int64
+ // SnapCapacityInUseInKb int64
+ // SnapCapacityInUseOccupiedInKb int64
+ // SpareCapacityInKb int64
+ // StoragePoolIds int64
+ // ThickCapacityInUseInKb int64
+ // ThinCapacityAllocatedInKb int64
+ // ThinCapacityInUseInKb int64
+ // TotalReadBwc int64
+ // TotalWriteBwc int64
+ // UnreachableUnusedCapacityInKb int64
+ // UnusedCapacityInKb int64
+ // UserDataReadBwc int64
+ // UserDataWriteBwc int64
+ }
+ RFCacheDeviceStatistics struct {
+ // RfcacheFdAvgReadTime int64
+ // RfcacheFdAvgWriteTime int64
+ // RfcacheFdCacheOverloaded int64
+ // RfcacheFdInlightReads int64
+ // RfcacheFdInlightWrites int64
+ // RfcacheFdIoErrors int64
+ // RfcacheFdMonitorErrorStuckIo int64
+ // RfcacheFdReadTimeGreater1Min int64
+ // RfcacheFdReadTimeGreater1Sec int64
+ // RfcacheFdReadTimeGreater500Millis int64
+ // RfcacheFdReadTimeGreater5Sec int64
+ // RfcacheFdReadsReceived int64
+ // RfcacheFdWriteTimeGreater1Min int64
+ // RfcacheFdWriteTimeGreater1Sec int64
+ // RfcacheFdWriteTimeGreater500Millis int64
+ // RfcacheFdWriteTimeGreater5Sec int64
+ // RfcacheFdWritesReceived int64
+ }
+ SdsStatistics struct {
+ // BackgroundScanCompareCount int64
+ // BackgroundScannedInMB int64
+ // ActiveMovingInBckRebuildJobs int64
+ // ActiveMovingInFwdRebuildJobs int64
+ // ActiveMovingInNormRebuildJobs int64
+ // ActiveMovingInRebalanceJobs int64
+ // ActiveMovingOutBckRebuildJobs int64
+ // ActiveMovingOutFwdRebuildJobs int64
+ // ActiveMovingOutNormRebuildJobs int64
+ // ActiveMovingRebalanceJobs int64
+ // BckRebuildReadBwc int64
+ // BckRebuildWriteBwc int64
+ // CapacityInUseInKb int64
+ // CapacityLimitInKb int64
+ // DegradedFailedVacInKb int64
+ // DegradedHealthyVacInKb int64
+ // DeviceIds int64
+ // FailedVacInKb int64
+ // FixedReadErrorCount int64
+ // FwdRebuildReadBwc int64
+ // FwdRebuildWriteBwc int64
+ // InMaintenanceVacInKb int64
+ // InUseVacInKb int64
+ // MaxCapacityInKb int64
+ // NormRebuildReadBwc int64
+ // NormRebuildWriteBwc int64
+ // NumOfDevices int64
+ // NumOfRfcacheDevices int64
+ // PendingMovingInBckRebuildJobs int64
+ // PendingMovingInFwdRebuildJobs int64
+ // PendingMovingInNormRebuildJobs int64
+ // PendingMovingInRebalanceJobs int64
+ // PendingMovingOutBckRebuildJobs int64
+ // PendingMovingOutFwdRebuildJobs int64
+ // PendingMovingOutNormrebuildJobs int64
+ // PendingMovingRebalanceJobs int64
+ // PrimaryReadBwc int64
+ // PrimaryReadFromDevBwc int64
+ // PrimaryReadFromRmcacheBwc int64
+ // PrimaryVacInKb int64
+ // PrimaryWriteBwc int64
+ // ProtectedVacInKb int64
+ // RebalancePerReceiveJobNetThrottlingInKbps int64
+ // RebalanceReadBwc int64
+ // RebalanceWaitSendQLength int64
+ // RebalanceWriteBwc int64
+ // RebuildPerReceiveJobNetThrottlingInKbps int64
+ // RebuildWaitSendQLength int64
+ // RfacheReadHit int64
+ // RfacheWriteHit int64
+ // RfcacheAvgReadTime int64
+ // RfcacheAvgWriteTime int64
+ // RfcacheDeviceIds int64
+ // RfcacheFdAvgReadTime int64
+ // RfcacheFdAvgWriteTime int64
+ // RfcacheFdCacheOverloaded int64
+ // RfcacheFdInlightReads int64
+ // RfcacheFdInlightWrites int64
+ // RfcacheFdIoErrors int64
+ // RfcacheFdMonitorErrorStuckIo int64
+ // RfcacheFdReadTimeGreater1Min int64
+ // RfcacheFdReadTimeGreater1Sec int64
+ // RfcacheFdReadTimeGreater500Millis int64
+ // RfcacheFdReadTimeGreater5Sec int64
+ // RfcacheFdReadsReceived int64
+ // RfcacheFdWriteTimeGreater1Min int64
+ // RfcacheFdWriteTimeGreater1Sec int64
+ // RfcacheFdWriteTimeGreater500Millis int64
+ // RfcacheFdWriteTimeGreater5Sec int64
+ // RfcacheFdWritesReceived int64
+ // RfcacheIoErrors int64
+ // RfcacheIosOutstanding int64
+ // RfcacheIosSkipped int64
+ // RfcachePooIosOutstanding int64
+ // RfcachePoolCachePages int64
+ // RfcachePoolContinuosMem int64
+ // RfcachePoolEvictions int64
+ // RfcachePoolInLowMemoryCondition int64
+ // RfcachePoolIoTimeGreater1Min int64
+ // RfcachePoolLockTimeGreater1Sec int64
+ // RfcachePoolLowResourcesInitiatedPassthroughMode int64
+ // RfcachePoolMaxIoSize int64
+ // RfcachePoolNumCacheDevs int64
+ // RfcachePoolNumOfDriverTheads int64
+ // RfcachePoolNumSrcDevs int64
+ // RfcachePoolOpmode int64
+ // RfcachePoolPageSize int64
+ // RfcachePoolPagesInuse int64
+ // RfcachePoolReadHit int64
+ // RfcachePoolReadMiss int64
+ // RfcachePoolReadPendingG10Millis int64
+ // RfcachePoolReadPendingG1Millis int64
+ // RfcachePoolReadPendingG1Sec int64
+ // RfcachePoolReadPendingG500Micro int64
+ // RfcachePoolReadsPending int64
+ // RfcachePoolSize int64
+ // RfcachePoolSourceIdMismatch int64
+ // RfcachePoolSuspendedIos int64
+ // RfcachePoolSuspendedIosMax int64
+ // RfcachePoolSuspendedPequestsRedundantSearchs int64
+ // RfcachePoolWriteHit int64
+ // RfcachePoolWriteMiss int64
+ // RfcachePoolWritePending int64
+ // RfcachePoolWritePendingG10Millis int64
+ // RfcachePoolWritePendingG1Millis int64
+ // RfcachePoolWritePendingG1Sec int64
+ // RfcachePoolWritePendingG500Micro int64
+ // RfcacheReadMiss int64
+ // RfcacheReadsFromCache int64
+ // RfcacheReadsPending int64
+ // RfcacheReadsReceived int64
+ // RfcacheReadsSkipped int64
+ // RfcacheReadsSkippedAlignedSizeTooLarge int64
+ // RfcacheReadsSkippedHeavyLoad int64
+ // RfcacheReadsSkippedInternalError int64
+ // RfcacheReadsSkippedLockIos int64
+ // RfcacheReadsSkippedLowResources int64
+ // RfcacheReadsSkippedMaxIoSize int64
+ // RfcacheReadsSkippedStuckIo int64
+ // RfcacheSkippedUnlinedWrite int64
+ // RfcacheSourceDeviceReads int64
+ // RfcacheSourceDeviceWrites int64
+ // RfcacheWriteMiss int64
+ // RfcacheWritePending int64
+ // RfcacheWritesReceived int64
+ // RfcacheWritesSkippedCacheMiss int64
+ // RfcacheWritesSkippedHeavyLoad int64
+ // RfcacheWritesSkippedInternalError int64
+ // RfcacheWritesSkippedLowResources int64
+ // RfcacheWritesSkippedMaxIoSize int64
+ // RfcacheWritesSkippedStuckIo int64
+ // RmPendingAllocatedInKb int64
+ // Rmcache128kbEntryCount int64
+ // Rmcache16kbEntryCount int64
+ // Rmcache32kbEntryCount int64
+ // Rmcache4kbEntryCount int64
+ // Rmcache64kbEntryCount int64
+ // Rmcache8kbEntryCount int64
+ // RmcacheBigBlockEvictionCount int64
+ // RmcacheBigBlockEvictionSizeCountInKb int64
+ // RmcacheCurrNumOf128kbEntries int64
+ // RmcacheCurrNumOf16kbEntries int64
+ // RmcacheCurrNumOf32kbEntries int64
+ // RmcacheCurrNumOf4kbEntries int64
+ // RmcacheCurrNumOf64kbEntries int64
+ // RmcacheCurrNumOf8kbEntries int64
+ // RmcacheEntryEvictionCount int64
+ // RmcacheEntryEvictionSizeCountInKb int64
+ // RmcacheNoEvictionCount int64
+ // RmcacheSizeInKb int64
+ // RmcacheSizeInUseInKb int64
+ // RmcacheSkipCountCacheAllBusy int64
+ // RmcacheSkipCountLargeIo int64
+ // RmcacheSkipCountUnaligned4kbIo int64
+ // SecondaryReadBwc int64
+ // SecondaryReadFromDevBwc int64
+ // SecondaryReadFromRmcacheBwc int64
+ // SecondaryVacInKb int64
+ // SecondaryWriteBwc int64
+ // SemiProtectedVacInKb int64
+ // SnapCapacityInUseInKb int64
+ // SnapCapacityInUseOccupiedInKb int64
+ // ThickCapacityInUseInKb int64
+ // ThinCapacityAllocatedInKb int64
+ // ThinCapacityInUseInKb int64
+ // TotalReadBwc int64
+ // TotalWriteBwc int64
+ // UnreachableUnusedCapacityInKb int64
+ // UnusedCapacityInKb int64
+ }
+ VolumeStatistics struct {
+ // ChildVolumeIds int64
+ // DescendantVolumeIds int64
+ // MappedSdcIds int64
+ // NumOfChildVolumes int64
+ // NumOfDescendantVolumes int64
+ // NumOfMappedScsiInitiators int64
+ // NumOfMappedSdcs int64
+ // UserDataReadBwc int64
+ // UserDataWriteBwc int64
+ }
+ VTreeStatistics struct {
+ // BaseNetCapacityInUseInKb int64
+ // NetCapacityInUseInKb int64
+ // NumOfVolumes int64
+ // SnapNetCapacityInUseInKb int64
+ // TrimmedCapacityInKb int64
+ // VolumeIds int64
+ }
+)