inet_gws.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. }
  73. if node.IsGw && node.IngressDNS == "" {
  74. node.IngressDNS = "1.1.1.1"
  75. }
  76. err = logic.UpsertNode(&node)
  77. if err != nil {
  78. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  79. return
  80. }
  81. apiNode := node.ConvertToAPINode()
  82. logger.Log(
  83. 1,
  84. r.Header.Get("user"),
  85. "created ingress gateway on node",
  86. nodeid,
  87. "on network",
  88. netid,
  89. )
  90. w.WriteHeader(http.StatusOK)
  91. json.NewEncoder(w).Encode(apiNode)
  92. go mq.PublishPeerUpdate(false)
  93. }
  94. // @Summary Update an internet gateway
  95. // @Router /api/nodes/{network}/{nodeid}/inet_gw [put]
  96. // @Tags PRO
  97. // @Accept json
  98. // @Param network path string true "Network ID"
  99. // @Param nodeid path string true "Node ID"
  100. // @Param body body models.InetNodeReq true "Internet gateway request"
  101. // @Success 200 {object} models.Node
  102. // @Failure 400 {object} models.ErrorResponse
  103. // @Failure 500 {object} models.ErrorResponse
  104. func updateInternetGw(w http.ResponseWriter, r *http.Request) {
  105. var params = mux.Vars(r)
  106. w.Header().Set("Content-Type", "application/json")
  107. nodeid := params["nodeid"]
  108. netid := params["network"]
  109. node, err := logic.ValidateParams(nodeid, netid)
  110. if err != nil {
  111. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  112. return
  113. }
  114. var request models.InetNodeReq
  115. err = json.NewDecoder(r.Body).Decode(&request)
  116. if err != nil {
  117. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  118. return
  119. }
  120. if !node.IsInternetGateway {
  121. logic.ReturnErrorResponse(
  122. w,
  123. r,
  124. logic.FormatError(errors.New("node is not a internet gw"), "badrequest"),
  125. )
  126. return
  127. }
  128. err = logic.ValidateInetGwReq(node, request, true)
  129. if err != nil {
  130. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  131. return
  132. }
  133. logic.UnsetInternetGw(&node)
  134. logic.SetInternetGw(&node, request)
  135. err = logic.UpsertNode(&node)
  136. if err != nil {
  137. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  138. return
  139. }
  140. apiNode := node.ConvertToAPINode()
  141. logger.Log(
  142. 1,
  143. r.Header.Get("user"),
  144. "created ingress gateway on node",
  145. nodeid,
  146. "on network",
  147. netid,
  148. )
  149. w.WriteHeader(http.StatusOK)
  150. json.NewEncoder(w).Encode(apiNode)
  151. go mq.PublishPeerUpdate(false)
  152. }
  153. // @Summary Delete an internet gateway
  154. // @Router /api/nodes/{network}/{nodeid}/inet_gw [delete]
  155. // @Tags PRO
  156. // @Param network path string true "Network ID"
  157. // @Param nodeid path string true "Node ID"
  158. // @Success 200 {object} models.Node
  159. // @Failure 400 {object} models.ErrorResponse
  160. // @Failure 500 {object} models.ErrorResponse
  161. func deleteInternetGw(w http.ResponseWriter, r *http.Request) {
  162. var params = mux.Vars(r)
  163. w.Header().Set("Content-Type", "application/json")
  164. nodeid := params["nodeid"]
  165. netid := params["network"]
  166. node, err := logic.ValidateParams(nodeid, netid)
  167. if err != nil {
  168. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  169. return
  170. }
  171. logic.UnsetInternetGw(&node)
  172. err = logic.UpsertNode(&node)
  173. if err != nil {
  174. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  175. return
  176. }
  177. apiNode := node.ConvertToAPINode()
  178. logger.Log(
  179. 1,
  180. r.Header.Get("user"),
  181. "created ingress gateway on node",
  182. nodeid,
  183. "on network",
  184. netid,
  185. )
  186. w.WriteHeader(http.StatusOK)
  187. json.NewEncoder(w).Encode(apiNode)
  188. go mq.PublishPeerUpdate(false)
  189. }