Bläddra i källkod

use single DB, fix update nat boolean field

abhishek9686 5 månader sedan
förälder
incheckning
2254ec389a
8 ändrade filer med 103 tillägg och 39 borttagningar
  1. 48 21
      controllers/egress.go
  2. 4 3
      db/sqlite.go
  3. 3 0
      go.mod
  4. 8 0
      go.sum
  5. 8 3
      logic/egress.go
  6. 30 12
      models/egress.go
  7. 1 0
      models/structs.go
  8. 1 0
      schema/models.go

+ 48 - 21
controllers/egress.go

@@ -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

+ 4 - 3
db/sqlite.go

@@ -1,11 +1,12 @@
 package db
 
 import (
+	"os"
+	"path/filepath"
+
 	"gorm.io/driver/sqlite"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
-	"os"
-	"path/filepath"
 )
 
 // sqliteConnector for initializing and
@@ -28,7 +29,7 @@ func (s *sqliteConnector) connect() (*gorm.DB, error) {
 		}
 	}
 
-	dbFilePath := filepath.Join("data", "netmaker_v1.db")
+	dbFilePath := filepath.Join("data", "netmaker.db")
 
 	// ensure netmaker_v1.db exists.
 	_, err = os.Stat(dbFilePath)

+ 3 - 0
go.mod

@@ -54,6 +54,7 @@ require (
 	cloud.google.com/go/compute/metadata v0.3.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.8 // indirect
 	github.com/go-jose/go-jose/v3 v3.0.3 // indirect
+	github.com/go-sql-driver/mysql v1.8.1 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/jackc/pgpassfile v1.0.0 // indirect
 	github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
@@ -66,6 +67,8 @@ require (
 	github.com/seancfoley/bintree v1.3.1 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
+	gorm.io/datatypes v1.2.5 // indirect
+	gorm.io/driver/mysql v1.5.6 // indirect
 	gorm.io/driver/postgres v1.5.11 // indirect
 	gorm.io/driver/sqlite v1.5.7 // indirect
 	gorm.io/gorm v1.25.12 // indirect

+ 8 - 0
go.sum

@@ -29,6 +29,9 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
 github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
 github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg=
 github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
 github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
 github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
@@ -183,9 +186,14 @@ gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I=
+gorm.io/datatypes v1.2.5/go.mod h1:I5FUdlKpLb5PMqeMQhm30CQ6jXP8Rj89xkTeCSAaAD4=
+gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=
+gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
 gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
 gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
 gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I=
 gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
+gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
 gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=

+ 8 - 3
logic/egress.go

@@ -6,12 +6,12 @@ func ValidateEgressReq(e *models.Egress) bool {
 	if e.Network == "" {
 		return false
 	}
-	if e.Range.IP == nil {
+	if e.Range == "" {
 		return false
 	}
 	if len(e.Nodes) != 0 {
-		for _, nodeID := range e.Nodes {
-			_, err := GetNodeByID(nodeID)
+		for k := range e.Nodes {
+			_, err := GetNodeByID(k)
 			if err != nil {
 				return false
 			}
@@ -19,3 +19,8 @@ func ValidateEgressReq(e *models.Egress) bool {
 	}
 	return true
 }
+
+// func GetEgressFwRules(targetNode *models.Node) (m map[string]models.EgressInfo) {
+// 	eli, _ := (&models.Egress{}).ListByNetwork()
+
+// }

+ 30 - 12
models/egress.go

@@ -2,25 +2,37 @@ package models
 
 import (
 	"context"
-	"net"
 	"time"
 
 	"github.com/gravitl/netmaker/db"
+	"gorm.io/datatypes"
 )
 
-const egressTable = "egress"
+const egressTable = "egresses"
+
+type EgressReq struct {
+	ID          string   `json:"id"`
+	Name        string   `json:"name"`
+	Network     string   `json:"network"`
+	Description string   `json:"description"`
+	Nodes       []string `json:"nodes"`
+	Tags        []string `json:"tags"`
+	Range       string   `json:"range"`
+	Nat         bool     `json:"nat"`
+}
 
 type Egress struct {
-	ID          string    `gorm:"id,primary_key" json:"id"`
-	Name        string    `gorm:"name" json:"name"`
-	Network     string    `gorm:"network" json:"network"`
-	Description string    `gorm:"description" json:"description"`
-	Nodes       []string  `gorm:"nodes" json:"nodes"`
-	Tags        []TagID   `gorm:"tags" json:"tags"`
-	Range       net.IPNet `gorm:"range" json:"range"`
-	CreatedBy   string    `json:"created_by"`
-	CreatedAt   time.Time `json:"created_at"`
-	UpdatedAt   time.Time `json:"updated_at"`
+	ID          string            `gorm:"id,primary_key" json:"id"`
+	Name        string            `gorm:"name" json:"name"`
+	Network     string            `gorm:"network" json:"network"`
+	Description string            `gorm:"description" json:"description"`
+	Nodes       datatypes.JSONMap `gorm:"nodes" json:"nodes"`
+	Tags        datatypes.JSONMap `gorm:"tags" json:"tags"`
+	Range       string            `gorm:"range" json:"range"`
+	Nat         bool              `gorm:"nat" json:"nat"`
+	CreatedBy   string            `gorm:"created_by" json:"created_by"`
+	CreatedAt   time.Time         `gorm:"created_at" json:"created_at"`
+	UpdatedAt   time.Time         `gorm:"updated_at" json:"updated_at"`
 }
 
 func (e *Egress) Table() string {
@@ -35,6 +47,12 @@ func (e *Egress) Update() error {
 	return db.FromContext(context.TODO()).Table(e.Table()).Where("id = ?", e.ID).Updates(&e).Error
 }
 
+func (e *Egress) UpdateNatStatus() error {
+	return db.FromContext(context.TODO()).Table(e.Table()).Where("id = ?", e.ID).Updates(map[string]any{
+		"nat": e.Nat,
+	}).Error
+}
+
 func (e *Egress) Create() error {
 	return db.FromContext(context.TODO()).Table(e.Table()).Create(&e).Error
 }

+ 1 - 0
models/structs.go

@@ -156,6 +156,7 @@ type ExtPeersResponse struct {
 type EgressRangeMetric struct {
 	Network     string `json:"network"`
 	RouteMetric uint32 `json:"route_metric"` // preffered range 1-999
+	Nat         bool   `json:"nat"`
 }
 
 // EgressGatewayRequest - egress gateway request

+ 1 - 0
schema/models.go

@@ -7,5 +7,6 @@ func ListModels() []interface{} {
 	return []interface{}{
 		&Job{},
 		&models.UserAccessToken{},
+		&models.Egress{},
 	}
 }