relay.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. "github.com/gravitl/netmaker/queue"
  12. "github.com/gravitl/netmaker/servercfg"
  13. )
  14. // swagger:route POST /api/nodes/{network}/{nodeid}/createrelay nodes createRelay
  15. //
  16. // Create a relay.
  17. //
  18. // Schemes: https
  19. //
  20. // Security:
  21. // oauth
  22. //
  23. // Responses:
  24. // 200: nodeResponse
  25. func createRelay(w http.ResponseWriter, r *http.Request) {
  26. var relay models.RelayRequest
  27. var params = mux.Vars(r)
  28. w.Header().Set("Content-Type", "application/json")
  29. err := json.NewDecoder(r.Body).Decode(&relay)
  30. if err != nil {
  31. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  32. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  33. return
  34. }
  35. relay.NetID = params["network"]
  36. relay.NodeID = params["nodeid"]
  37. updatenodes, node, err := logic.CreateRelay(relay)
  38. if err != nil {
  39. logger.Log(0, r.Header.Get("user"),
  40. fmt.Sprintf("failed to create relay on node [%s] on network [%s]: %v", relay.NodeID, relay.NetID, err))
  41. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  42. return
  43. }
  44. logger.Log(1, r.Header.Get("user"), "created relay on node", relay.NodeID, "on network", relay.NetID)
  45. for _, relayedNode := range updatenodes {
  46. if servercfg.IsMessageQueueBackend() {
  47. if err = mq.NodeUpdate(&relayedNode); err != nil {
  48. logger.Log(1, "error sending update to relayed node ", relayedNode.ID.String(), "on network", relay.NetID, ": ", err.Error())
  49. }
  50. } else {
  51. if err = queue.NodeUpdate(&relayedNode); err != nil {
  52. logger.Log(1, "error sending update to relayed node ", relayedNode.ID.String(), "on network", relay.NetID, ": ", err.Error())
  53. }
  54. }
  55. }
  56. apiNode := node.ConvertToAPINode()
  57. w.WriteHeader(http.StatusOK)
  58. json.NewEncoder(w).Encode(apiNode)
  59. runUpdates(&node, true)
  60. }
  61. // swagger:route DELETE /api/nodes/{network}/{nodeid}/deleterelay nodes deleteRelay
  62. //
  63. // Remove a relay.
  64. //
  65. // Schemes: https
  66. //
  67. // Security:
  68. // oauth
  69. //
  70. // Responses:
  71. // 200: nodeResponse
  72. func deleteRelay(w http.ResponseWriter, r *http.Request) {
  73. w.Header().Set("Content-Type", "application/json")
  74. var params = mux.Vars(r)
  75. nodeid := params["nodeid"]
  76. netid := params["network"]
  77. updatenodes, node, err := logic.DeleteRelay(netid, nodeid)
  78. if err != nil {
  79. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  80. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  81. return
  82. }
  83. logger.Log(1, r.Header.Get("user"), "deleted relay server", nodeid, "on network", netid)
  84. for _, relayedNode := range updatenodes {
  85. if servercfg.IsMessageQueueBackend() {
  86. if err = mq.NodeUpdate(&relayedNode); err != nil {
  87. logger.Log(1, "error sending update to relayed node ", relayedNode.ID.String(), "on network", netid, ": ", err.Error())
  88. }
  89. } else {
  90. if err = queue.NodeUpdate(&relayedNode); err != nil {
  91. logger.Log(1, "error sending update to relayed node ", relayedNode.ID.String(), "on network", netid, ": ", err.Error())
  92. }
  93. }
  94. }
  95. apiNode := node.ConvertToAPINode()
  96. w.WriteHeader(http.StatusOK)
  97. json.NewEncoder(w).Encode(apiNode)
  98. runUpdates(&node, true)
  99. }
  100. // swagger:route POST /api/hosts/{hostid}/relay hosts createHostRelay
  101. //
  102. // Create a relay.
  103. //
  104. // Schemes: https
  105. //
  106. // Security:
  107. // oauth
  108. //
  109. // Responses:
  110. // 200: nodeResponse
  111. func createHostRelay(w http.ResponseWriter, r *http.Request) {
  112. var relay models.HostRelayRequest
  113. var params = mux.Vars(r)
  114. w.Header().Set("Content-Type", "application/json")
  115. err := json.NewDecoder(r.Body).Decode(&relay)
  116. if err != nil {
  117. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  118. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  119. return
  120. }
  121. relay.HostID = params["hostid"]
  122. relayHost, _, err := logic.CreateHostRelay(relay)
  123. if err != nil {
  124. logger.Log(0, r.Header.Get("user"),
  125. fmt.Sprintf("failed to create relay on host [%s]: %v", relay.HostID, err))
  126. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  127. return
  128. }
  129. if err := mq.HostUpdate(&models.HostUpdate{
  130. Action: models.UpdateHost,
  131. Host: *relayHost,
  132. }); err != nil {
  133. logger.Log(0, "failed to send host update: ", relayHost.ID.String(), err.Error())
  134. }
  135. logger.Log(1, r.Header.Get("user"), "created relay on host", relay.HostID)
  136. go func(relayHostID string) {
  137. relatedhosts := logic.GetRelatedHosts(relayHostID)
  138. for _, relatedHost := range relatedhosts {
  139. relatedHost.ProxyEnabled = true
  140. logic.UpsertHost(&relatedHost)
  141. if err := mq.HostUpdate(&models.HostUpdate{
  142. Action: models.UpdateHost,
  143. Host: relatedHost,
  144. }); err != nil {
  145. logger.Log(0, "failed to send host update: ", relatedHost.ID.String(), err.Error())
  146. }
  147. }
  148. if servercfg.IsMessageQueueBackend() {
  149. if err := mq.PublishPeerUpdate(); err != nil {
  150. logger.Log(0, "fail to publish peer update: ", err.Error())
  151. }
  152. } else {
  153. queue.PublishAllPeerUpdate()
  154. }
  155. }(relay.HostID)
  156. apiHostData := relayHost.ConvertNMHostToAPI()
  157. w.WriteHeader(http.StatusOK)
  158. json.NewEncoder(w).Encode(apiHostData)
  159. }
  160. // swagger:route DELETE /api/hosts/{hostid}/relay hosts deleteHostRelay
  161. //
  162. // Remove a relay.
  163. //
  164. // Schemes: https
  165. //
  166. // Security:
  167. // oauth
  168. //
  169. // Responses:
  170. // 200: nodeResponse
  171. func deleteHostRelay(w http.ResponseWriter, r *http.Request) {
  172. w.Header().Set("Content-Type", "application/json")
  173. var params = mux.Vars(r)
  174. hostid := params["hostid"]
  175. relayHost, _, err := logic.DeleteHostRelay(hostid)
  176. if err != nil {
  177. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  178. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  179. return
  180. }
  181. logger.Log(1, r.Header.Get("user"), "deleted relay host", hostid)
  182. if servercfg.IsMessageQueueBackend() {
  183. go func() {
  184. if err := mq.PublishPeerUpdate(); err != nil {
  185. logger.Log(0, "fail to publish peer update: ", err.Error())
  186. }
  187. }()
  188. } else {
  189. queue.PublishAllPeerUpdate()
  190. }
  191. apiHostData := relayHost.ConvertNMHostToAPI()
  192. w.WriteHeader(http.StatusOK)
  193. json.NewEncoder(w).Encode(apiHostData)
  194. }