blob: b915674fe4f99def2696d2ccb879dd33fc0e3c26 [file] [log] [blame]
David K. Bainbridgef0da8732016-06-01 16:15:37 -07001package main
2
3import (
4 "bufio"
5 "encoding/json"
6 "github.com/gorilla/mux"
7 "log"
8 "net/http"
9 "strings"
10)
11
12type RequestInfo struct {
13 Id string
14 Name string
15 Ip string
16 Mac string
17}
18
19func (c *Context) GetRole(info *RequestInfo) (string, error) {
20 if c.config.RoleSelectorURL == "" {
21 return c.config.DefaultRole, nil
22 }
23 r, err := http.Get(c.config.RoleSelectorURL)
24 if err != nil {
25 return "", err
26 }
27
28 s := bufio.NewScanner(r.Body)
29 defer r.Body.Close()
30 role := strings.TrimSpace(s.Text())
31 if role == "" {
32 return c.config.DefaultRole, nil
33 }
34 return role, nil
35}
36
37func (c *Context) validateData(info *RequestInfo) bool {
38 if strings.TrimSpace(info.Id) == "" ||
39 strings.TrimSpace(info.Name) == "" ||
40 strings.TrimSpace(info.Ip) == "" ||
41 strings.TrimSpace(info.Mac) == "" {
42 return false
43 }
44 return true
45}
46
47func (c *Context) ProvisionRequestHandler(w http.ResponseWriter, r *http.Request) {
48 var info RequestInfo
49 decoder := json.NewDecoder(r.Body)
50 defer r.Body.Close()
51 if err := decoder.Decode(&info); err != nil || !c.validateData(&info) {
52 log.Printf("ERROR: %v", err)
53 w.WriteHeader(http.StatusBadRequest)
54 return
55 }
56
57 log.Printf("GOT: %v", info)
58
59 role, err := c.GetRole(&info)
60 if err != nil {
61 http.Error(w, err.Error(), http.StatusInternalServerError)
62 return
63 }
64 err = c.dispatcher.Dispatch(&info, role)
65 if err != nil {
66 http.Error(w, err.Error(), http.StatusInternalServerError)
67 return
68 }
69
70 w.WriteHeader(http.StatusAccepted)
71}
72
73func (c *Context) ListRequestsHandler(w http.ResponseWriter, r *http.Request) {
74 list, err := c.storage.List()
75 bytes, err := json.Marshal(list)
76 if err != nil {
77 http.Error(w, err.Error(), http.StatusInternalServerError)
78 return
79 }
80 w.Write(bytes)
81}
82
83func (c *Context) QueryStatusHandler(w http.ResponseWriter, r *http.Request) {
84 vars := mux.Vars(r)
85 id, ok := vars["nodeid"]
86 if !ok || strings.TrimSpace(id) == "" {
87 w.WriteHeader(http.StatusBadRequest)
88 return
89 }
90 s, err := c.storage.Get(id)
91 if err != nil {
92 http.Error(w, err.Error(), http.StatusInternalServerError)
93 return
94 }
95 if s == nil {
96 w.WriteHeader(http.StatusNotFound)
97 return
98 }
99 bytes, err := json.Marshal(s)
100 if err != nil {
101 http.Error(w, err.Error(), http.StatusInternalServerError)
102 return
103 }
104 w.Write(bytes)
105}