2
0

relay.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package controller
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "github.com/gorilla/mux"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/logic"
  9. "github.com/gravitl/netmaker/models"
  10. "github.com/gravitl/netmaker/mq"
  11. )
  12. // swagger:route POST /api/hosts/{hostid}/relay hosts createHostRelay
  13. //
  14. // Create a relay.
  15. //
  16. // Schemes: https
  17. //
  18. // Security:
  19. // oauth
  20. //
  21. // Responses:
  22. // 200: nodeResponse
  23. func createHostRelay(w http.ResponseWriter, r *http.Request) {
  24. var relay models.HostRelayRequest
  25. var params = mux.Vars(r)
  26. w.Header().Set("Content-Type", "application/json")
  27. err := json.NewDecoder(r.Body).Decode(&relay)
  28. if err != nil {
  29. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  30. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  31. return
  32. }
  33. relay.HostID = params["hostid"]
  34. relayHost, _, err := logic.CreateHostRelay(relay)
  35. if err != nil {
  36. logger.Log(0, r.Header.Get("user"),
  37. fmt.Sprintf("failed to create relay on host [%s]: %v", relay.HostID, err))
  38. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  39. return
  40. }
  41. logger.Log(1, r.Header.Get("user"), "created relay on host", relay.HostID)
  42. go func(relayHostID string) {
  43. relatedhosts := logic.GetRelatedHosts(relayHostID)
  44. for _, relatedHost := range relatedhosts {
  45. relatedHost.ProxyEnabled = true
  46. logic.UpsertHost(&relatedHost)
  47. }
  48. if err := mq.PublishPeerUpdate(); err != nil {
  49. logger.Log(0, "fail to publish peer update: ", err.Error())
  50. }
  51. }(relay.HostID)
  52. apiHostData := relayHost.ConvertNMHostToAPI()
  53. w.WriteHeader(http.StatusOK)
  54. json.NewEncoder(w).Encode(apiHostData)
  55. }
  56. // swagger:route DELETE /api/hosts/{hostid}/relay hosts deleteHostRelay
  57. //
  58. // Remove a relay.
  59. //
  60. // Schemes: https
  61. //
  62. // Security:
  63. // oauth
  64. //
  65. // Responses:
  66. // 200: nodeResponse
  67. func deleteHostRelay(w http.ResponseWriter, r *http.Request) {
  68. w.Header().Set("Content-Type", "application/json")
  69. var params = mux.Vars(r)
  70. hostid := params["hostid"]
  71. relayHost, _, err := logic.DeleteHostRelay(hostid)
  72. if err != nil {
  73. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  74. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  75. return
  76. }
  77. logger.Log(1, r.Header.Get("user"), "deleted relay host", hostid)
  78. go func() {
  79. if err := mq.PublishPeerUpdate(); err != nil {
  80. logger.Log(0, "fail to publish peer update: ", err.Error())
  81. }
  82. }()
  83. apiHostData := relayHost.ConvertNMHostToAPI()
  84. w.WriteHeader(http.StatusOK)
  85. json.NewEncoder(w).Encode(apiHostData)
  86. }