inet_gws.go 5.9 KB

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