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  }