diff options
Diffstat (limited to 'src/go/collectors/go.d.plugin/modules/scaleio/client/server.go')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/scaleio/client/server.go | 149 |
1 files changed, 149 insertions, 0 deletions
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) +} |