Browse Source

Merge pull request #1514 from gravitl/feature_v0.15.1_normalize_networks

normalize cidr on network/egress gateway creation
Alex Feiszli 2 years ago
parent
commit
6a6b55623a
3 changed files with 39 additions and 0 deletions
  1. 8 0
      logic/gateway.go
  2. 14 0
      logic/networks.go
  3. 17 0
      logic/util.go

+ 8 - 0
logic/gateway.go

@@ -14,6 +14,14 @@ import (
 
 // CreateEgressGateway - creates an egress gateway
 func CreateEgressGateway(gateway models.EgressGatewayRequest) (models.Node, error) {
+	for i, cidr := range gateway.Ranges {
+		normalized, err := NormalizeCIDR(cidr)
+		if err != nil {
+			return models.Node{}, err
+		}
+		gateway.Ranges[i] = normalized
+
+	}
 	node, err := GetNodeByID(gateway.NodeID)
 	if err != nil {
 		return models.Node{}, err

+ 14 - 0
logic/networks.go

@@ -70,6 +70,20 @@ func DeleteNetwork(network string) error {
 // CreateNetwork - creates a network in database
 func CreateNetwork(network models.Network) (models.Network, error) {
 
+	if network.AddressRange != "" {
+		normalizedRange, err := NormalizeCIDR(network.AddressRange)
+		if err != nil {
+			return models.Network{}, err
+		}
+		network.AddressRange = normalizedRange
+	}
+	if network.AddressRange6 != "" {
+		normalizedRange, err := NormalizeCIDR(network.AddressRange6)
+		if err != nil {
+			return models.Network{}, err
+		}
+		network.AddressRange6 = normalizedRange
+	}
 	network.SetDefaults()
 	network.SetNodesLastModified()
 	network.SetNetworkLastModified()

+ 17 - 0
logic/util.go

@@ -13,6 +13,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/c-robinson/iplib"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
@@ -170,6 +171,22 @@ func ShouldPublishPeerPorts(serverNode *models.Node) bool {
 	return false
 }
 
+// NormalCIDR - returns the first address of CIDR
+func NormalizeCIDR(address string) (string, error) {
+	ip, IPNet, err := net.ParseCIDR(address)
+	if err != nil {
+		return "", err
+	}
+	if ip.To4() == nil {
+		net6 := iplib.Net6FromStr(IPNet.String())
+		IPNet.IP = net6.FirstAddress()
+	} else {
+		net4 := iplib.Net4FromStr(IPNet.String())
+		IPNet.IP = net4.NetworkAddress()
+	}
+	return IPNet.String(), nil
+}
+
 func getNetworkProtocols(cidrs []string) (bool, bool) {
 	ipv4 := false
 	ipv6 := false