|
@@ -11,6 +11,7 @@ import (
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
|
"github.com/gravitl/netmaker/logic"
|
|
|
"github.com/gravitl/netmaker/models"
|
|
|
+ "gorm.io/datatypes"
|
|
|
)
|
|
|
|
|
|
func egressHandlers(r *mux.Router) {
|
|
@@ -31,7 +32,7 @@ func egressHandlers(r *mux.Router) {
|
|
|
// @Failure 500 {object} models.ErrorResponse
|
|
|
func createEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
- var req models.Egress
|
|
|
+ var req models.EgressReq
|
|
|
err := json.NewDecoder(r.Body).Decode(&req)
|
|
|
if err != nil {
|
|
|
logger.Log(0, "error decoding request body: ",
|
|
@@ -39,15 +40,29 @@ func createEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- if !logic.ValidateEgressReq(&req) {
|
|
|
+ e := models.Egress{
|
|
|
+ ID: uuid.New().String(),
|
|
|
+ Name: req.Name,
|
|
|
+ Network: req.Network,
|
|
|
+ Description: req.Description,
|
|
|
+ Range: req.Range,
|
|
|
+ Nat: req.Nat,
|
|
|
+ Nodes: make(datatypes.JSONMap),
|
|
|
+ Tags: make(datatypes.JSONMap),
|
|
|
+ CreatedBy: r.Header.Get("user"),
|
|
|
+ CreatedAt: time.Now().UTC(),
|
|
|
+ }
|
|
|
+ for _, nodeID := range req.Nodes {
|
|
|
+ e.Nodes[nodeID] = struct{}{}
|
|
|
+ }
|
|
|
+ for _, tagID := range req.Tags {
|
|
|
+ e.Tags[tagID] = struct{}{}
|
|
|
+ }
|
|
|
+ if !logic.ValidateEgressReq(&e) {
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("invalid egress request"), "badrequest"))
|
|
|
return
|
|
|
}
|
|
|
- req.ID = uuid.New().String()
|
|
|
- req.CreatedBy = r.Header.Get("user")
|
|
|
- req.CreatedAt = time.Now().UTC()
|
|
|
- err = req.Create()
|
|
|
+ err = e.Create()
|
|
|
if err != nil {
|
|
|
logic.ReturnErrorResponse(
|
|
|
w,
|
|
@@ -72,7 +87,7 @@ func listEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
network := r.URL.Query().Get("network")
|
|
|
if network == "" {
|
|
|
- logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("username is required"), "badrequest"))
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("network is required"), "badrequest"))
|
|
|
return
|
|
|
}
|
|
|
e := models.Egress{Network: network}
|
|
@@ -81,7 +96,7 @@ func listEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
logic.ReturnErrorResponse(
|
|
|
w,
|
|
|
r,
|
|
|
- logic.FormatError(errors.New("error creating egress resource"+err.Error()), "internal"),
|
|
|
+ logic.FormatError(errors.New("error listing egress resource"+err.Error()), "internal"),
|
|
|
)
|
|
|
return
|
|
|
}
|
|
@@ -99,7 +114,7 @@ func listEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
// @Failure 500 {object} models.ErrorResponse
|
|
|
func updateEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
- var req models.Egress
|
|
|
+ var req models.EgressReq
|
|
|
err := json.NewDecoder(r.Body).Decode(&req)
|
|
|
if err != nil {
|
|
|
logger.Log(0, "error decoding request body: ",
|
|
@@ -113,12 +128,23 @@ func updateEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
return
|
|
|
}
|
|
|
- e.Nodes = req.Nodes
|
|
|
- e.Tags = req.Tags
|
|
|
+ e.Nodes = make(datatypes.JSONMap)
|
|
|
+ e.Tags = make(datatypes.JSONMap)
|
|
|
+ for _, nodeID := range req.Nodes {
|
|
|
+ e.Nodes[nodeID] = struct{}{}
|
|
|
+ }
|
|
|
+ for _, tagID := range req.Tags {
|
|
|
+ e.Tags[tagID] = struct{}{}
|
|
|
+ }
|
|
|
+ var updateNat bool
|
|
|
+ if req.Nat != e.Nat {
|
|
|
+ updateNat = true
|
|
|
+ }
|
|
|
e.Range = req.Range
|
|
|
e.Description = req.Description
|
|
|
+ e.Name = req.Name
|
|
|
e.UpdatedAt = time.Now().UTC()
|
|
|
- if !logic.ValidateEgressReq(&req) {
|
|
|
+ if !logic.ValidateEgressReq(&e) {
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("invalid egress request"), "badrequest"))
|
|
|
return
|
|
|
}
|
|
@@ -131,6 +157,10 @@ func updateEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
)
|
|
|
return
|
|
|
}
|
|
|
+ if updateNat {
|
|
|
+ e.Nat = req.Nat
|
|
|
+ e.UpdateNatStatus()
|
|
|
+ }
|
|
|
logic.ReturnSuccessResponseWithJson(w, r, req, "updated egress resource")
|
|
|
}
|
|
|
|
|
@@ -145,16 +175,13 @@ func updateEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
// @Failure 500 {object} models.ErrorResponse
|
|
|
func deleteEgress(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
- var req models.Egress
|
|
|
- err := json.NewDecoder(r.Body).Decode(&req)
|
|
|
- if err != nil {
|
|
|
- logger.Log(0, "error decoding request body: ",
|
|
|
- err.Error())
|
|
|
- logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
+ id := r.URL.Query().Get("id")
|
|
|
+ if id == "" {
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("id is required"), "badrequest"))
|
|
|
return
|
|
|
}
|
|
|
- e := models.Egress{ID: req.ID}
|
|
|
- err = e.Delete()
|
|
|
+ e := models.Egress{ID: id}
|
|
|
+ err := e.Delete()
|
|
|
if err != nil {
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
|
|
return
|