ソースを参照

add discover field

abhishek9686 5 ヶ月 前
コミット
3a0a22f4d3
4 ファイル変更39 行追加14 行削除
  1. 5 0
      controllers/hosts.go
  2. 1 0
      logic/dns.go
  3. 30 12
      logic/egress.go
  4. 3 2
      models/host.go

+ 5 - 0
controllers/hosts.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"net/http"
+	"reflect"
 	"time"
 
 	"github.com/google/uuid"
@@ -271,6 +272,10 @@ func updateHost(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}
+	if !reflect.DeepEqual(currHost.EgressServices, newHost.EgressServices) {
+		// update egress range on nodes
+		logic.MapExternalServicesToHostNodes(newHost)
+	}
 	// publish host update through MQ
 	if err := mq.HostUpdate(&models.HostUpdate{
 		Action: models.UpdateHost,

+ 1 - 0
logic/dns.go

@@ -335,6 +335,7 @@ func GetAdditionalNameservers() (ns []string) {
 		if ips, ok := host.EgressServices["DNS"]; ok {
 			for _, ip := range ips {
 				ns = append(ns, ip.NATIP.String())
+				ns = append(ns, ip.EgressIP.String())
 			}
 		}
 	}

+ 30 - 12
logic/egress.go

@@ -3,6 +3,7 @@ package logic
 import (
 	"errors"
 	"fmt"
+	"log/slog"
 	"math/big"
 	"net"
 	"slices"
@@ -43,6 +44,17 @@ func AutoConfigureEgress(h *models.Host, node *models.Node) {
 	})
 }
 
+func ToIPNet(ipaddr net.IP) *net.IPNet {
+	addrIpNet := net.IPNet{
+		IP:   ipaddr,
+		Mask: net.CIDRMask(32, 32),
+	}
+	if addrIpNet.IP.To4() == nil {
+		addrIpNet.Mask = net.CIDRMask(128, 128)
+	}
+	return &addrIpNet
+}
+
 func MapExternalServicesToHostNodes(h *models.Host) {
 	ranges := []string{}
 	rangesWithMetric := []models.EgressRangeMetric{}
@@ -52,11 +64,13 @@ func MapExternalServicesToHostNodes(h *models.Host) {
 			continue
 		}
 		for i, egressServiceIPs := range h.EgressServices {
-			for j, egressIPNat := range egressServiceIPs {
+			if len(egressServiceIPs) == 0 {
+				continue
+			}
+			for j, egressServiceIP := range egressServiceIPs {
 				currRangesWithMetric := GetEgressRangesWithMetric(models.NetworkID(node.Network))
-
-				addr := egressIPNat.EgressIP.String()
-				ranges = append(ranges, addr)
+				addr := ToIPNet(egressServiceIP.EgressIP)
+				ranges = append(ranges, addr.String())
 				for _, iface := range h.Interfaces {
 					if !iface.Address.IP.IsPrivate() || iface.Name == h.DefaultInterface {
 						continue
@@ -65,21 +79,21 @@ func MapExternalServicesToHostNodes(h *models.Host) {
 					if err != nil {
 						continue
 					}
-					if !ifaceAddr.Contains(egressIPNat.EgressIP) {
+					if !ifaceAddr.Contains(egressServiceIP.EgressIP) {
 						continue
 					}
-					egressNATIP, err := netmapTranslate(egressIPNat.EgressIP, ifaceAddr.String(), iface.VirtualNATAddr.String())
+					egressNATIP, err := netmapTranslate(egressServiceIP.EgressIP, ifaceAddr.String(), iface.VirtualNATAddr.String())
 					if err != nil {
 						continue
 					}
-					egressIPNat.NATIP = egressNATIP
-					egressServiceIPs[j] = egressIPNat
+					egressServiceIP.NATIP = egressNATIP
+					egressServiceIPs[j] = egressServiceIP
 					rangeWithMetric := models.EgressRangeMetric{
-						Network:           addr,
-						VirtualNATNetwork: egressNATIP.String(),
+						Network:           addr.String(),
+						VirtualNATNetwork: ToIPNet(egressServiceIP.NATIP).String(),
 						RouteMetric:       256,
 					}
-					if currRangeMetric, ok := currRangesWithMetric[addr]; ok {
+					if currRangeMetric, ok := currRangesWithMetric[addr.String()]; ok {
 						lastMetricValue := currRangeMetric[len(currRangeMetric)-1]
 						rangeWithMetric.RouteMetric = lastMetricValue.RouteMetric + 10
 					}
@@ -91,13 +105,17 @@ func MapExternalServicesToHostNodes(h *models.Host) {
 
 		}
 		if !node.IsEgressGateway {
-			CreateEgressGateway(models.EgressGatewayRequest{
+			fmt.Printf("Configuring EGRESS GW: Ranges: %+v, RANGE METRIC: %+v\n", ranges, rangesWithMetric)
+			_, err := CreateEgressGateway(models.EgressGatewayRequest{
 				NodeID:           node.ID.String(),
 				NetID:            node.Network,
 				NatEnabled:       "yes",
 				Ranges:           ranges,
 				RangesWithMetric: rangesWithMetric,
 			})
+			if err != nil {
+				slog.Error("failed to create egress node for external services ", "err", err.Error())
+			}
 		} else {
 			node.EgressGatewayRequest.Ranges = append(node.EgressGatewayRequest.Ranges, ranges...)
 			node.EgressGatewayRequest.RangesWithMetric = append(node.EgressGatewayRequest.RangesWithMetric, rangesWithMetric...)

+ 3 - 2
models/host.go

@@ -76,8 +76,9 @@ type Host struct {
 }
 
 type EgressIPNat struct {
-	EgressIP net.IP
-	NATIP    net.IP
+	EgressIP net.IP `json:"egress_ip"`
+	NATIP    net.IP `json:"egress_nat_ip"`
+	Discover bool   `json:"discover"`
 }
 
 // FormatBool converts a boolean to a [yes|no] string