master
go 149 lines 4.25 KB
Raw
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 }