hosts.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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", 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}", 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. logger.Log(2, r.Header.Get("user"), "fetched all hosts")
  38. w.WriteHeader(http.StatusOK)
  39. json.NewEncoder(w).Encode(currentHosts)
  40. }
  41. // swagger:route PUT /api/hosts/{hostid} hosts updateHost
  42. //
  43. // Updates a Netclient host on Netmaker server.
  44. //
  45. // Schemes: https
  46. //
  47. // Security:
  48. // oauth
  49. //
  50. // Responses:
  51. // 200: updateHostResponse
  52. func updateHost(w http.ResponseWriter, r *http.Request) {
  53. var newHostData models.Host
  54. err := json.NewDecoder(r.Body).Decode(&newHostData)
  55. if err != nil {
  56. logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
  57. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  58. return
  59. }
  60. // confirm host exists
  61. currHost, err := logic.GetHost(newHostData.ID.String())
  62. if err != nil {
  63. logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
  64. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  65. return
  66. }
  67. logic.UpdateHost(&newHostData, currHost) // update the in memory struct values
  68. if err = logic.UpsertHost(&newHostData); err != nil {
  69. logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
  70. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  71. return
  72. }
  73. logger.Log(2, r.Header.Get("user"), "updated host", newHostData.ID.String())
  74. w.WriteHeader(http.StatusOK)
  75. json.NewEncoder(w).Encode(newHostData)
  76. }
  77. // swagger:route DELETE /api/hosts/{hostid} hosts deleteHost
  78. //
  79. // Deletes a Netclient host from Netmaker server.
  80. //
  81. // Schemes: https
  82. //
  83. // Security:
  84. // oauth
  85. //
  86. // Responses:
  87. // 200: deleteHostResponse
  88. func deleteHost(w http.ResponseWriter, r *http.Request) {
  89. var params = mux.Vars(r)
  90. hostid := params["hostid"]
  91. // confirm host exists
  92. currHost, err := logic.GetHost(hostid)
  93. if err != nil {
  94. logger.Log(0, r.Header.Get("user"), "failed to delete a host:", err.Error())
  95. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  96. return
  97. }
  98. if err = logic.RemoveHost(currHost); 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. logger.Log(2, r.Header.Get("user"), "removed host", currHost.Name)
  104. w.WriteHeader(http.StatusOK)
  105. json.NewEncoder(w).Encode(currHost)
  106. }
  107. // swagger:route PUT /api/hosts hosts updateHostNetworks
  108. //
  109. // Given a list of networks, a host is updated accordingly.
  110. //
  111. // Schemes: https
  112. //
  113. // Security:
  114. // oauth
  115. //
  116. // Responses:
  117. // 200: updateHostNetworks
  118. func updateHostNetworks(w http.ResponseWriter, r *http.Request) {
  119. var payload hostNetworksUpdatePayload
  120. err := json.NewDecoder(r.Body).Decode(&payload)
  121. if err != nil {
  122. logger.Log(0, r.Header.Get("user"), "failed to update host networks:", err.Error())
  123. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  124. return
  125. }
  126. // confirm host exists
  127. var params = mux.Vars(r)
  128. hostid := params["hostid"]
  129. currHost, err := logic.GetHost(hostid)
  130. if err != nil {
  131. logger.Log(0, r.Header.Get("user"), "failed to find host:", err.Error())
  132. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  133. return
  134. }
  135. logger.Log(2, r.Header.Get("user"), "updated host", currHost.Name)
  136. w.WriteHeader(http.StatusOK)
  137. json.NewEncoder(w).Encode(payload)
  138. }