From e8ef5131d7d0a1f94ddb03f3c49e015196bd40bd Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Fri, 6 Sep 2024 19:34:52 -0400 Subject: [PATCH] Use refactored cidr module code in globalnet Signed-off-by: Tom Pantelis --- .../submariner/broker_controller_test.go | 4 +- pkg/cidr/cidr.go | 15 +- pkg/discovery/globalnet/config_map.go | 36 +-- pkg/discovery/globalnet/globalnet.go | 281 ++---------------- pkg/discovery/globalnet/globalnet_test.go | 276 +---------------- 5 files changed, 44 insertions(+), 568 deletions(-) diff --git a/controllers/submariner/broker_controller_test.go b/controllers/submariner/broker_controller_test.go index 937782364..00de5c842 100644 --- a/controllers/submariner/broker_controller_test.go +++ b/controllers/submariner/broker_controller_test.go @@ -70,8 +70,8 @@ var _ = Describe("Broker controller tests", func() { globalnetInfo, _, err := globalnet.GetGlobalNetworks(ctx, t.ScopedClient, submarinerNamespace) Expect(err).To(Succeed()) - Expect(globalnetInfo.CidrRange).To(Equal(broker.Spec.GlobalnetCIDRRange)) - Expect(globalnetInfo.ClusterSize).To(Equal(broker.Spec.DefaultGlobalnetClusterSize)) + Expect(globalnetInfo.CIDR).To(Equal(broker.Spec.GlobalnetCIDRRange)) + Expect(globalnetInfo.AllocationSize).To(Equal(broker.Spec.DefaultGlobalnetClusterSize)) }) It("should create the CRDs", func(ctx SpecContext) { diff --git a/pkg/cidr/cidr.go b/pkg/cidr/cidr.go index dedf49230..752665ba8 100644 --- a/pkg/cidr/cidr.go +++ b/pkg/cidr/cidr.go @@ -77,22 +77,15 @@ func ExtractClusterInfo(fromConfigMap *corev1.ConfigMap) (map[string]*ClusterInf } func AddClusterInfoData(toConfigMap *corev1.ConfigMap, newCluster ClusterInfo) error { - var existingInfo []ClusterInfo + existingInfo, err := unmarshalClusterInfo(toConfigMap) + if err != nil { + return err + } if toConfigMap.Data == nil { toConfigMap.Data = map[string]string{} } - existingData := toConfigMap.Data[ClusterInfoKey] - if existingData == "" { - existingData = "[]" - } - - err := json.Unmarshal([]byte(existingData), &existingInfo) - if err != nil { - return errors.Wrapf(err, "error unmarshalling ClusterInfo") - } - exists := false for k, value := range existingInfo { diff --git a/pkg/discovery/globalnet/config_map.go b/pkg/discovery/globalnet/config_map.go index 3c85c5613..29ef719e2 100644 --- a/pkg/discovery/globalnet/config_map.go +++ b/pkg/discovery/globalnet/config_map.go @@ -24,6 +24,7 @@ import ( "fmt" "github.com/pkg/errors" + "github.com/submariner-io/submariner-operator/pkg/cidr" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -34,18 +35,12 @@ import ( const ( globalCIDRConfigMapName = "submariner-globalnet-info" globalnetEnabledKey = "globalnetEnabled" - clusterInfoKey = "clusterinfo" globalnetCidrRange = "globalnetCidrRange" globalnetClusterSize = "globalnetClusterSize" DefaultGlobalnetCIDR = "242.0.0.0/8" DefaultGlobalnetClusterSize = 65536 // i.e., x.x.x.x/16 subnet mask ) -type clusterInfo struct { - ClusterID string `json:"cluster_id"` - GlobalCidr []string `json:"global_cidr"` -} - func CreateConfigMap(ctx context.Context, client controllerClient.Client, globalnetEnabled bool, defaultGlobalCidrRange string, defaultGlobalClusterSize uint, namespace string, ) error { @@ -80,12 +75,10 @@ func NewGlobalnetConfigMap(globalnetEnabled bool, defaultGlobalCidrRange string, globalnetEnabledKey: "true", globalnetCidrRange: string(cidrRange), globalnetClusterSize: fmt.Sprint(defaultGlobalClusterSize), - clusterInfoKey: "[]", } } else { data = map[string]string{ globalnetEnabledKey: "false", - clusterInfoKey: "[]", } } @@ -101,34 +94,13 @@ func NewGlobalnetConfigMap(globalnetEnabled bool, defaultGlobalCidrRange string, return cm, nil } -func updateConfigMap(ctx context.Context, client controllerClient.Client, configMap *corev1.ConfigMap, newCluster clusterInfo, +func updateConfigMap(ctx context.Context, client controllerClient.Client, configMap *corev1.ConfigMap, newCluster cidr.ClusterInfo, ) error { - var existingInfo []clusterInfo - - err := json.Unmarshal([]byte(configMap.Data[clusterInfoKey]), &existingInfo) - if err != nil { - return errors.Wrapf(err, "error unmarshalling ClusterInfo") - } - - exists := false - - for k, value := range existingInfo { - if value.ClusterID == newCluster.ClusterID { - existingInfo[k].GlobalCidr = newCluster.GlobalCidr - exists = true - } - } - - if !exists { - existingInfo = append(existingInfo, newCluster) - } - - data, err := json.MarshalIndent(existingInfo, "", "\t") + err := cidr.AddClusterInfoData(configMap, newCluster) if err != nil { - return errors.Wrapf(err, "error marshalling ClusterInfo") + return errors.Wrapf(err, "error adding ClusterInfo") } - configMap.Data[clusterInfoKey] = string(data) err = client.Update(ctx, configMap) return errors.Wrapf(err, "error updating ConfigMap") diff --git a/pkg/discovery/globalnet/globalnet.go b/pkg/discovery/globalnet/globalnet.go index a67d5466a..9f02d89cb 100644 --- a/pkg/discovery/globalnet/globalnet.go +++ b/pkg/discovery/globalnet/globalnet.go @@ -20,14 +20,13 @@ package globalnet import ( "context" - "encoding/binary" "encoding/json" "fmt" - "math/bits" "net" "github.com/pkg/errors" "github.com/submariner-io/admiral/pkg/reporter" + "github.com/submariner-io/submariner-operator/pkg/cidr" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/client-go/util/retry" @@ -35,28 +34,8 @@ import ( ) type Info struct { - Enabled bool - CidrRange string - ClusterSize uint - CidrInfo map[string]*GlobalNetwork -} - -type GlobalNetwork struct { - GlobalCIDRs []string - ClusterID string -} - -type GlobalCIDR struct { - cidr string - net *net.IPNet - allocatedClusters []*CIDR - allocatedCount int -} - -type CIDR struct { - network *net.IPNet - size int - lastIP uint32 + Enabled bool + cidr.Info } type Config struct { @@ -65,152 +44,8 @@ type Config struct { ClusterSize uint } -func isOverlappingCIDR(cidrList []string, cidr string) (bool, error) { - _, newNet, err := net.ParseCIDR(cidr) - if err != nil { - return false, err //nolint:wrapcheck // No need to wrap here - } - - for _, v := range cidrList { - _, baseNet, err := net.ParseCIDR(v) - if err != nil { - return false, err //nolint:wrapcheck // No need to wrap here - } - - if baseNet.Contains(newNet.IP) || newNet.Contains(baseNet.IP) { - return true, nil - } - } - - return false, nil -} - -func NewCIDR(cidr string) (CIDR, error) { - _, network, err := net.ParseCIDR(cidr) - if err != nil { - return CIDR{}, fmt.Errorf("invalid cidr %q passed as input", cidr) - } - - ones, total := network.Mask.Size() - size := total - ones - lastIP := LastIP(network) - clusterCidr := CIDR{network: network, size: size, lastIP: lastIP} - - return clusterCidr, nil -} - -func LastIP(network *net.IPNet) uint32 { - ones, total := network.Mask.Size() - clusterSize := total - ones - firstIPInt := ipToUint(network.IP) - lastIPUint := firstIPInt + 1<