Kaynağa Gözat

add migration to convert to new egress model

abhishek9686 5 ay önce
ebeveyn
işleme
965f28d65e
5 değiştirilmiş dosya ile 74 ekleme ve 22 silme
  1. 4 10
      controllers/egress.go
  2. 22 4
      logic/egress.go
  3. 2 0
      logic/peers.go
  4. 38 0
      migrate/migrate.go
  5. 8 8
      models/egress.go

+ 4 - 10
controllers/egress.go

@@ -52,11 +52,8 @@ func createEgress(w http.ResponseWriter, r *http.Request) {
 		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{}{}
+	for nodeID, metric := range req.Nodes {
+		e.Nodes[nodeID] = metric
 	}
 	if !logic.ValidateEgressReq(&e) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("invalid egress request"), "badrequest"))
@@ -130,11 +127,8 @@ func updateEgress(w http.ResponseWriter, r *http.Request) {
 	}
 	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{}{}
+	for nodeID, metric := range req.Nodes {
+		e.Nodes[nodeID] = metric
 	}
 	var updateNat bool
 	if req.Nat != e.Nat {

+ 22 - 4
logic/egress.go

@@ -36,7 +36,25 @@ func ValidateEgressReq(e *models.Egress) bool {
 	return true
 }
 
-// func GetEgressFwRules(targetNode *models.Node) (m map[string]models.EgressInfo) {
-// 	eli, _ := (&models.Egress{}).ListByNetwork()
-
-// }
+func GetNodeEgressInfo(targetNode *models.Node) {
+	eli, _ := (&models.Egress{}).ListByNetwork()
+	req := models.EgressGatewayRequest{
+		NodeID: targetNode.ID.String(),
+		NetID:  targetNode.Network,
+	}
+	for _, e := range eli {
+		if metric, ok := e.Nodes[targetNode.ID.String()]; ok {
+			req.Ranges = append(req.Ranges, e.Range)
+			req.RangesWithMetric = append(req.RangesWithMetric, models.EgressRangeMetric{
+				Network:     e.Range,
+				Nat:         e.Nat,
+				RouteMetric: metric.(uint32),
+			})
+		}
+	}
+	if len(req.Ranges) > 0 {
+		targetNode.IsEgressGateway = true
+		targetNode.EgressGatewayRanges = req.Ranges
+		targetNode.EgressGatewayRequest = req
+	}
+}

+ 2 - 0
logic/peers.go

@@ -227,6 +227,7 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N
 		if err != nil {
 			continue
 		}
+		GetNodeEgressInfo(&node)
 		hostPeerUpdate.NameServers = append(hostPeerUpdate.NameServers, networkSettings.NameServers...)
 		currentPeers := GetNetworkNodesMemory(allNodes, node.Network)
 		for _, peer := range currentPeers {
@@ -247,6 +248,7 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N
 				PersistentKeepaliveInterval: &peerHost.PersistentKeepalive,
 				ReplaceAllowedIPs:           true,
 			}
+			GetNodeEgressInfo(&peer)
 			_, isFailOverPeer := node.FailOverPeers[peer.ID.String()]
 			if peer.IsEgressGateway {
 				peerKey := peerHost.PublicKey.String()

+ 38 - 0
migrate/migrate.go

@@ -7,6 +7,7 @@ import (
 	"time"
 
 	"golang.org/x/exp/slog"
+	"gorm.io/datatypes"
 
 	"github.com/google/uuid"
 	"github.com/gravitl/netmaker/database"
@@ -29,6 +30,7 @@ func Run() {
 	updateNodes()
 	updateAcls()
 	migrateToGws()
+	migrateToEgressV1()
 }
 
 func assignSuperAdmin() {
@@ -497,3 +499,39 @@ func migrateToGws() {
 		logic.DeleteTag(models.TagID(fmt.Sprintf("%s.%s", netI.NetID, models.OldRemoteAccessTagName)), true)
 	}
 }
+
+func migrateToEgressV1() {
+	nodes, _ := logic.GetAllNodes()
+	user, err := logic.GetSuperAdmin()
+	if err != nil {
+		return
+	}
+	for _, node := range nodes {
+		if node.IsEgressGateway {
+			for _, rangeI := range node.EgressGatewayRequest.Ranges {
+				e := models.Egress{
+					ID:          uuid.New().String(),
+					Name:        rangeI,
+					Description: "add description",
+					Network:     node.Network,
+					Nodes: datatypes.JSONMap{
+						node.ID.String(): 256,
+					},
+					Tags:      make(datatypes.JSONMap),
+					Range:     rangeI,
+					Nat:       node.EgressGatewayRequest.NatEnabled == "yes",
+					CreatedBy: user.UserName,
+					CreatedAt: time.Now().UTC(),
+				}
+				err = e.Create()
+				if err == nil {
+					node.IsEgressGateway = false
+					node.EgressGatewayRequest = models.EgressGatewayRequest{}
+					node.EgressGatewayNatEnabled = false
+					node.EgressGatewayRanges = []string{}
+					logic.UpsertNode(&node)
+				}
+			}
+		}
+	}
+}

+ 8 - 8
models/egress.go

@@ -11,14 +11,14 @@ import (
 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"`
+	ID          string         `json:"id"`
+	Name        string         `json:"name"`
+	Network     string         `json:"network"`
+	Description string         `json:"description"`
+	Nodes       map[string]int `json:"nodes"`
+	Tags        []string       `json:"tags"`
+	Range       string         `json:"range"`
+	Nat         bool           `json:"nat"`
 }
 
 type Egress struct {