inet_gws.go 4.9 KB

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