network.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. package controller
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "github.com/gorilla/mux"
  9. "github.com/gravitl/netmaker/database"
  10. "github.com/gravitl/netmaker/logger"
  11. "github.com/gravitl/netmaker/logic"
  12. "github.com/gravitl/netmaker/logic/acls"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/mq"
  15. "github.com/gravitl/netmaker/servercfg"
  16. )
  17. func networkHandlers(r *mux.Router) {
  18. r.HandleFunc("/api/networks", logic.SecurityCheck(false, http.HandlerFunc(getNetworks))).Methods(http.MethodGet)
  19. r.HandleFunc("/api/networks", logic.SecurityCheck(true, checkFreeTierLimits(networks_l, http.HandlerFunc(createNetwork)))).Methods(http.MethodPost)
  20. r.HandleFunc("/api/networks/{networkname}", logic.SecurityCheck(false, http.HandlerFunc(getNetwork))).Methods(http.MethodGet)
  21. r.HandleFunc("/api/networks/{networkname}", logic.SecurityCheck(false, http.HandlerFunc(updateNetwork))).Methods(http.MethodPut)
  22. r.HandleFunc("/api/networks/{networkname}", logic.SecurityCheck(true, http.HandlerFunc(deleteNetwork))).Methods(http.MethodDelete)
  23. // ACLs
  24. r.HandleFunc("/api/networks/{networkname}/acls", logic.SecurityCheck(true, http.HandlerFunc(updateNetworkACL))).Methods(http.MethodPut)
  25. r.HandleFunc("/api/networks/{networkname}/acls", logic.SecurityCheck(true, http.HandlerFunc(getNetworkACL))).Methods(http.MethodGet)
  26. }
  27. // swagger:route GET /api/networks networks getNetworks
  28. //
  29. // Lists all networks.
  30. //
  31. // Schemes: https
  32. //
  33. // Security:
  34. // oauth
  35. //
  36. // Responses:
  37. // 200: getNetworksSliceResponse
  38. func getNetworks(w http.ResponseWriter, r *http.Request) {
  39. headerNetworks := r.Header.Get("networks")
  40. networksSlice := []string{}
  41. marshalErr := json.Unmarshal([]byte(headerNetworks), &networksSlice)
  42. if marshalErr != nil {
  43. logger.Log(0, r.Header.Get("user"), "error unmarshalling networks: ",
  44. marshalErr.Error())
  45. logic.ReturnErrorResponse(w, r, logic.FormatError(marshalErr, "badrequest"))
  46. return
  47. }
  48. allnetworks := []models.Network{}
  49. var err error
  50. if len(networksSlice) > 0 && networksSlice[0] == logic.ALL_NETWORK_ACCESS {
  51. allnetworks, err = logic.GetNetworks()
  52. if err != nil && !database.IsEmptyRecord(err) {
  53. logger.Log(0, r.Header.Get("user"), "failed to fetch networks: ", err.Error())
  54. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  55. return
  56. }
  57. } else {
  58. for _, network := range networksSlice {
  59. netObject, parentErr := logic.GetParentNetwork(network)
  60. if parentErr == nil {
  61. allnetworks = append(allnetworks, netObject)
  62. }
  63. }
  64. }
  65. logger.Log(2, r.Header.Get("user"), "fetched networks.")
  66. w.WriteHeader(http.StatusOK)
  67. json.NewEncoder(w).Encode(allnetworks)
  68. }
  69. // swagger:route GET /api/networks/{networkname} networks getNetwork
  70. //
  71. // Get a network.
  72. //
  73. // Schemes: https
  74. //
  75. // Security:
  76. // oauth
  77. //
  78. // Responses:
  79. // 200: networkBodyResponse
  80. func getNetwork(w http.ResponseWriter, r *http.Request) {
  81. // set header.
  82. w.Header().Set("Content-Type", "application/json")
  83. var params = mux.Vars(r)
  84. netname := params["networkname"]
  85. network, err := logic.GetNetwork(netname)
  86. if err != nil {
  87. logger.Log(0, r.Header.Get("user"), fmt.Sprintf("failed to fetch network [%s] info: %v",
  88. netname, err))
  89. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  90. return
  91. }
  92. logger.Log(2, r.Header.Get("user"), "fetched network", netname)
  93. w.WriteHeader(http.StatusOK)
  94. json.NewEncoder(w).Encode(network)
  95. }
  96. // swagger:route PUT /api/networks/{networkname} networks updateNetwork
  97. //
  98. // Update a network.
  99. //
  100. // Schemes: https
  101. //
  102. // Security:
  103. // oauth
  104. //
  105. // Responses:
  106. // 200: networkBodyResponse
  107. func updateNetwork(w http.ResponseWriter, r *http.Request) {
  108. w.Header().Set("Content-Type", "application/json")
  109. var params = mux.Vars(r)
  110. var network models.Network
  111. netname := params["networkname"]
  112. network, err := logic.GetParentNetwork(netname)
  113. if err != nil {
  114. logger.Log(0, r.Header.Get("user"), "failed to get network info: ",
  115. err.Error())
  116. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  117. return
  118. }
  119. var newNetwork models.Network
  120. err = json.NewDecoder(r.Body).Decode(&newNetwork)
  121. if err != nil {
  122. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  123. err.Error())
  124. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  125. return
  126. }
  127. rangeupdate4, rangeupdate6, holepunchupdate, groupsDelta, userDelta, err := logic.UpdateNetwork(&network, &newNetwork)
  128. if err != nil {
  129. logger.Log(0, r.Header.Get("user"), "failed to update network: ",
  130. err.Error())
  131. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  132. return
  133. }
  134. if len(groupsDelta) > 0 {
  135. for _, g := range groupsDelta {
  136. users, err := logic.GetGroupUsers(g)
  137. if err == nil {
  138. for _, user := range users {
  139. logic.AdjustNetworkUserPermissions(&user, &newNetwork)
  140. }
  141. }
  142. }
  143. }
  144. if len(userDelta) > 0 {
  145. for _, uname := range userDelta {
  146. user, err := logic.GetReturnUser(uname)
  147. if err == nil {
  148. logic.AdjustNetworkUserPermissions(&user, &newNetwork)
  149. }
  150. }
  151. }
  152. if rangeupdate4 {
  153. err = logic.UpdateNetworkNodeAddresses(network.NetID)
  154. if err != nil {
  155. logger.Log(0, r.Header.Get("user"),
  156. fmt.Sprintf("failed to update network [%s] ipv4 addresses: %v",
  157. network.NetID, err.Error()))
  158. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  159. return
  160. }
  161. }
  162. if rangeupdate6 {
  163. err = logic.UpdateNetworkNodeAddresses6(network.NetID)
  164. if err != nil {
  165. logger.Log(0, r.Header.Get("user"),
  166. fmt.Sprintf("failed to update network [%s] ipv6 addresses: %v",
  167. network.NetID, err.Error()))
  168. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  169. return
  170. }
  171. }
  172. if rangeupdate4 || rangeupdate6 || holepunchupdate {
  173. nodes, err := logic.GetNetworkNodes(network.NetID)
  174. if err != nil {
  175. logger.Log(0, r.Header.Get("user"),
  176. fmt.Sprintf("failed to get network [%s] nodes: %v",
  177. network.NetID, err.Error()))
  178. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  179. return
  180. }
  181. for _, node := range nodes {
  182. runUpdates(&node, true)
  183. }
  184. }
  185. logger.Log(1, r.Header.Get("user"), "updated network", netname)
  186. w.WriteHeader(http.StatusOK)
  187. json.NewEncoder(w).Encode(newNetwork)
  188. }
  189. // swagger:route PUT /api/networks/{networkname}/acls networks updateNetworkACL
  190. //
  191. // Update a network ACL (Access Control List).
  192. //
  193. // Schemes: https
  194. //
  195. // Security:
  196. // oauth
  197. //
  198. // Responses:
  199. // 200: aclContainerResponse
  200. func updateNetworkACL(w http.ResponseWriter, r *http.Request) {
  201. w.Header().Set("Content-Type", "application/json")
  202. var params = mux.Vars(r)
  203. netname := params["networkname"]
  204. var networkACLChange acls.ACLContainer
  205. networkACLChange, err := networkACLChange.Get(acls.ContainerID(netname))
  206. if err != nil {
  207. logger.Log(0, r.Header.Get("user"),
  208. fmt.Sprintf("failed to fetch ACLs for network [%s]: %v", netname, err))
  209. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  210. return
  211. }
  212. err = json.NewDecoder(r.Body).Decode(&networkACLChange)
  213. if err != nil {
  214. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  215. err.Error())
  216. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  217. return
  218. }
  219. newNetACL, err := networkACLChange.Save(acls.ContainerID(netname))
  220. if err != nil {
  221. logger.Log(0, r.Header.Get("user"),
  222. fmt.Sprintf("failed to update ACLs for network [%s]: %v", netname, err))
  223. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  224. return
  225. }
  226. logger.Log(1, r.Header.Get("user"), "updated ACLs for network", netname)
  227. // send peer updates
  228. if servercfg.IsMessageQueueBackend() {
  229. if err = mq.PublishPeerUpdate(); err != nil {
  230. logger.Log(0, "failed to publish peer update after ACL update on", netname)
  231. }
  232. }
  233. w.WriteHeader(http.StatusOK)
  234. json.NewEncoder(w).Encode(newNetACL)
  235. }
  236. // swagger:route GET /api/networks/{networkname}/acls networks getNetworkACL
  237. //
  238. // Get a network ACL (Access Control List).
  239. //
  240. // Schemes: https
  241. //
  242. // Security:
  243. // oauth
  244. //
  245. // Responses:
  246. // 200: aclContainerResponse
  247. func getNetworkACL(w http.ResponseWriter, r *http.Request) {
  248. w.Header().Set("Content-Type", "application/json")
  249. var params = mux.Vars(r)
  250. netname := params["networkname"]
  251. var networkACL acls.ACLContainer
  252. networkACL, err := networkACL.Get(acls.ContainerID(netname))
  253. if err != nil {
  254. logger.Log(0, r.Header.Get("user"),
  255. fmt.Sprintf("failed to fetch ACLs for network [%s]: %v", netname, err))
  256. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  257. return
  258. }
  259. logger.Log(2, r.Header.Get("user"), "fetched acl for network", netname)
  260. w.WriteHeader(http.StatusOK)
  261. json.NewEncoder(w).Encode(networkACL)
  262. }
  263. // swagger:route DELETE /api/networks/{networkname} networks deleteNetwork
  264. //
  265. // Delete a network. Will not delete if there are any nodes that belong to the network.
  266. //
  267. // Schemes: https
  268. //
  269. // Security:
  270. // oauth
  271. //
  272. // Responses:
  273. // 200: stringJSONResponse
  274. func deleteNetwork(w http.ResponseWriter, r *http.Request) {
  275. // Set header
  276. w.Header().Set("Content-Type", "application/json")
  277. var params = mux.Vars(r)
  278. network := params["networkname"]
  279. err := logic.DeleteNetwork(network)
  280. if err != nil {
  281. errtype := "badrequest"
  282. if strings.Contains(err.Error(), "Node check failed") {
  283. errtype = "forbidden"
  284. }
  285. logger.Log(0, r.Header.Get("user"),
  286. fmt.Sprintf("failed to delete network [%s]: %v", network, err))
  287. logic.ReturnErrorResponse(w, r, logic.FormatError(err, errtype))
  288. return
  289. }
  290. logger.Log(1, r.Header.Get("user"), "deleted network", network)
  291. w.WriteHeader(http.StatusOK)
  292. json.NewEncoder(w).Encode("success")
  293. }
  294. // swagger:route POST /api/networks networks createNetwork
  295. //
  296. // Create a network.
  297. //
  298. // Schemes: https
  299. //
  300. // Security:
  301. // oauth
  302. //
  303. // Responses:
  304. // 200: networkBodyResponse
  305. func createNetwork(w http.ResponseWriter, r *http.Request) {
  306. w.Header().Set("Content-Type", "application/json")
  307. var network models.Network
  308. // we decode our body request params
  309. err := json.NewDecoder(r.Body).Decode(&network)
  310. if err != nil {
  311. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  312. err.Error())
  313. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  314. return
  315. }
  316. if network.AddressRange == "" && network.AddressRange6 == "" {
  317. err := errors.New("IPv4 or IPv6 CIDR required")
  318. logger.Log(0, r.Header.Get("user"), "failed to create network: ",
  319. err.Error())
  320. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  321. return
  322. }
  323. network, err = logic.CreateNetwork(network)
  324. if err != nil {
  325. logger.Log(0, r.Header.Get("user"), "failed to create network: ",
  326. err.Error())
  327. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  328. return
  329. }
  330. defaultHosts := logic.GetDefaultHosts()
  331. for i := range defaultHosts {
  332. currHost := &defaultHosts[i]
  333. newNode, err := logic.UpdateHostNetwork(currHost, network.NetID, true)
  334. if err != nil {
  335. logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
  336. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  337. return
  338. }
  339. logger.Log(1, "added new node", newNode.ID.String(), "to host", currHost.Name)
  340. if err = mq.HostUpdate(&models.HostUpdate{
  341. Action: models.JoinHostToNetwork,
  342. Host: *currHost,
  343. Node: *newNode,
  344. }); err != nil {
  345. logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
  346. }
  347. }
  348. logger.Log(1, r.Header.Get("user"), "created network", network.NetID)
  349. w.WriteHeader(http.StatusOK)
  350. json.NewEncoder(w).Encode(network)
  351. }