hosts.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package controller
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/gorilla/mux"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/servercfg"
  10. )
  11. type hostNetworksUpdatePayload struct {
  12. Networks []string `json:"networks"`
  13. }
  14. func hostHandlers(r *mux.Router) {
  15. r.HandleFunc("/api/hosts", logic.SecurityCheck(true, http.HandlerFunc(getHosts))).Methods("GET")
  16. r.HandleFunc("/api/hosts/{hostid}", logic.SecurityCheck(true, http.HandlerFunc(updateHost))).Methods("PUT")
  17. r.HandleFunc("/api/hosts/{hostid}", logic.SecurityCheck(true, http.HandlerFunc(deleteHost))).Methods("DELETE")
  18. r.HandleFunc("/api/hosts/{hostid}/networks", logic.SecurityCheck(true, http.HandlerFunc(updateHostNetworks))).Methods("PUT")
  19. }
  20. // swagger:route GET /api/hosts hosts getHosts
  21. //
  22. // Lists all hosts.
  23. //
  24. // Schemes: https
  25. //
  26. // Security:
  27. // oauth
  28. //
  29. // Responses:
  30. // 200: getHostsSliceResponse
  31. func getHosts(w http.ResponseWriter, r *http.Request) {
  32. currentHosts, err := logic.GetAllHosts()
  33. if err != nil {
  34. logger.Log(0, r.Header.Get("user"), "failed to fetch hosts: ", err.Error())
  35. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  36. return
  37. }
  38. // return JSON/API formatted hosts
  39. apiHosts := logic.GetAllHostsAPI(currentHosts[:])
  40. logger.Log(2, r.Header.Get("user"), "fetched all hosts")
  41. w.WriteHeader(http.StatusOK)
  42. json.NewEncoder(w).Encode(apiHosts)
  43. }
  44. // swagger:route PUT /api/hosts/{hostid} hosts updateHost
  45. //
  46. // Updates a Netclient host on Netmaker server.
  47. //
  48. // Schemes: https
  49. //
  50. // Security:
  51. // oauth
  52. //
  53. // Responses:
  54. // 200: updateHostResponse
  55. func updateHost(w http.ResponseWriter, r *http.Request) {
  56. var newHostData models.ApiHost
  57. err := json.NewDecoder(r.Body).Decode(&newHostData)
  58. if err != nil {
  59. logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
  60. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  61. return
  62. }
  63. // confirm host exists
  64. currHost, err := logic.GetHost(newHostData.ID)
  65. if err != nil {
  66. logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
  67. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  68. return
  69. }
  70. newHost := newHostData.ConvertAPIHostToNMHost(currHost)
  71. logic.UpdateHost(newHost, currHost) // update the in memory struct values
  72. if err = logic.UpsertHost(newHost); err != nil {
  73. logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
  74. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  75. return
  76. }
  77. apiHostData := newHost.ConvertNMHostToAPI()
  78. logger.Log(2, r.Header.Get("user"), "updated host", newHost.ID.String())
  79. w.WriteHeader(http.StatusOK)
  80. json.NewEncoder(w).Encode(apiHostData)
  81. }
  82. // swagger:route DELETE /api/hosts/{hostid} hosts deleteHost
  83. //
  84. // Deletes a Netclient host from Netmaker server.
  85. //
  86. // Schemes: https
  87. //
  88. // Security:
  89. // oauth
  90. //
  91. // Responses:
  92. // 200: deleteHostResponse
  93. func deleteHost(w http.ResponseWriter, r *http.Request) {
  94. var params = mux.Vars(r)
  95. hostid := params["hostid"]
  96. // confirm host exists
  97. currHost, err := logic.GetHost(hostid)
  98. if err != nil {
  99. logger.Log(0, r.Header.Get("user"), "failed to delete a host:", err.Error())
  100. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  101. return
  102. }
  103. if err = logic.RemoveHost(currHost); err != nil {
  104. logger.Log(0, r.Header.Get("user"), "failed to delete a host:", err.Error())
  105. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  106. return
  107. }
  108. apiHostData := currHost.ConvertNMHostToAPI()
  109. logger.Log(2, r.Header.Get("user"), "removed host", currHost.Name)
  110. w.WriteHeader(http.StatusOK)
  111. json.NewEncoder(w).Encode(apiHostData)
  112. }
  113. // swagger:route PUT /api/hosts hosts updateHostNetworks
  114. //
  115. // Given a list of networks, a host is updated accordingly.
  116. //
  117. // Schemes: https
  118. //
  119. // Security:
  120. // oauth
  121. //
  122. // Responses:
  123. // 200: updateHostNetworks
  124. func updateHostNetworks(w http.ResponseWriter, r *http.Request) {
  125. var payload hostNetworksUpdatePayload
  126. err := json.NewDecoder(r.Body).Decode(&payload)
  127. if err != nil {
  128. logger.Log(0, r.Header.Get("user"), "failed to update host networks:", err.Error())
  129. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  130. return
  131. }
  132. // confirm host exists
  133. var params = mux.Vars(r)
  134. hostid := params["hostid"]
  135. currHost, err := logic.GetHost(hostid)
  136. if err != nil {
  137. logger.Log(0, r.Header.Get("user"), "failed to find host:", err.Error())
  138. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  139. return
  140. }
  141. if err = logic.UpdateHostNetworks(currHost, servercfg.GetServer(), payload.Networks); err != nil {
  142. logger.Log(0, r.Header.Get("user"), "failed to update host networks:", err.Error())
  143. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  144. return
  145. }
  146. logger.Log(2, r.Header.Get("user"), "updated host networks", currHost.Name)
  147. w.WriteHeader(http.StatusOK)
  148. json.NewEncoder(w).Encode(payload)
  149. }