From 701c85a3d6367978f1548e860e47a348c2870f72 Mon Sep 17 00:00:00 2001 From: Kajol Asabe Date: Tue, 26 Mar 2024 13:44:18 +0530 Subject: [PATCH] update network controller in apinetlet to handle peerings --- api/core/v1alpha1/network_types.go | 24 + api/core/v1alpha1/zz_generated.deepcopy.go | 23 +- .../controllers/controllers_suite_test.go | 6 - apinetlet/controllers/network_controller.go | 22 + .../controllers/network_controller_test.go | 123 ++- .../controllers/network_peering_controller.go | 277 ------- .../network_peering_controller_test.go | 774 ------------------ .../core/v1alpha1/network.go | 8 +- .../core/v1alpha1/networkpeeringstatus.go | 39 + .../core/v1alpha1/networkstatus.go | 31 + .../applyconfigurations/internal/internal.go | 27 +- client-go/applyconfigurations/utils.go | 4 + client-go/openapi/api_violations.report | 1 + client-go/openapi/zz_generated.openapi.go | 48 ++ cmd/apinetlet/main.go | 10 - docs/concepts/network-lifecycle.md | 11 +- internal/apis/core/network_types.go | 26 +- .../core/v1alpha1/zz_generated.conversion.go | 34 + internal/apis/core/zz_generated.deepcopy.go | 23 +- 19 files changed, 417 insertions(+), 1094 deletions(-) delete mode 100644 apinetlet/controllers/network_peering_controller.go delete mode 100644 apinetlet/controllers/network_peering_controller_test.go create mode 100644 client-go/applyconfigurations/core/v1alpha1/networkpeeringstatus.go create mode 100644 client-go/applyconfigurations/core/v1alpha1/networkstatus.go diff --git a/api/core/v1alpha1/network_types.go b/api/core/v1alpha1/network_types.go index 0259a646..dca5ad68 100644 --- a/api/core/v1alpha1/network_types.go +++ b/api/core/v1alpha1/network_types.go @@ -15,6 +15,30 @@ type NetworkSpec struct { } type NetworkStatus struct { + // Peerings contains the states of the network peerings for the network. + Peerings []NetworkPeeringStatus `json:"peerings,omitempty"` +} + +// NetworkState is the state of a network. +// +enum +type NetworkState string + +// NetworkPeeringState is the state a NetworkPeering can be in +type NetworkPeeringState string + +const ( + // NetworkPeeringStatePending signals that the network peering is not applied. + NetworkPeeringStatePending NetworkPeeringState = "Pending" + // NetworkPeeringStateApplied signals that the network peering is applied. + NetworkPeeringStateApplied NetworkPeeringState = "Applied" +) + +// NetworkPeeringStatus is the status of a network peering. +type NetworkPeeringStatus struct { + // Name is the name of the network peering. + Name string `json:"name"` + // State represents the network peering state + State NetworkPeeringState `json:"state,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/api/core/v1alpha1/zz_generated.deepcopy.go b/api/core/v1alpha1/zz_generated.deepcopy.go index ecd83c4e..6aaf104e 100644 --- a/api/core/v1alpha1/zz_generated.deepcopy.go +++ b/api/core/v1alpha1/zz_generated.deepcopy.go @@ -1177,7 +1177,7 @@ func (in *Network) DeepCopyInto(out *Network) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -1522,6 +1522,22 @@ func (in *NetworkList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkPeeringStatus) DeepCopyInto(out *NetworkPeeringStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPeeringStatus. +func (in *NetworkPeeringStatus) DeepCopy() *NetworkPeeringStatus { + if in == nil { + return nil + } + out := new(NetworkPeeringStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { *out = *in @@ -1546,6 +1562,11 @@ func (in *NetworkSpec) DeepCopy() *NetworkSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { *out = *in + if in.Peerings != nil { + in, out := &in.Peerings, &out.Peerings + *out = make([]NetworkPeeringStatus, len(*in)) + copy(*out, *in) + } return } diff --git a/apinetlet/controllers/controllers_suite_test.go b/apinetlet/controllers/controllers_suite_test.go index ad0a3c0d..8f9f13a6 100644 --- a/apinetlet/controllers/controllers_suite_test.go +++ b/apinetlet/controllers/controllers_suite_test.go @@ -154,12 +154,6 @@ func SetupTest(apiNetNamespace *corev1.Namespace) *corev1.Namespace { APINetNamespace: apiNetNamespace.Name, }).SetupWithManager(k8sManager, k8sManager.GetCache())).To(Succeed()) - Expect((&NetworkPeeringReconciler{ - Client: k8sManager.GetClient(), - APINetClient: k8sManager.GetClient(), - APINetNamespace: apiNetNamespace.Name, - }).SetupWithManager(k8sManager, k8sManager.GetCache())).To(Succeed()) - Expect((&NetworkInterfaceReconciler{ Client: k8sManager.GetClient(), APINetClient: k8sManager.GetClient(), diff --git a/apinetlet/controllers/network_controller.go b/apinetlet/controllers/network_controller.go index 06914801..26cbbcf4 100644 --- a/apinetlet/controllers/network_controller.go +++ b/apinetlet/controllers/network_controller.go @@ -193,6 +193,28 @@ func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Log }, } + var peeredIDs []string + for _, peeringClaimRef := range network.Spec.PeeringClaimRefs { + log.V(1).Info("Get apinet network for target network") + targetApinetNetwork := &apinetv1alpha1.Network{} + if err := r.APINetClient.Get(ctx, client.ObjectKey{Namespace: r.APINetNamespace, Name: string(peeringClaimRef.UID)}, targetApinetNetwork); err != nil { + log.V(1).Info("target apinet network is not created yet") + break + } + peeredIDs = append(peeredIDs, targetApinetNetwork.Spec.ID) + } + apiNetNetwork.Spec.PeeredIDs = peeredIDs + + var peerings []apinetv1alpha1.NetworkPeeringStatus + for _, peering := range network.Status.Peerings { + peerings = append(peerings, apinetv1alpha1.NetworkPeeringStatus{ + Name: peering.Name, + // TODO remove below comment after merging ironcore PR #1026 + // State: peering.State, + }) + } + apiNetNetwork.Status.Peerings = peerings + log.V(1).Info("Applying APINet network") if err := r.APINetClient.Patch(ctx, apiNetNetwork, client.Apply, fieldOwner, client.ForceOwnership); err != nil { return nil, fmt.Errorf("error applying apinet network: %w", err) diff --git a/apinetlet/controllers/network_controller_test.go b/apinetlet/controllers/network_controller_test.go index a2cfba6d..4b34349b 100644 --- a/apinetlet/controllers/network_controller_test.go +++ b/apinetlet/controllers/network_controller_test.go @@ -4,7 +4,7 @@ package controllers import ( - "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" + apinetv1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" apinetletclient "github.com/ironcore-dev/ironcore-net/apinetlet/client" "github.com/ironcore-dev/ironcore-net/apinetlet/provider" networkingv1alpha1 "github.com/ironcore-dev/ironcore/api/networking/v1alpha1" @@ -19,6 +19,7 @@ import ( var _ = Describe("NetworkController", func() { ns := SetupNamespace(&k8sClient) + ns1 := SetupNamespace(&k8sClient) apiNetNs := SetupNamespace(&k8sClient) SetupTest(apiNetNs) @@ -33,7 +34,7 @@ var _ = Describe("NetworkController", func() { Expect(k8sClient.Create(ctx, network)).To(Succeed()) By("waiting for the corresponding APINet network to be created") - apiNetNetwork := &v1alpha1.Network{ + apiNetNetwork := &apinetv1alpha1.Network{ ObjectMeta: metav1.ObjectMeta{ Namespace: apiNetNs.Name, Name: string(network.UID), @@ -71,7 +72,7 @@ var _ = Describe("NetworkController", func() { It("should clean up dangling apinet networks", func(ctx SpecContext) { By("creating a apinet network") - apiNetNetwork := &v1alpha1.Network{ + apiNetNetwork := &apinetv1alpha1.Network{ ObjectMeta: metav1.ObjectMeta{ Namespace: apiNetNs.Name, GenerateName: "apinet-network-", @@ -85,11 +86,125 @@ var _ = Describe("NetworkController", func() { }, ), }, - Spec: v1alpha1.NetworkSpec{}, + Spec: apinetv1alpha1.NetworkSpec{}, } Expect(k8sClient.Create(ctx, apiNetNetwork)).To(Succeed()) By("waiting for the apinet network to be gone") Eventually(Get(apiNetNetwork)).Should(Satisfy(apierrors.IsNotFound)) }) + + It("should update peeredIDs if two networks from different namespaces peers each other correctly", func(ctx SpecContext) { + By("creating a network network-1") + network1 := &networkingv1alpha1.Network{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns.Name, + Name: "network-1", + }, + Spec: networkingv1alpha1.NetworkSpec{ + Peerings: []networkingv1alpha1.NetworkPeering{ + { + Name: "peering-1", + NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ + Name: "network-2", + Namespace: ns1.Name, + }, + }, + }, + }, + } + Expect(k8sClient.Create(ctx, network1)).To(Succeed()) + + By("creating a network network-2") + network2 := &networkingv1alpha1.Network{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns1.Name, + Name: "network-2", + }, + Spec: networkingv1alpha1.NetworkSpec{ + Peerings: []networkingv1alpha1.NetworkPeering{ + { + Name: "peering-2", + NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ + Name: "network-1", + Namespace: ns.Name, + }, + }, + }, + }, + } + Expect(k8sClient.Create(ctx, network2)).To(Succeed()) + + By("waiting for the corresponding APINet networks to be created") + apiNetNetwork1 := &apinetv1alpha1.Network{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: apiNetNs.Name, + Name: string(network1.UID), + }, + } + Eventually(Get(apiNetNetwork1)).Should(Succeed()) + + apiNetNetwork2 := &apinetv1alpha1.Network{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: apiNetNs.Name, + Name: string(network2.UID), + }, + } + Eventually(Get(apiNetNetwork2)).Should(Succeed()) + + By("inspecting the created apinet networks") + Expect(apiNetNetwork1.Labels).To(Equal(apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network1))) + Expect(apiNetNetwork1.Spec.ID).NotTo(BeEmpty()) + + Expect(apiNetNetwork2.Labels).To(Equal(apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network2))) + Expect(apiNetNetwork2.Spec.ID).NotTo(BeEmpty()) + + By("patching networks with peeringClaimRefs") + baseNetwork1 := network1.DeepCopy() + network1.Spec.PeeringClaimRefs = []networkingv1alpha1.NetworkPeeringClaimRef{{ + Name: network2.Name, + Namespace: network2.Namespace, + UID: network2.UID, + }} + network1.Status.Peerings = []networkingv1alpha1.NetworkPeeringStatus{{ + Name: network1.Spec.Peerings[0].Name, + // TODO remove below comment after merging ironcore PR #1026 + // State: networkingv1alpha1.NetworkPeeringStatePending, + }} + Expect(k8sClient.Patch(ctx, network1, client.MergeFrom(baseNetwork1))).To(Succeed()) + + baseNetwork2 := network2.DeepCopy() + network2.Spec.PeeringClaimRefs = []networkingv1alpha1.NetworkPeeringClaimRef{{ + Name: network1.Name, + Namespace: network1.Namespace, + UID: network1.UID, + }} + network2.Status.Peerings = []networkingv1alpha1.NetworkPeeringStatus{{ + Name: network2.Spec.Peerings[0].Name, + // TODO remove below comment after merging ironcore PR #1026 + // State: networkingv1alpha1.NetworkPeeringStatePending, + }} + Expect(k8sClient.Patch(ctx, network2, client.MergeFrom(baseNetwork2))).To(Succeed()) + + By("ensuring apinet network peeredIDs are updated") + Eventually(Object(apiNetNetwork1)).Should(SatisfyAll( + HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork2.Spec.ID)), + )) + + Eventually(Object(apiNetNetwork2)).Should(SatisfyAll( + HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID)), + )) + + By("deleting the networks") + Expect(k8sClient.Delete(ctx, network1)).To(Succeed()) + Expect(k8sClient.Delete(ctx, network2)).To(Succeed()) + + By("waiting for networks to be gone") + Eventually(Get(network1)).Should(Satisfy(apierrors.IsNotFound)) + Eventually(Get(network2)).Should(Satisfy(apierrors.IsNotFound)) + + By("asserting the corresponding apinet network is gone as well") + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork1), apiNetNetwork1)).To(Satisfy(apierrors.IsNotFound)) + Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork2), apiNetNetwork2)).To(Satisfy(apierrors.IsNotFound)) + }) }) diff --git a/apinetlet/controllers/network_peering_controller.go b/apinetlet/controllers/network_peering_controller.go deleted file mode 100644 index 1a84b3f8..00000000 --- a/apinetlet/controllers/network_peering_controller.go +++ /dev/null @@ -1,277 +0,0 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and IronCore contributors -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - apinetv1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" - networkingv1alpha1 "github.com/ironcore-dev/ironcore/api/networking/v1alpha1" - "github.com/ironcore-dev/ironcore/utils/predicates" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/util/sets" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -type NetworkPeeringReconciler struct { - client.Client - APINetClient client.Client - APINetNamespace string - WatchFilterValue string -} - -//+kubebuilder:rbac:groups="",resources=events,verbs=create;patch -//+kubebuilder:rbac:groups=networking.ironcore.dev,resources=networks,verbs=get;list;watch;update;patch -//+kubebuilder:rbac:groups=networking.ironcore.dev,resources=networks/status,verbs=get;update;patch - -//+cluster=apinet:kubebuilder:rbac:groups=core.apinet.ironcore.dev,resources=networks,verbs=get;list;watch;create;update;patch;delete;deletecollection - -func (r *NetworkPeeringReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := ctrl.LoggerFrom(ctx) - network := &networkingv1alpha1.Network{} - if err := r.Get(ctx, req.NamespacedName, network); err != nil { - return ctrl.Result{}, client.IgnoreNotFound(err) - } - - return r.reconcileExists(ctx, log, network) -} - -func (r *NetworkPeeringReconciler) reconcileExists(ctx context.Context, log logr.Logger, network *networkingv1alpha1.Network) (ctrl.Result, error) { - if !network.DeletionTimestamp.IsZero() { - return ctrl.Result{}, nil - } - - return r.reconcile(ctx, log, network) -} - -func (r *NetworkPeeringReconciler) reconcile(ctx context.Context, log logr.Logger, network *networkingv1alpha1.Network) (ctrl.Result, error) { - log.V(1).Info("Reconcile") - - var peeringClaimRefs []networkingv1alpha1.NetworkPeeringClaimRef - var peeringNames []string - var peeredIDs []string - - for _, peering := range network.Spec.Peerings { - peeringClaimRef, peeringName, peeredID, err := r.reconcilePeering(ctx, log, network, peering) - - if err != nil { - return ctrl.Result{}, fmt.Errorf("[network peering %s] %w", peering.Name, err) - } - - if peeringClaimRef != (networkingv1alpha1.NetworkPeeringClaimRef{}) { - peeringClaimRefs = append(peeringClaimRefs, peeringClaimRef) - } - if peeringName != "" { - peeringNames = append(peeringNames, peeringName) - } - if peeredID != "" { - peeredIDs = append(peeredIDs, peeredID) - } - } - - if len(peeringClaimRefs) > 0 { - log.V(1).Info("Peering claim refs require network spec update") - if err := r.updateSpec(ctx, log, network, peeringClaimRefs, peeredIDs); err != nil { - return ctrl.Result{}, fmt.Errorf("error updating network spec: %w", err) - } - } - - if len(peeringNames) > 0 { - log.V(1).Info("Network peering status require network status update") - if err := r.updateStatus(ctx, log, network, peeringNames); err != nil { - return ctrl.Result{}, fmt.Errorf("error updating network status: %w", err) - } - } - - log.V(1).Info("Reconciled") - return ctrl.Result{}, nil -} - -func (r *NetworkPeeringReconciler) updateStatus( - ctx context.Context, - log logr.Logger, - network *networkingv1alpha1.Network, - peeringNames []string, -) error { - base := network.DeepCopy() - newStatusPeerings := make([]networkingv1alpha1.NetworkPeeringStatus, 0, len(peeringNames)) - for _, name := range peeringNames { - newStatusPeerings = append(newStatusPeerings, networkingv1alpha1.NetworkPeeringStatus{ - Name: name, - // TODO - Add other Peering Status fields when NetworkPeeringStatus - // is extended with Phase or any other status field in ironcore - }) - } - network.Status.Peerings = newStatusPeerings - - log.V(1).Info("Updating network status peerings", "", network.Status.Peerings) - if err := r.Status().Patch(ctx, network, client.StrategicMergeFrom(base)); err != nil { - return fmt.Errorf("error updating network status peerings: %w", err) - } - log.V(1).Info("Updated network status peerings") - - return nil -} - -func (r *NetworkPeeringReconciler) updateSpec( - ctx context.Context, - log logr.Logger, - network *networkingv1alpha1.Network, - peeringClaimRefs []networkingv1alpha1.NetworkPeeringClaimRef, - peeredIDs []string, -) error { - if err := r.updateApinetNetworkSpec(ctx, log, network, peeredIDs); err != nil { - return fmt.Errorf("error updating apinet network spec: %w", err) - } - - base := network.DeepCopy() - network.Spec.PeeringClaimRefs = peeringClaimRefs - log.V(1).Info("Updating network spec incoming peerings") - if err := r.Patch(ctx, network, client.StrategicMergeFrom(base)); err != nil { - return fmt.Errorf("error updating network spec incoming peerings: %w", err) - } - - log.V(1).Info("Updated network spec incoming peerings") - return nil -} - -func (r *NetworkPeeringReconciler) updateApinetNetworkSpec( - ctx context.Context, - log logr.Logger, - network *networkingv1alpha1.Network, - peeredIDs []string, -) error { - apinetNetwork := &apinetv1alpha1.Network{} - apinetNetworkKey := client.ObjectKey{Namespace: r.APINetNamespace, Name: string(network.UID)} - if err := r.APINetClient.Get(ctx, apinetNetworkKey, apinetNetwork); err != nil { - return fmt.Errorf("apinet network is not created yet for network: %s \n %w", network.Name, err) - } - - base := apinetNetwork.DeepCopy() - apinetNetwork.Spec.PeeredIDs = peeredIDs - log.V(1).Info("Updating apinet network spec peered ids") - if err := r.APINetClient.Patch(ctx, apinetNetwork, client.StrategicMergeFrom(base)); err != nil { - return fmt.Errorf("error updating apinet network spec peered ids: %w", err) - } - - log.V(1).Info("Updated apinet network spec peered ids") - return nil -} - -func (r *NetworkPeeringReconciler) reconcilePeering( - ctx context.Context, - log logr.Logger, - network *networkingv1alpha1.Network, - peering networkingv1alpha1.NetworkPeering, -) (networkingv1alpha1.NetworkPeeringClaimRef, string, string, error) { - networkKey := client.ObjectKeyFromObject(network) - - targetNetwork := &networkingv1alpha1.Network{} - targetNetworkRef := peering.NetworkRef - targetNetworkNamespace := targetNetworkRef.Namespace - if targetNetworkNamespace == "" { - targetNetworkNamespace = network.Namespace - } - targetNetworkKey := client.ObjectKey{Namespace: targetNetworkNamespace, Name: targetNetworkRef.Name} - log = log.WithValues("TargetNetworkKey", targetNetworkKey) - - log.V(1).Info("Getting target network") - if err := r.Get(ctx, targetNetworkKey, targetNetwork); err != nil { - if !apierrors.IsNotFound(err) { - return networkingv1alpha1.NetworkPeeringClaimRef{}, "", "", fmt.Errorf("error getting target network %s: %w", targetNetworkKey, err) - } - - log.V(1).Info("Target network not found") - return networkingv1alpha1.NetworkPeeringClaimRef{}, "", "", nil - } - - for _, targetPeering := range targetNetwork.Spec.Peerings { - targetPeeringNetworkRef := targetPeering.NetworkRef - targetPeeringNetworkNamespace := targetPeeringNetworkRef.Namespace - if targetPeeringNetworkNamespace == "" { - targetPeeringNetworkNamespace = targetNetwork.Namespace - } - targetPeeringNetworkKey := client.ObjectKey{Namespace: targetPeeringNetworkNamespace, Name: targetPeeringNetworkRef.Name} - - if targetPeeringNetworkKey != networkKey { - continue - } - - if targetNetwork.Status.State != networkingv1alpha1.NetworkStateAvailable { - log.V(1).Info("Target network is not available yet") - return networkingv1alpha1.NetworkPeeringClaimRef{}, "", "", nil - } - - log.V(1).Info("Target network peering matches") - peeringClaimRef := networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: targetNetwork.Namespace, - Name: targetNetwork.Name, - UID: targetNetwork.UID, - } - - log.V(1).Info("Get apinet network for target network") - apinetNetwork := &apinetv1alpha1.Network{} - if err := r.APINetClient.Get(ctx, client.ObjectKey{Namespace: r.APINetNamespace, Name: string(targetNetwork.UID)}, - apinetNetwork); err != nil { - log.V(1).Info("apinet network for target network is not created yet") - return networkingv1alpha1.NetworkPeeringClaimRef{}, "", "", nil - } - return peeringClaimRef, peering.Name, apinetNetwork.Spec.ID, nil - } - - log.V(1).Info("No matching target peering found") - return networkingv1alpha1.NetworkPeeringClaimRef{}, "", "", nil -} - -func (r *NetworkPeeringReconciler) enqueuePeeringReferencedNetworks() handler.EventHandler { - return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []ctrl.Request { - network := obj.(*networkingv1alpha1.Network) - reqs := sets.New[ctrl.Request]() - for _, peering := range network.Spec.Peerings { - ref := peering.NetworkRef - refNamespace := ref.Namespace - if refNamespace == "" { - refNamespace = network.Namespace - } - - refKey := client.ObjectKey{Namespace: refNamespace, Name: ref.Name} - reqs.Insert(ctrl.Request{NamespacedName: refKey}) - } - return reqs.UnsortedList() - }) -} - -func (r *NetworkPeeringReconciler) networkStateAvailablePredicate() predicate.Predicate { - return predicate.NewPredicateFuncs(func(obj client.Object) bool { - network := obj.(*networkingv1alpha1.Network) - return network.Status.State == networkingv1alpha1.NetworkStateAvailable - }) -} - -func (r *NetworkPeeringReconciler) SetupWithManager(mgr ctrl.Manager, apiNetCache cache.Cache) error { - log := ctrl.Log.WithName("networkpeering").WithName("setup") - - return ctrl.NewControllerManagedBy(mgr). - For( - &networkingv1alpha1.Network{}, - builder.WithPredicates( - predicates.ResourceHasFilterLabel(log, r.WatchFilterValue), - predicates.ResourceIsNotExternallyManaged(log), - r.networkStateAvailablePredicate(), - ), - ). - Watches( - &networkingv1alpha1.Network{}, - r.enqueuePeeringReferencedNetworks(), - builder.WithPredicates(r.networkStateAvailablePredicate()), - ). - Complete(r) -} diff --git a/apinetlet/controllers/network_peering_controller_test.go b/apinetlet/controllers/network_peering_controller_test.go deleted file mode 100644 index fae14255..00000000 --- a/apinetlet/controllers/network_peering_controller_test.go +++ /dev/null @@ -1,774 +0,0 @@ -// SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and IronCore contributors -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - apinetv1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" - apinetletclient "github.com/ironcore-dev/ironcore-net/apinetlet/client" - "github.com/ironcore-dev/ironcore-net/apinetlet/provider" - networkingv1alpha1 "github.com/ironcore-dev/ironcore/api/networking/v1alpha1" - . "github.com/ironcore-dev/ironcore/utils/testing" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - . "sigs.k8s.io/controller-runtime/pkg/envtest/komega" -) - -var _ = Describe("NetworkPeeringController", func() { - ns := SetupNamespace(&k8sClient) - ns1 := SetupNamespace(&k8sClient) - apiNetNs := SetupNamespace(&k8sClient) - SetupTest(apiNetNs) - - It("should peer networks in the same namespace referencing a single parent network", func(ctx SpecContext) { - By("creating a network network-1") - network1 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-1", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-1", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-2", - Namespace: ns.Name, - }, - }, - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-3", - }, - }, - { - Name: "peering-3", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-4", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network1)).To(Succeed()) - - By("creating a network network-2") - network2 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-2", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-1", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network2)).To(Succeed()) - - By("creating a network network-3") - network3 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-3", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-3", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-1", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network3)).To(Succeed()) - - By("creating a network network-4") - network4 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-4", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-4", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-1", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network4)).To(Succeed()) - - By("waiting for the corresponding APINet networks to be created") - apiNetNetwork1 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network1.UID), - }, - } - Eventually(Get(apiNetNetwork1)).Should(Succeed()) - - apiNetNetwork2 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network2.UID), - }, - } - Eventually(Get(apiNetNetwork2)).Should(Succeed()) - - apiNetNetwork3 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network3.UID), - }, - } - Eventually(Get(apiNetNetwork3)).Should(Succeed()) - - apiNetNetwork4 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network4.UID), - }, - } - Eventually(Get(apiNetNetwork4)).Should(Succeed()) - - By("inspecting the created apinet networks") - Expect(apiNetNetwork1.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network1), - )) - Expect(apiNetNetwork1.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork2.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network2), - )) - Expect(apiNetNetwork2.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork3.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network3), - )) - Expect(apiNetNetwork3.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork4.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network4), - )) - Expect(apiNetNetwork4.Spec.ID).NotTo(BeEmpty()) - - By("waiting for networks to reference each other") - Eventually(Object(network1)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork1.Namespace, - apiNetNetwork1.Name, - apiNetNetwork1.Spec.ID, - apiNetNetwork1.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network2.Namespace, - Name: network2.Name, - UID: network2.UID, - }, networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network3.Namespace, - Name: network3.Name, - UID: network3.UID, - }, networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network4.Namespace, - Name: network4.Name, - UID: network4.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network1.Spec.Peerings[0].Name, - }, networkingv1alpha1.NetworkPeeringStatus{ - Name: network1.Spec.Peerings[1].Name, - }, networkingv1alpha1.NetworkPeeringStatus{ - Name: network1.Spec.Peerings[2].Name, - })), - )) - - Eventually(Object(network2)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork2.Namespace, - apiNetNetwork2.Name, - apiNetNetwork2.Spec.ID, - apiNetNetwork2.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network1.Namespace, - Name: network1.Name, - UID: network1.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network2.Spec.Peerings[0].Name, - })), - )) - - Eventually(Object(network3)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork3.Namespace, - apiNetNetwork3.Name, - apiNetNetwork3.Spec.ID, - apiNetNetwork3.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network1.Namespace, - Name: network1.Name, - UID: network1.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network3.Spec.Peerings[0].Name, - })), - )) - - Eventually(Object(network4)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork4.Namespace, - apiNetNetwork4.Name, - apiNetNetwork4.Spec.ID, - apiNetNetwork4.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network1.Namespace, - Name: network1.Name, - UID: network1.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network4.Spec.Peerings[0].Name, - })), - )) - - By("ensuring apinet network peeredIDs are updated") - Eventually(Object(apiNetNetwork1)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork2.Spec.ID, apiNetNetwork3.Spec.ID, apiNetNetwork4.Spec.ID)), - )) - - Eventually(Object(apiNetNetwork2)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID)), - )) - - Eventually(Object(apiNetNetwork3)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID)), - )) - - Eventually(Object(apiNetNetwork4)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID)), - )) - - By("deleting the networks") - Expect(k8sClient.Delete(ctx, network1)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network2)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network3)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network4)).To(Succeed()) - - By("waiting for networks to be gone") - Eventually(Get(network1)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network2)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network3)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network4)).Should(Satisfy(apierrors.IsNotFound)) - - By("asserting the corresponding apinet network is gone as well") - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork1), apiNetNetwork1)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork2), apiNetNetwork2)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork3), apiNetNetwork3)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork4), apiNetNetwork4)).To(Satisfy(apierrors.IsNotFound)) - }) - - It("should peer two networks from different namespaces if they reference each other correctly", func(ctx SpecContext) { - By("creating a network network-1") - network1 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-1", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-1", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-2", - Namespace: ns1.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network1)).To(Succeed()) - - By("creating a network network-2") - network2 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns1.Name, - Name: "network-2", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-1", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network2)).To(Succeed()) - - By("waiting for the corresponding APINet networks to be created") - apiNetNetwork1 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network1.UID), - }, - } - Eventually(Get(apiNetNetwork1)).Should(Succeed()) - - apiNetNetwork2 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network2.UID), - }, - } - Eventually(Get(apiNetNetwork2)).Should(Succeed()) - - By("inspecting the created apinet networks") - Expect(apiNetNetwork1.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network1), - )) - Expect(apiNetNetwork1.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork2.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network2), - )) - Expect(apiNetNetwork2.Spec.ID).NotTo(BeEmpty()) - - By("waiting for networks to reference each other") - Eventually(Object(network1)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork1.Namespace, - apiNetNetwork1.Name, - apiNetNetwork1.Spec.ID, - apiNetNetwork1.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network2.Namespace, - Name: network2.Name, - UID: network2.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network1.Spec.Peerings[0].Name, - })), - )) - - Eventually(Object(network2)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork2.Namespace, - apiNetNetwork2.Name, - apiNetNetwork2.Spec.ID, - apiNetNetwork2.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network1.Namespace, - Name: network1.Name, - UID: network1.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network2.Spec.Peerings[0].Name, - })), - )) - - By("ensuring apinet network peeredIDs are updated") - Eventually(Object(apiNetNetwork1)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork2.Spec.ID)), - )) - - Eventually(Object(apiNetNetwork2)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID)), - )) - - By("deleting the networks") - Expect(k8sClient.Delete(ctx, network1)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network2)).To(Succeed()) - - By("waiting for networks to be gone") - Eventually(Get(network1)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network2)).Should(Satisfy(apierrors.IsNotFound)) - - By("asserting the corresponding apinet network is gone as well") - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork1), apiNetNetwork1)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork2), apiNetNetwork2)).To(Satisfy(apierrors.IsNotFound)) - }) - - It("should not peer two networks if they dont exactly reference each other", func(ctx SpecContext) { - By("creating a network network-1") - network1 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-1", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-1", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-2", - Namespace: ns1.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network1)).To(Succeed()) - - By("creating a network network-2") - network2 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-2", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-other", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network2)).To(Succeed()) - - By("waiting for the corresponding APINet networks to be created") - apiNetNetwork1 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network1.UID), - }, - } - Eventually(Get(apiNetNetwork1)).Should(Succeed()) - - apiNetNetwork2 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network2.UID), - }, - } - Eventually(Get(apiNetNetwork2)).Should(Succeed()) - - By("inspecting the created apinet networks") - Expect(apiNetNetwork1.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network1), - )) - Expect(apiNetNetwork1.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork2.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network2), - )) - Expect(apiNetNetwork2.Spec.ID).NotTo(BeEmpty()) - - By("ensuring both networks do not get peered") - Eventually(Object(network1)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork1.Namespace, - apiNetNetwork1.Name, - apiNetNetwork1.Spec.ID, - apiNetNetwork1.UID, - ))), - HaveField("Spec.PeeringClaimRefs", BeEmpty()), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", BeEmpty()), - )) - - Eventually(Object(network2)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork2.Namespace, - apiNetNetwork2.Name, - apiNetNetwork2.Spec.ID, - apiNetNetwork2.UID, - ))), - HaveField("Spec.PeeringClaimRefs", BeEmpty()), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", BeEmpty()), - )) - - By("ensuring apinet network peeredIDs are empty") - Eventually(Object(apiNetNetwork1)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", BeEmpty()), - )) - - Eventually(Object(apiNetNetwork2)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", BeEmpty()), - )) - - By("deleting the networks") - Expect(k8sClient.Delete(ctx, network1)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network2)).To(Succeed()) - - By("waiting for networks to be gone") - Eventually(Get(network1)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network2)).Should(Satisfy(apierrors.IsNotFound)) - - By("asserting the corresponding apinet network is gone as well") - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork1), apiNetNetwork1)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork2), apiNetNetwork2)).To(Satisfy(apierrors.IsNotFound)) - }) - - It("should peer networks in the same namespace referencing each other", func(ctx SpecContext) { - By("creating a network network-1") - network1 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-1", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-1", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-2", - Namespace: ns.Name, - }, - }, - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-3", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network1)).To(Succeed()) - - By("creating a network network-2") - network2 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-2", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-1", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-1", - Namespace: ns.Name, - }, - }, - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-3", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network2)).To(Succeed()) - - By("creating a network network-3") - network3 := &networkingv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: "network-3", - }, - Spec: networkingv1alpha1.NetworkSpec{ - Peerings: []networkingv1alpha1.NetworkPeering{ - { - Name: "peering-1", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-1", - Namespace: ns.Name, - }, - }, - { - Name: "peering-2", - NetworkRef: networkingv1alpha1.NetworkPeeringNetworkRef{ - Name: "network-2", - Namespace: ns.Name, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, network3)).To(Succeed()) - - By("waiting for the corresponding APINet networks to be created") - apiNetNetwork1 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network1.UID), - }, - } - Eventually(Get(apiNetNetwork1)).Should(Succeed()) - - apiNetNetwork2 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network2.UID), - }, - } - Eventually(Get(apiNetNetwork2)).Should(Succeed()) - - apiNetNetwork3 := &apinetv1alpha1.Network{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: apiNetNs.Name, - Name: string(network3.UID), - }, - } - Eventually(Get(apiNetNetwork3)).Should(Succeed()) - - By("inspecting the created apinet networks") - Expect(apiNetNetwork1.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network1), - )) - Expect(apiNetNetwork1.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork2.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network2), - )) - Expect(apiNetNetwork2.Spec.ID).NotTo(BeEmpty()) - - Expect(apiNetNetwork3.Labels).To(Equal( - apinetletclient.SourceLabels(k8sClient.Scheme(), k8sClient.RESTMapper(), network3), - )) - Expect(apiNetNetwork3.Spec.ID).NotTo(BeEmpty()) - - By("waiting for networks to reference each other") - Eventually(Object(network1)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork1.Namespace, - apiNetNetwork1.Name, - apiNetNetwork1.Spec.ID, - apiNetNetwork1.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network2.Namespace, - Name: network2.Name, - UID: network2.UID, - }, networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network3.Namespace, - Name: network3.Name, - UID: network3.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network1.Spec.Peerings[0].Name, - }, networkingv1alpha1.NetworkPeeringStatus{ - Name: network1.Spec.Peerings[1].Name, - })), - )) - - Eventually(Object(network2)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork2.Namespace, - apiNetNetwork2.Name, - apiNetNetwork2.Spec.ID, - apiNetNetwork2.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network1.Namespace, - Name: network1.Name, - UID: network1.UID, - }, networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network3.Namespace, - Name: network3.Name, - UID: network3.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network2.Spec.Peerings[0].Name, - }, networkingv1alpha1.NetworkPeeringStatus{ - Name: network2.Spec.Peerings[1].Name, - })), - )) - - Eventually(Object(network3)). - Should(SatisfyAll( - HaveField("Spec.ProviderID", Equal(provider.GetNetworkID( - apiNetNetwork3.Namespace, - apiNetNetwork3.Name, - apiNetNetwork3.Spec.ID, - apiNetNetwork3.UID, - ))), - HaveField("Spec.PeeringClaimRefs", ConsistOf(networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network1.Namespace, - Name: network1.Name, - UID: network1.UID, - }, networkingv1alpha1.NetworkPeeringClaimRef{ - Namespace: network2.Namespace, - Name: network2.Name, - UID: network2.UID, - })), - HaveField("Status.State", Equal(networkingv1alpha1.NetworkStateAvailable)), - HaveField("Status.Peerings", ConsistOf(networkingv1alpha1.NetworkPeeringStatus{ - Name: network3.Spec.Peerings[0].Name, - }, networkingv1alpha1.NetworkPeeringStatus{ - Name: network3.Spec.Peerings[1].Name, - })), - )) - - By("ensuring apinet network peeredIDs are updated") - Eventually(Object(apiNetNetwork1)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork2.Spec.ID, apiNetNetwork3.Spec.ID)), - )) - - Eventually(Object(apiNetNetwork2)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID, apiNetNetwork3.Spec.ID)), - )) - - Eventually(Object(apiNetNetwork3)).Should(SatisfyAll( - HaveField("Spec.PeeredIDs", ConsistOf(apiNetNetwork1.Spec.ID, apiNetNetwork2.Spec.ID)), - )) - - By("deleting the networks") - Expect(k8sClient.Delete(ctx, network1)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network2)).To(Succeed()) - Expect(k8sClient.Delete(ctx, network3)).To(Succeed()) - - By("waiting for networks to be gone") - Eventually(Get(network1)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network2)).Should(Satisfy(apierrors.IsNotFound)) - Eventually(Get(network3)).Should(Satisfy(apierrors.IsNotFound)) - - By("asserting the corresponding apinet network is gone as well") - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork1), apiNetNetwork1)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork2), apiNetNetwork2)).To(Satisfy(apierrors.IsNotFound)) - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(apiNetNetwork3), apiNetNetwork3)).To(Satisfy(apierrors.IsNotFound)) - }) -}) diff --git a/client-go/applyconfigurations/core/v1alpha1/network.go b/client-go/applyconfigurations/core/v1alpha1/network.go index 4e52ec3c..154b6383 100644 --- a/client-go/applyconfigurations/core/v1alpha1/network.go +++ b/client-go/applyconfigurations/core/v1alpha1/network.go @@ -19,8 +19,8 @@ import ( type NetworkApplyConfiguration struct { v1.TypeMetaApplyConfiguration `json:",inline"` *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` - Spec *NetworkSpecApplyConfiguration `json:"spec,omitempty"` - Status *corev1alpha1.NetworkStatus `json:"status,omitempty"` + Spec *NetworkSpecApplyConfiguration `json:"spec,omitempty"` + Status *NetworkStatusApplyConfiguration `json:"status,omitempty"` } // Network constructs an declarative configuration of the Network type for use with @@ -239,7 +239,7 @@ func (b *NetworkApplyConfiguration) WithSpec(value *NetworkSpecApplyConfiguratio // WithStatus sets the Status field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Status field is set to the value of the last call. -func (b *NetworkApplyConfiguration) WithStatus(value corev1alpha1.NetworkStatus) *NetworkApplyConfiguration { - b.Status = &value +func (b *NetworkApplyConfiguration) WithStatus(value *NetworkStatusApplyConfiguration) *NetworkApplyConfiguration { + b.Status = value return b } diff --git a/client-go/applyconfigurations/core/v1alpha1/networkpeeringstatus.go b/client-go/applyconfigurations/core/v1alpha1/networkpeeringstatus.go new file mode 100644 index 00000000..5e392a4a --- /dev/null +++ b/client-go/applyconfigurations/core/v1alpha1/networkpeeringstatus.go @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and IronCore contributors +// SPDX-License-Identifier: Apache-2.0 + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" +) + +// NetworkPeeringStatusApplyConfiguration represents an declarative configuration of the NetworkPeeringStatus type for use +// with apply. +type NetworkPeeringStatusApplyConfiguration struct { + Name *string `json:"name,omitempty"` + State *v1alpha1.NetworkPeeringState `json:"state,omitempty"` +} + +// NetworkPeeringStatusApplyConfiguration constructs an declarative configuration of the NetworkPeeringStatus type for use with +// apply. +func NetworkPeeringStatus() *NetworkPeeringStatusApplyConfiguration { + return &NetworkPeeringStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *NetworkPeeringStatusApplyConfiguration) WithName(value string) *NetworkPeeringStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithState sets the State field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the State field is set to the value of the last call. +func (b *NetworkPeeringStatusApplyConfiguration) WithState(value v1alpha1.NetworkPeeringState) *NetworkPeeringStatusApplyConfiguration { + b.State = &value + return b +} diff --git a/client-go/applyconfigurations/core/v1alpha1/networkstatus.go b/client-go/applyconfigurations/core/v1alpha1/networkstatus.go new file mode 100644 index 00000000..02623207 --- /dev/null +++ b/client-go/applyconfigurations/core/v1alpha1/networkstatus.go @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and IronCore contributors +// SPDX-License-Identifier: Apache-2.0 + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// NetworkStatusApplyConfiguration represents an declarative configuration of the NetworkStatus type for use +// with apply. +type NetworkStatusApplyConfiguration struct { + Peerings []NetworkPeeringStatusApplyConfiguration `json:"peerings,omitempty"` +} + +// NetworkStatusApplyConfiguration constructs an declarative configuration of the NetworkStatus type for use with +// apply. +func NetworkStatus() *NetworkStatusApplyConfiguration { + return &NetworkStatusApplyConfiguration{} +} + +// WithPeerings adds the given value to the Peerings field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Peerings field. +func (b *NetworkStatusApplyConfiguration) WithPeerings(values ...*NetworkPeeringStatusApplyConfiguration) *NetworkStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPeerings") + } + b.Peerings = append(b.Peerings, *values[i]) + } + return b +} diff --git a/client-go/applyconfigurations/internal/internal.go b/client-go/applyconfigurations/internal/internal.go index 25097e07..cd18f237 100644 --- a/client-go/applyconfigurations/internal/internal.go +++ b/client-go/applyconfigurations/internal/internal.go @@ -766,6 +766,16 @@ var schemaYAML = typed.YAMLObject(`types: - name: state type: scalar: string +- name: com.github.ironcore-dev.ironcore-net.api.core.v1alpha1.NetworkPeeringStatus + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: state + type: + scalar: string - name: com.github.ironcore-dev.ironcore-net.api.core.v1alpha1.NetworkSpec map: fields: @@ -780,16 +790,13 @@ var schemaYAML = typed.YAMLObject(`types: elementRelationship: atomic - name: com.github.ironcore-dev.ironcore-net.api.core.v1alpha1.NetworkStatus map: - elementType: - scalar: untyped - list: - elementType: - namedType: __untyped_atomic_ - elementRelationship: atomic - map: - elementType: - namedType: __untyped_deduced_ - elementRelationship: separable + fields: + - name: peerings + type: + list: + elementType: + namedType: com.github.ironcore-dev.ironcore-net.api.core.v1alpha1.NetworkPeeringStatus + elementRelationship: atomic - name: com.github.ironcore-dev.ironcore-net.api.core.v1alpha1.Node map: fields: diff --git a/client-go/applyconfigurations/utils.go b/client-go/applyconfigurations/utils.go index e2adab31..60bfe731 100644 --- a/client-go/applyconfigurations/utils.go +++ b/client-go/applyconfigurations/utils.go @@ -106,8 +106,12 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &corev1alpha1.NetworkInterfaceSpecApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("NetworkInterfaceStatus"): return &corev1alpha1.NetworkInterfaceStatusApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("NetworkPeeringStatus"): + return &corev1alpha1.NetworkPeeringStatusApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("NetworkSpec"): return &corev1alpha1.NetworkSpecApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("NetworkStatus"): + return &corev1alpha1.NetworkStatusApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("Node"): return &corev1alpha1.NodeApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("NodeAffinity"): diff --git a/client-go/openapi/api_violations.report b/client-go/openapi/api_violations.report index f7127c59..3ea3c0cc 100644 --- a/client-go/openapi/api_violations.report +++ b/client-go/openapi/api_violations.report @@ -17,6 +17,7 @@ API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/c API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkInterfaceStatus,Prefixes API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkInterfaceStatus,PublicIPs API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkSpec,PeeredIDs +API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkStatus,Peerings API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NodeSelector,NodeSelectorTerms API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NodeSelectorRequirement,Values API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NodeSelectorTerm,MatchExpressions diff --git a/client-go/openapi/zz_generated.openapi.go b/client-go/openapi/zz_generated.openapi.go index f338a7cf..25788c9e 100644 --- a/client-go/openapi/zz_generated.openapi.go +++ b/client-go/openapi/zz_generated.openapi.go @@ -78,6 +78,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkInterfaceSpec": schema_ironcore_net_api_core_v1alpha1_NetworkInterfaceSpec(ref), "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkInterfaceStatus": schema_ironcore_net_api_core_v1alpha1_NetworkInterfaceStatus(ref), "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkList": schema_ironcore_net_api_core_v1alpha1_NetworkList(ref), + "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkPeeringStatus": schema_ironcore_net_api_core_v1alpha1_NetworkPeeringStatus(ref), "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkSpec": schema_ironcore_net_api_core_v1alpha1_NetworkSpec(ref), "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkStatus": schema_ironcore_net_api_core_v1alpha1_NetworkStatus(ref), "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.Node": schema_ironcore_net_api_core_v1alpha1_Node(ref), @@ -2765,6 +2766,35 @@ func schema_ironcore_net_api_core_v1alpha1_NetworkList(ref common.ReferenceCallb } } +func schema_ironcore_net_api_core_v1alpha1_NetworkPeeringStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "NetworkPeeringStatus is the status of a network peering.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name is the name of the network peering.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "state": { + SchemaProps: spec.SchemaProps{ + Description: "State represents the network peering state", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"name"}, + }, + }, + } +} + func schema_ironcore_net_api_core_v1alpha1_NetworkSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -2804,8 +2834,26 @@ func schema_ironcore_net_api_core_v1alpha1_NetworkStatus(ref common.ReferenceCal Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "peerings": { + SchemaProps: spec.SchemaProps{ + Description: "Peerings contains the states of the network peerings for the network.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkPeeringStatus"), + }, + }, + }, + }, + }, + }, }, }, + Dependencies: []string{ + "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkPeeringStatus"}, } } diff --git a/cmd/apinetlet/main.go b/cmd/apinetlet/main.go index 6ae77224..77843c83 100644 --- a/cmd/apinetlet/main.go +++ b/cmd/apinetlet/main.go @@ -200,16 +200,6 @@ func main() { os.Exit(1) } - if err = (&controllers.NetworkPeeringReconciler{ - Client: mgr.GetClient(), - APINetClient: apiNetCluster.GetClient(), - APINetNamespace: apiNetNamespace, - WatchFilterValue: watchFilterValue, - }).SetupWithManager(mgr, apiNetCluster.GetCache()); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "NetworkPeering") - os.Exit(1) - } - if err = (&controllers.NetworkInterfaceReconciler{ Client: mgr.GetClient(), APINetClient: apiNetCluster.GetClient(), diff --git a/docs/concepts/network-lifecycle.md b/docs/concepts/network-lifecycle.md index 787f9f04..c4ed616d 100644 --- a/docs/concepts/network-lifecycle.md +++ b/docs/concepts/network-lifecycle.md @@ -31,13 +31,12 @@ When creating network peering both `ironcore` `Network`s has to specify matching `spec.peerings` referencing each other respectively. A `ironcore` `Network` can be peered with multiple `network`s in any namespcae. -Once specified `apinetlet` `NetworkPeeringController` validates if all the specified `network`s are in -`Available` state,they do exists and have matching `peerings`. +The `apinetlet` `NetworkController` checks if there are any `peeringClaimRefs` +present in `ironcore` `Network`. If yes then get `ironcore-net` `Network` using `UID` of `peeringClaimRef` +and add `spec.ID` of that `ironcore-net` `Network` into `spec.peeredIDs` of current `ironcore-net` `Network`. -If validation is successful, `apinetlet` `NetworkPeeringController` updates `ironcore` `Network` -`status.peerings` with network peering `name`s and `spec.incomingPeerings` with valid -incoming peerings. Also `apinetlet` `NetworkPeeringController` updates `ironcore-net` `Network` -`spec.peeredIDs` with valid peered network's `providerID`'s. +The `apinetlet` `NetworkController` also checks for `status.peerings` in `ironcore` `Network`. +If yes then update `ironcore-net` `Network`s `status.peerings` with `ironcore` `Network`s `status.peerings` Once `ironcore-net` `Network` is updated with `spec.peeredIDs`, `metalnetlet` `NetworkController` updates `metalnet` `Network` `spec.peeredIDs` with corresponding `ironcore-net` `Network` `spec.peeredIDs` \ No newline at end of file diff --git a/internal/apis/core/network_types.go b/internal/apis/core/network_types.go index 743ccd8d..45b97a84 100644 --- a/internal/apis/core/network_types.go +++ b/internal/apis/core/network_types.go @@ -11,10 +11,34 @@ type NetworkSpec struct { // ID is the ID of the network. ID string // PeeredIDs are the IDs of networks to peer with. - PeeredIDs []string `json:"peeredIDs,omitempty"` + PeeredIDs []string } type NetworkStatus struct { + // Peerings contains the states of the network peerings for the network. + Peerings []NetworkPeeringStatus +} + +// NetworkState is the state of a network. +// +enum +type NetworkState string + +// NetworkPeeringState is the state a NetworkPeering can be in +type NetworkPeeringState string + +const ( + // NetworkPeeringStatePending signals that the network peering is not applied. + NetworkPeeringStatePending NetworkPeeringState = "Pending" + // NetworkPeeringStateApplied signals that the network peering is applied. + NetworkPeeringStateApplied NetworkPeeringState = "Applied" +) + +// NetworkPeeringStatus is the status of a network peering. +type NetworkPeeringStatus struct { + // Name is the name of the network peering. + Name string + // State represents the network peering state + State NetworkPeeringState } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/internal/apis/core/v1alpha1/zz_generated.conversion.go b/internal/apis/core/v1alpha1/zz_generated.conversion.go index 39042b19..08d23119 100644 --- a/internal/apis/core/v1alpha1/zz_generated.conversion.go +++ b/internal/apis/core/v1alpha1/zz_generated.conversion.go @@ -608,6 +608,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1alpha1.NetworkPeeringStatus)(nil), (*core.NetworkPeeringStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_NetworkPeeringStatus_To_core_NetworkPeeringStatus(a.(*v1alpha1.NetworkPeeringStatus), b.(*core.NetworkPeeringStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NetworkPeeringStatus)(nil), (*v1alpha1.NetworkPeeringStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NetworkPeeringStatus_To_v1alpha1_NetworkPeeringStatus(a.(*core.NetworkPeeringStatus), b.(*v1alpha1.NetworkPeeringStatus), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1alpha1.NetworkSpec)(nil), (*core.NetworkSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_NetworkSpec_To_core_NetworkSpec(a.(*v1alpha1.NetworkSpec), b.(*core.NetworkSpec), scope) }); err != nil { @@ -2177,6 +2187,28 @@ func Convert_core_NetworkList_To_v1alpha1_NetworkList(in *core.NetworkList, out return autoConvert_core_NetworkList_To_v1alpha1_NetworkList(in, out, s) } +func autoConvert_v1alpha1_NetworkPeeringStatus_To_core_NetworkPeeringStatus(in *v1alpha1.NetworkPeeringStatus, out *core.NetworkPeeringStatus, s conversion.Scope) error { + out.Name = in.Name + out.State = core.NetworkPeeringState(in.State) + return nil +} + +// Convert_v1alpha1_NetworkPeeringStatus_To_core_NetworkPeeringStatus is an autogenerated conversion function. +func Convert_v1alpha1_NetworkPeeringStatus_To_core_NetworkPeeringStatus(in *v1alpha1.NetworkPeeringStatus, out *core.NetworkPeeringStatus, s conversion.Scope) error { + return autoConvert_v1alpha1_NetworkPeeringStatus_To_core_NetworkPeeringStatus(in, out, s) +} + +func autoConvert_core_NetworkPeeringStatus_To_v1alpha1_NetworkPeeringStatus(in *core.NetworkPeeringStatus, out *v1alpha1.NetworkPeeringStatus, s conversion.Scope) error { + out.Name = in.Name + out.State = v1alpha1.NetworkPeeringState(in.State) + return nil +} + +// Convert_core_NetworkPeeringStatus_To_v1alpha1_NetworkPeeringStatus is an autogenerated conversion function. +func Convert_core_NetworkPeeringStatus_To_v1alpha1_NetworkPeeringStatus(in *core.NetworkPeeringStatus, out *v1alpha1.NetworkPeeringStatus, s conversion.Scope) error { + return autoConvert_core_NetworkPeeringStatus_To_v1alpha1_NetworkPeeringStatus(in, out, s) +} + func autoConvert_v1alpha1_NetworkSpec_To_core_NetworkSpec(in *v1alpha1.NetworkSpec, out *core.NetworkSpec, s conversion.Scope) error { out.ID = in.ID out.PeeredIDs = *(*[]string)(unsafe.Pointer(&in.PeeredIDs)) @@ -2200,6 +2232,7 @@ func Convert_core_NetworkSpec_To_v1alpha1_NetworkSpec(in *core.NetworkSpec, out } func autoConvert_v1alpha1_NetworkStatus_To_core_NetworkStatus(in *v1alpha1.NetworkStatus, out *core.NetworkStatus, s conversion.Scope) error { + out.Peerings = *(*[]core.NetworkPeeringStatus)(unsafe.Pointer(&in.Peerings)) return nil } @@ -2209,6 +2242,7 @@ func Convert_v1alpha1_NetworkStatus_To_core_NetworkStatus(in *v1alpha1.NetworkSt } func autoConvert_core_NetworkStatus_To_v1alpha1_NetworkStatus(in *core.NetworkStatus, out *v1alpha1.NetworkStatus, s conversion.Scope) error { + out.Peerings = *(*[]v1alpha1.NetworkPeeringStatus)(unsafe.Pointer(&in.Peerings)) return nil } diff --git a/internal/apis/core/zz_generated.deepcopy.go b/internal/apis/core/zz_generated.deepcopy.go index 13cd7b8a..e5ae5004 100644 --- a/internal/apis/core/zz_generated.deepcopy.go +++ b/internal/apis/core/zz_generated.deepcopy.go @@ -1177,7 +1177,7 @@ func (in *Network) DeepCopyInto(out *Network) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -1522,6 +1522,22 @@ func (in *NetworkList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkPeeringStatus) DeepCopyInto(out *NetworkPeeringStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPeeringStatus. +func (in *NetworkPeeringStatus) DeepCopy() *NetworkPeeringStatus { + if in == nil { + return nil + } + out := new(NetworkPeeringStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { *out = *in @@ -1546,6 +1562,11 @@ func (in *NetworkSpec) DeepCopy() *NetworkSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { *out = *in + if in.Peerings != nil { + in, out := &in.Peerings, &out.Peerings + *out = make([]NetworkPeeringStatus, len(*in)) + copy(*out, *in) + } return }