inet_gws.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package controller
  2. import (
  3. "encoding/json"
  4. "errors"
  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/servercfg"
  12. )
  13. // @Summary Create an internet gateway
  14. // @Router /api/nodes/{network}/{nodeid}/inet_gw [post]
  15. // @Tags PRO
  16. // @Accept json
  17. // @Param network path string true "Network ID"
  18. // @Param nodeid path string true "Node ID"
  19. // @Param body body models.InetNodeReq true "Internet gateway request"
  20. // @Success 200 {object} models.Node
  21. // @Failure 400 {object} models.ErrorResponse
  22. // @Failure 500 {object} models.ErrorResponse
  23. func createInternetGw(w http.ResponseWriter, r *http.Request) {
  24. var params = mux.Vars(r)
  25. w.Header().Set("Content-Type", "application/json")
  26. nodeid := params["nodeid"]
  27. netid := params["network"]
  28. node, err := logic.ValidateParams(nodeid, netid)
  29. if err != nil {
  30. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  31. return
  32. }
  33. if node.IsInternetGateway {
  34. logic.ReturnSuccessResponse(w, r, "node is already acting as internet gateway")
  35. return
  36. }
  37. var request models.InetNodeReq
  38. err = json.NewDecoder(r.Body).Decode(&request)
  39. if err != nil {
  40. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  41. return
  42. }
  43. host, err := logic.GetHost(node.HostID.String())
  44. if err != nil {
  45. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  46. return
  47. }
  48. if host.OS != models.OS_Types.Linux {
  49. logic.ReturnErrorResponse(
  50. w,
  51. r,
  52. logic.FormatError(
  53. errors.New("only linux nodes can be made internet gws"),
  54. "badrequest",
  55. ),
  56. )
  57. return
  58. }
  59. err = logic.ValidateInetGwReq(node, request, false)
  60. if err != nil {
  61. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  62. return
  63. }
  64. logic.SetInternetGw(&node, request)
  65. if servercfg.IsPro {
  66. if _, exists := logic.FailOverExists(node.Network); exists {
  67. go func() {
  68. logic.ResetFailedOverPeer(&node)
  69. mq.PublishPeerUpdate(false)
  70. }()
  71. }
  72. go func() {
  73. logic.ResetAutoRelayedPeer(&node)
  74. mq.PublishPeerUpdate(false)
  75. }()
  76. }
  77. if node.IsGw && node.IngressDNS == "" {
  78. node.IngressDNS = "1.1.1.1"
  79. }
  80. err = logic.UpsertNode(&node)
  81. if err != nil {
  82. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  83. return
  84. }
  85. apiNode := node.ConvertToAPINode()
  86. logger.Log(
  87. 1,
  88. r.Header.Get("user"),
  89. "created ingress gateway on node",
  90. nodeid,
  91. "on network",
  92. netid,
  93. )
  94. w.WriteHeader(http.StatusOK)
  95. json.NewEncoder(w).Encode(apiNode)
  96. go mq.PublishPeerUpdate(false)
  97. }
  98. // @Summary Update an internet gateway
  99. // @Router /api/nodes/{network}/{nodeid}/inet_gw [put]
  100. // @Tags PRO
  101. // @Accept json
  102. // @Param network path string true "Network ID"
  103. // @Param nodeid path string true "Node ID"
  104. // @Param body body models.InetNodeReq true "Internet gateway request"
  105. // @Success 200 {object} models.Node
  106. // @Failure 400 {object} models.ErrorResponse
  107. // @Failure 500 {object} models.ErrorResponse
  108. func updateInternetGw(w http.ResponseWriter, r *http.Request) {
  109. var params = mux.Vars(r)
  110. w.Header().Set("Content-Type", "application/json")
  111. nodeid := params["nodeid"]
  112. netid := params["network"]
  113. node, err := logic.ValidateParams(nodeid, netid)
  114. if err != nil {
  115. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  116. return
  117. }
  118. var request models.InetNodeReq
  119. err = json.NewDecoder(r.Body).Decode(&request)
  120. if err != nil {
  121. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  122. return
  123. }
  124. if !node.IsInternetGateway {
  125. logic.ReturnErrorResponse(
  126. w,
  127. r,
  128. logic.FormatError(errors.New("node is not a internet gw"), "badrequest"),
  129. )
  130. return
  131. }
  132. err = logic.ValidateInetGwReq(node, request, true)
  133. if err != nil {
  134. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  135. return
  136. }
  137. logic.UnsetInternetGw(&node)
  138. logic.SetInternetGw(&node, request)
  139. err = logic.UpsertNode(&node)
  140. if err != nil {
  141. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  142. return
  143. }
  144. apiNode := node.ConvertToAPINode()
  145. logger.Log(
  146. 1,
  147. r.Header.Get("user"),
  148. "created ingress gateway on node",
  149. nodeid,
  150. "on network",
  151. netid,
  152. )
  153. w.WriteHeader(http.StatusOK)
  154. json.NewEncoder(w).Encode(apiNode)
  155. go mq.PublishPeerUpdate(false)
  156. }
  157. // @Summary Delete an internet gateway
  158. // @Router /api/nodes/{network}/{nodeid}/inet_gw [delete]
  159. // @Tags PRO
  160. // @Param network path string true "Network ID"
  161. // @Param nodeid path string true "Node ID"
  162. // @Success 200 {object} models.Node
  163. // @Failure 400 {object} models.ErrorResponse
  164. // @Failure 500 {object} models.ErrorResponse
  165. func deleteInternetGw(w http.ResponseWriter, r *http.Request) {
  166. var params = mux.Vars(r)
  167. w.Header().Set("Content-Type", "application/json")
  168. nodeid := params["nodeid"]
  169. netid := params["network"]
  170. node, err := logic.ValidateParams(nodeid, netid)
  171. if err != nil {
  172. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  173. return
  174. }
  175. logic.UnsetInternetGw(&node)
  176. err = logic.UpsertNode(&node)
  177. if err != nil {
  178. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  179. return
  180. }
  181. apiNode := node.ConvertToAPINode()
  182. logger.Log(
  183. 1,
  184. r.Header.Get("user"),
  185. "created ingress gateway on node",
  186. nodeid,
  187. "on network",
  188. netid,
  189. )
  190. w.WriteHeader(http.StatusOK)
  191. json.NewEncoder(w).Encode(apiNode)
  192. go mq.PublishPeerUpdate(false)
  193. }