From a70b8395ec09e8015b00ba77c637dbbc6ba88005 Mon Sep 17 00:00:00 2001 From: ushabelgur Date: Mon, 24 Jun 2024 15:07:34 +0530 Subject: [PATCH] intial chages for network peering prefix changes in metalnetlet --- api/core/v1alpha1/network_types.go | 3 +++ metalnetlet/controllers/network_controller.go | 9 +++++++++ metalnetlet/controllers/network_controller_test.go | 13 ++++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/api/core/v1alpha1/network_types.go b/api/core/v1alpha1/network_types.go index 6e097188..ae74baaf 100644 --- a/api/core/v1alpha1/network_types.go +++ b/api/core/v1alpha1/network_types.go @@ -4,6 +4,7 @@ package v1alpha1 import ( + "github.com/ironcore-dev/ironcore-net/apimachinery/api/net" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -20,6 +21,8 @@ type NetworkPeering struct { Name string `json:"name"` // ID is the ID of the network to peer with. ID string `json:"id"` + // Prefixes is a list of CIDRs that we want only to be exposed to the peered network, if no prefixes are specified no filtering will be done. + Prefixes *[]net.IPPrefix `json:"prefixes,omitempty"` } type NetworkStatus struct { diff --git a/metalnetlet/controllers/network_controller.go b/metalnetlet/controllers/network_controller.go index 81e19eec..4d1a88c6 100644 --- a/metalnetlet/controllers/network_controller.go +++ b/metalnetlet/controllers/network_controller.go @@ -155,6 +155,7 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw }, } + peeredPrefixes := []metalnetv1alpha1.PeeredPrefix{} for _, peering := range network.Spec.Peerings { id, err := networkid.ParseVNI(peering.ID) if err != nil { @@ -162,7 +163,15 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } metalnetNetwork.Spec.PeeredIDs = append(metalnetNetwork.Spec.PeeredIDs, id) + if peering.Prefixes != nil && len(*peering.Prefixes) > 0 { + peeredPrefix := metalnetv1alpha1.PeeredPrefix{ + ID: int32(id), + Prefixes: ipPrefixesToMetalnetPrefixes(*peering.Prefixes), + } + peeredPrefixes = append(peeredPrefixes, peeredPrefix) + } } + metalnetNetwork.Spec.PeeredPrefixes = peeredPrefixes if err := r.MetalnetClient.Patch(ctx, metalnetNetwork, client.Apply, MetalnetFieldOwner, client.ForceOwnership); err != nil { return ctrl.Result{}, fmt.Errorf("error applying network: %w", err) diff --git a/metalnetlet/controllers/network_controller_test.go b/metalnetlet/controllers/network_controller_test.go index a50c117a..9bdf9fa5 100644 --- a/metalnetlet/controllers/network_controller_test.go +++ b/metalnetlet/controllers/network_controller_test.go @@ -5,6 +5,7 @@ package controllers import ( apinetv1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" + "github.com/ironcore-dev/ironcore-net/apimachinery/api/net" "github.com/ironcore-dev/ironcore-net/networkid" . "github.com/ironcore-dev/ironcore/utils/testing" metalnetv1alpha1 "github.com/ironcore-dev/metalnet/api/v1alpha1" @@ -43,8 +44,9 @@ var _ = Describe("NetworkController", func() { By("updating apinet networks spec with peerings") baseNetwork1 := network1.DeepCopy() network1.Spec.Peerings = []apinetv1alpha1.NetworkPeering{{ - Name: "peering-1", - ID: network2.Spec.ID}} + Name: "peering-1", + Prefixes: &[]net.IPPrefix{net.MustParseIPPrefix("10.0.0.0/24")}, + ID: network2.Spec.ID}} Expect(k8sClient.Patch(ctx, network1, client.MergeFrom(baseNetwork1))).To(Succeed()) baseNetwork2 := network2.DeepCopy() @@ -70,7 +72,12 @@ var _ = Describe("NetworkController", func() { } Eventually(Object(metalnetNetwork1)).Should(SatisfyAll( HaveField("Spec", metalnetv1alpha1.NetworkSpec{ - ID: network1Vni, + ID: network1Vni, + PeeredPrefixes: []metalnetv1alpha1.PeeredPrefix{ + { + ID: network2Vni, + Prefixes: []metalnetv1alpha1.IPPrefix{metalnetv1alpha1.MustParseIPPrefix("10.0.0.0/24")}, // Add desired IPPrefixes here + }}, PeeredIDs: []int32{network2Vni}, }), ))