hosts.go 4.7 KB

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