inet_gws.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package controllers
  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. proLogic "github.com/gravitl/netmaker/pro/logic"
  12. "github.com/gravitl/netmaker/servercfg"
  13. )
  14. // InetHandlers - handlers for internet gw
  15. func InetHandlers(r *mux.Router) {
  16. r.HandleFunc("/api/nodes/{network}/{nodeid}/inet_gw", logic.SecurityCheck(true, http.HandlerFunc(createInternetGw))).Methods(http.MethodPost)
  17. r.HandleFunc("/api/nodes/{network}/{nodeid}/inet_gw", logic.SecurityCheck(true, http.HandlerFunc(updateInternetGw))).Methods(http.MethodPut)
  18. r.HandleFunc("/api/nodes/{network}/{nodeid}/inet_gw", logic.SecurityCheck(true, http.HandlerFunc(deleteInternetGw))).Methods(http.MethodDelete)
  19. }
  20. // swagger:route POST /api/nodes/{network}/{nodeid}/inet_gw nodes createInternetGw
  21. //
  22. // Create an inet node.
  23. //
  24. // Schemes: https
  25. //
  26. // Security:
  27. // oauth
  28. //
  29. // Responses:
  30. // 200: nodeResponse
  31. func createInternetGw(w http.ResponseWriter, r *http.Request) {
  32. var params = mux.Vars(r)
  33. w.Header().Set("Content-Type", "application/json")
  34. nodeid := params["nodeid"]
  35. netid := params["network"]
  36. node, err := logic.ValidateParams(nodeid, netid)
  37. if err != nil {
  38. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  39. return
  40. }
  41. if node.IsInternetGateway {
  42. logic.ReturnSuccessResponse(w, r, "node is already acting as internet gateway")
  43. return
  44. }
  45. var request models.InetNodeReq
  46. err = json.NewDecoder(r.Body).Decode(&request)
  47. if err != nil {
  48. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  49. return
  50. }
  51. host, err := logic.GetHost(node.HostID.String())
  52. if err != nil {
  53. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  54. return
  55. }
  56. if host.OS != models.OS_Types.Linux {
  57. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only linux nodes can be made internet gws"), "badrequest"))
  58. return
  59. }
  60. err = proLogic.ValidateInetGwReq(node, request, false)
  61. if err != nil {
  62. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  63. return
  64. }
  65. proLogic.SetInternetGw(&node, request)
  66. if servercfg.IsPro {
  67. if _, exists := proLogic.FailOverExists(node.Network); exists {
  68. go func() {
  69. proLogic.ResetFailedOverPeer(&node)
  70. mq.PublishPeerUpdate(false)
  71. }()
  72. }
  73. }
  74. err = logic.UpsertNode(&node)
  75. if err != nil {
  76. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  77. return
  78. }
  79. apiNode := node.ConvertToAPINode()
  80. logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)
  81. w.WriteHeader(http.StatusOK)
  82. json.NewEncoder(w).Encode(apiNode)
  83. go mq.PublishPeerUpdate(false)
  84. }
  85. // swagger:route PUT /api/nodes/{network}/{nodeid}/inet_gw nodes updateInternetGw
  86. //
  87. // update an inet node.
  88. //
  89. // Schemes: https
  90. //
  91. // Security:
  92. // oauth
  93. //
  94. // Responses:
  95. // 200: nodeResponse
  96. func updateInternetGw(w http.ResponseWriter, r *http.Request) {
  97. var params = mux.Vars(r)
  98. w.Header().Set("Content-Type", "application/json")
  99. nodeid := params["nodeid"]
  100. netid := params["network"]
  101. node, err := logic.ValidateParams(nodeid, netid)
  102. if err != nil {
  103. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  104. return
  105. }
  106. var request models.InetNodeReq
  107. err = json.NewDecoder(r.Body).Decode(&request)
  108. if err != nil {
  109. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  110. return
  111. }
  112. if !node.IsInternetGateway {
  113. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node is not a internet gw"), "badrequest"))
  114. return
  115. }
  116. err = proLogic.ValidateInetGwReq(node, request, true)
  117. if err != nil {
  118. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  119. return
  120. }
  121. proLogic.UnsetInternetGw(&node)
  122. proLogic.SetInternetGw(&node, request)
  123. err = logic.UpsertNode(&node)
  124. if err != nil {
  125. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  126. return
  127. }
  128. apiNode := node.ConvertToAPINode()
  129. logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)
  130. w.WriteHeader(http.StatusOK)
  131. json.NewEncoder(w).Encode(apiNode)
  132. go mq.PublishPeerUpdate(false)
  133. }
  134. // swagger:route DELETE /api/nodes/{network}/{nodeid}/inet_gw nodes deleteInternetGw
  135. //
  136. // Delete an internet gw.
  137. //
  138. // Schemes: https
  139. //
  140. // Security:
  141. // oauth
  142. //
  143. // Responses:
  144. // 200: nodeResponse
  145. func deleteInternetGw(w http.ResponseWriter, r *http.Request) {
  146. var params = mux.Vars(r)
  147. w.Header().Set("Content-Type", "application/json")
  148. nodeid := params["nodeid"]
  149. netid := params["network"]
  150. node, err := logic.ValidateParams(nodeid, netid)
  151. if err != nil {
  152. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  153. return
  154. }
  155. proLogic.UnsetInternetGw(&node)
  156. err = logic.UpsertNode(&node)
  157. if err != nil {
  158. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  159. return
  160. }
  161. apiNode := node.ConvertToAPINode()
  162. logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)
  163. w.WriteHeader(http.StatusOK)
  164. json.NewEncoder(w).Encode(apiNode)
  165. go mq.PublishPeerUpdate(false)
  166. }