github.com/netdata/go.d.plugin@v0.58.1/modules/scaleio/client/server.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package client 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "io" 9 "net/http" 10 ) 11 12 // MockScaleIOAPIServer represents VxFlex OS Gateway. 13 type MockScaleIOAPIServer struct { 14 User string 15 Password string 16 Token string 17 Version string 18 Instances Instances 19 Statistics SelectedStatistics 20 } 21 22 func (s MockScaleIOAPIServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { 23 switch r.URL.Path { 24 default: 25 w.WriteHeader(http.StatusNotFound) 26 msg := fmt.Sprintf("unknown URL path: %s", r.URL.Path) 27 writeAPIError(w, msg) 28 case "/api/login": 29 s.handleLogin(w, r) 30 case "/api/logout": 31 s.handleLogout(w, r) 32 case "/api/version": 33 s.handleVersion(w, r) 34 case "/api/instances": 35 s.handleInstances(w, r) 36 case "/api/instances/querySelectedStatistics": 37 s.handleQuerySelectedStatistics(w, r) 38 } 39 } 40 41 func (s MockScaleIOAPIServer) handleLogin(w http.ResponseWriter, r *http.Request) { 42 if user, pass, ok := r.BasicAuth(); !ok || user != s.User || pass != s.Password { 43 w.WriteHeader(http.StatusUnauthorized) 44 msg := fmt.Sprintf("user got/expected: %s/%s, pass got/expected: %s/%s", user, s.User, pass, s.Password) 45 writeAPIError(w, msg) 46 return 47 } 48 if r.Method != http.MethodGet { 49 w.WriteHeader(http.StatusBadRequest) 50 msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet) 51 writeAPIError(w, msg) 52 return 53 } 54 _, _ = w.Write([]byte(s.Token)) 55 } 56 57 func (s MockScaleIOAPIServer) handleLogout(w http.ResponseWriter, r *http.Request) { 58 if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token { 59 w.WriteHeader(http.StatusUnauthorized) 60 msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token) 61 writeAPIError(w, msg) 62 return 63 } 64 if r.Method != http.MethodGet { 65 w.WriteHeader(http.StatusBadRequest) 66 msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet) 67 writeAPIError(w, msg) 68 return 69 } 70 } 71 72 func (s MockScaleIOAPIServer) handleVersion(w http.ResponseWriter, r *http.Request) { 73 if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token { 74 w.WriteHeader(http.StatusUnauthorized) 75 msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token) 76 writeAPIError(w, msg) 77 return 78 } 79 if r.Method != http.MethodGet { 80 w.WriteHeader(http.StatusBadRequest) 81 msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet) 82 writeAPIError(w, msg) 83 return 84 } 85 _, _ = w.Write([]byte(s.Version)) 86 } 87 88 func (s MockScaleIOAPIServer) handleInstances(w http.ResponseWriter, r *http.Request) { 89 if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token { 90 w.WriteHeader(http.StatusUnauthorized) 91 msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token) 92 writeAPIError(w, msg) 93 return 94 } 95 if r.Method != http.MethodGet { 96 w.WriteHeader(http.StatusBadRequest) 97 msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodGet) 98 writeAPIError(w, msg) 99 return 100 } 101 b, err := json.Marshal(s.Instances) 102 if err != nil { 103 w.WriteHeader(http.StatusInternalServerError) 104 msg := fmt.Sprintf("marshal Instances: %v", err) 105 writeAPIError(w, msg) 106 return 107 } 108 _, _ = w.Write(b) 109 } 110 111 func (s MockScaleIOAPIServer) handleQuerySelectedStatistics(w http.ResponseWriter, r *http.Request) { 112 if _, pass, ok := r.BasicAuth(); !ok || pass != s.Token { 113 w.WriteHeader(http.StatusUnauthorized) 114 msg := fmt.Sprintf("token got/expected: %s/%s", pass, s.Token) 115 writeAPIError(w, msg) 116 return 117 } 118 if r.Method != http.MethodPost { 119 w.WriteHeader(http.StatusBadRequest) 120 msg := fmt.Sprintf("wrong method: '%s', expected '%s'", r.Method, http.MethodPost) 121 writeAPIError(w, msg) 122 return 123 } 124 if r.Header.Get("Content-Type") != "application/json" { 125 w.WriteHeader(http.StatusBadRequest) 126 writeAPIError(w, "no \"Content-Type: application/json\" in the header") 127 return 128 } 129 if err := json.NewDecoder(r.Body).Decode(&SelectedStatisticsQuery{}); err != nil { 130 w.WriteHeader(http.StatusBadRequest) 131 msg := fmt.Sprintf("body decode error: %v", err) 132 writeAPIError(w, msg) 133 return 134 } 135 b, err := json.Marshal(s.Statistics) 136 if err != nil { 137 w.WriteHeader(http.StatusInternalServerError) 138 msg := fmt.Sprintf("marshal SelectedStatistics: %v", err) 139 writeAPIError(w, msg) 140 return 141 } 142 _, _ = w.Write(b) 143 } 144 145 func writeAPIError(w io.Writer, msg string) { 146 err := apiError{Message: msg} 147 b, _ := json.Marshal(err) 148 _, _ = w.Write(b) 149 }