diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/plugin/go.d/modules/scaleio/client/client.go | 316 | ||||
-rw-r--r-- | src/go/plugin/go.d/modules/scaleio/client/client_test.go | 142 | ||||
-rw-r--r-- | src/go/plugin/go.d/modules/scaleio/client/server.go | 149 | ||||
-rw-r--r-- | src/go/plugin/go.d/modules/scaleio/client/types.go | 1096 |
4 files changed, 1703 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/scaleio/client/client.go b/src/go/plugin/go.d/modules/scaleio/client/client.go new file mode 100644 index 000000000..698b2d174 --- /dev/null +++ b/src/go/plugin/go.d/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/plugins/plugin/go.d/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/plugin/go.d/modules/scaleio/client/client_test.go b/src/go/plugin/go.d/modules/scaleio/client/client_test.go new file mode 100644 index 000000000..02e1988b0 --- /dev/null +++ b/src/go/plugin/go.d/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/plugins/plugin/go.d/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/plugin/go.d/modules/scaleio/client/server.go b/src/go/plugin/go.d/modules/scaleio/client/server.go new file mode 100644 index 000000000..b7269d339 --- /dev/null +++ b/src/go/plugin/go.d/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/plugin/go.d/modules/scaleio/client/types.go b/src/go/plugin/go.d/modules/scaleio/client/types.go new file mode 100644 index 000000000..c85bddf8d --- /dev/null +++ b/src/go/plugin/go.d/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 + } +) |