From 1dfabb7a5fe7ee4f7c64853d5709c2c490f78bed Mon Sep 17 00:00:00 2001 From: Kajol Asabe Date: Thu, 19 Sep 2024 13:12:21 +0530 Subject: [PATCH 1/5] Patch network spec and status only when its changed --- apinetlet/controllers/conversion.go | 4 +- apinetlet/controllers/network_controller.go | 79 +++++++++---- metalnetlet/controllers/network_controller.go | 108 +++++++++++++----- 3 files changed, 136 insertions(+), 55 deletions(-) diff --git a/apinetlet/controllers/conversion.go b/apinetlet/controllers/conversion.go index e81516ed..535a9848 100644 --- a/apinetlet/controllers/conversion.go +++ b/apinetlet/controllers/conversion.go @@ -81,13 +81,13 @@ func apiNetNetworkInterfaceStateToNetworkInterfaceState(state apinetv1alpha1.Net } func apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(peerings []apinetv1alpha1.NetworkPeeringStatus, specPeerings []apinetv1alpha1.NetworkPeering) []networkingv1alpha1.NetworkPeeringStatus { - networkPeeringsStatus := []networkingv1alpha1.NetworkPeeringStatus{} + var networkPeeringsStatus []networkingv1alpha1.NetworkPeeringStatus for _, peering := range peerings { idx := slices.IndexFunc(specPeerings, func(specPeering apinetv1alpha1.NetworkPeering) bool { return specPeering.ID == strconv.Itoa(int(peering.ID)) }) if idx != -1 { - prefixStatus := []networkingv1alpha1.PeeringPrefixStatus{} + var prefixStatus []networkingv1alpha1.PeeringPrefixStatus if peering.State == apinetv1alpha1.NetworkPeeringStateReady { for _, peeringPrefix := range specPeerings[idx].Prefixes { prefixStatus = append(prefixStatus, networkingv1alpha1.PeeringPrefixStatus{ diff --git a/apinetlet/controllers/network_controller.go b/apinetlet/controllers/network_controller.go index e4d79f46..490e129a 100644 --- a/apinetlet/controllers/network_controller.go +++ b/apinetlet/controllers/network_controller.go @@ -6,6 +6,7 @@ package controllers import ( "context" "fmt" + "reflect" "slices" "github.com/go-logr/logr" @@ -115,15 +116,20 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network } log.V(1).Info("Target APINet network is not yet gone, requeueing") - return ctrl.Result{Requeue: true}, nil + return ctrl.Result{}, nil } -func (r *NetworkReconciler) updateNetworkStatus(ctx context.Context, network *networkingv1alpha1.Network, apiNetNetwork *apinetv1alpha1.Network, state networkingv1alpha1.NetworkState) error { +func (r *NetworkReconciler) updateNetworkStatus(ctx context.Context, log logr.Logger, network *networkingv1alpha1.Network, apiNetNetwork *apinetv1alpha1.Network, state networkingv1alpha1.NetworkState) error { networkBase := network.DeepCopy() - network.Status.State = state - network.Status.Peerings = apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(apiNetNetwork.Status.Peerings, apiNetNetwork.Spec.Peerings) - if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil { - return fmt.Errorf("unable to patch network: %w", err) + statusPeerings := apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(apiNetNetwork.Status.Peerings, apiNetNetwork.Spec.Peerings) + log.V(1).Info("netwrok status peerings", "old", network.Status.Peerings, "new", statusPeerings) + if network.Status.State != state || !reflect.DeepEqual(network.Status.Peerings, statusPeerings) { + log.V(1).Info("Patching network status") + network.Status.State = state + network.Status.Peerings = statusPeerings + if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil { + return fmt.Errorf("unable to patch network: %w", err) + } } return nil } @@ -138,13 +144,13 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } if modified { log.V(1).Info("Added finalizer, requeueing") - return ctrl.Result{Requeue: true}, nil + return ctrl.Result{}, nil } apiNetNetwork, err := r.applyAPINetNetwork(ctx, log, network) if err != nil { if network.Status.State != networkingv1alpha1.NetworkStateAvailable { - if err := r.updateNetworkStatus(ctx, network, apiNetNetwork, networkingv1alpha1.NetworkStatePending); err != nil { + if err := r.updateNetworkStatus(ctx, log, network, apiNetNetwork, networkingv1alpha1.NetworkStatePending); err != nil { log.Error(err, "Error updating network state") } } @@ -160,11 +166,11 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } log.V(1).Info("Set network provider id, requeueing") - return ctrl.Result{Requeue: true}, nil + return ctrl.Result{}, nil } log.V(1).Info("Updating network status") - if err := r.updateNetworkStatus(ctx, network, apiNetNetwork, networkingv1alpha1.NetworkStateAvailable); err != nil { + if err := r.updateNetworkStatus(ctx, log, network, apiNetNetwork, networkingv1alpha1.NetworkStateAvailable); err != nil { return ctrl.Result{}, fmt.Errorf("error updating network status: %w", err) } log.V(1).Info("Updated network status") @@ -187,16 +193,28 @@ func (r *NetworkReconciler) setNetworkProviderID( } func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Logger, network *networkingv1alpha1.Network) (*apinetv1alpha1.Network, error) { - apiNetNetwork := &apinetv1alpha1.Network{ - TypeMeta: metav1.TypeMeta{ - APIVersion: apinetv1alpha1.SchemeGroupVersion.String(), - Kind: "Network", - }, - ObjectMeta: metav1.ObjectMeta{ - Namespace: r.APINetNamespace, - Name: string(network.UID), - Labels: apinetletclient.SourceLabels(r.Scheme(), r.RESTMapper(), network), - }, + isNetworkExist := false + apiNetNetwork := &apinetv1alpha1.Network{} + apiNetNetworkKey := client.ObjectKey{Namespace: r.APINetNamespace, Name: string(network.UID)} + log.V(1).Info("Check if APINet network already exists") + if err := r.APINetClient.Get(ctx, apiNetNetworkKey, apiNetNetwork); err != nil { + if !apierrors.IsNotFound(err) { + return nil, fmt.Errorf("error getting apinet network %s: %w", apiNetNetworkKey.Name, err) + } else { + apiNetNetwork = &apinetv1alpha1.Network{ + TypeMeta: metav1.TypeMeta{ + APIVersion: apinetv1alpha1.SchemeGroupVersion.String(), + Kind: "Network", + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: r.APINetNamespace, + Name: string(network.UID), + Labels: apinetletclient.SourceLabels(r.Scheme(), r.RESTMapper(), network), + }, + } + } + } else { + isNetworkExist = true } var peerings []apinetv1alpha1.NetworkPeering @@ -228,17 +246,28 @@ func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Log }) } } - apiNetNetwork.Spec.Peerings = peerings + // apiNetNetwork.Spec.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) + log.V(1).Info("APINet network spec peerings", "old", apiNetNetwork.Spec.Peerings, "new", peerings) + log.V(1).Info("APINet network status", "old", apiNetNetwork.Status.Peerings) + isPeeringsEqual := reflect.DeepEqual(apiNetNetwork.Spec.Peerings, peerings) + + if !isNetworkExist || !isPeeringsEqual { + log.V(1).Info("Applying APINet network") + + if !isPeeringsEqual { + apiNetNetwork.Spec.Peerings = peerings + } + apiNetNetwork.ManagedFields = nil + if err := r.APINetClient.Patch(ctx, apiNetNetwork, client.Apply, fieldOwner, client.ForceOwnership); err != nil { + return nil, fmt.Errorf("error applying apinet network: %w", err) + } } return apiNetNetwork, nil } func (r *NetworkReconciler) getAPINetNetworkPeeringPrefixes(ctx context.Context, peeringPrefixes []networkingv1alpha1.PeeringPrefix, networkNamespace string) ([]apinetv1alpha1.PeeringPrefix, error) { - apinetPeeringPrefixes := []apinetv1alpha1.PeeringPrefix{} + var apinetPeeringPrefixes []apinetv1alpha1.PeeringPrefix for _, prefix := range peeringPrefixes { if prefix.Prefix != nil { apinetPeeringPrefixes = append(apinetPeeringPrefixes, apinetv1alpha1.PeeringPrefix{ diff --git a/metalnetlet/controllers/network_controller.go b/metalnetlet/controllers/network_controller.go index 4857e3cb..bc19bfac 100644 --- a/metalnetlet/controllers/network_controller.go +++ b/metalnetlet/controllers/network_controller.go @@ -6,6 +6,8 @@ package controllers import ( "context" "fmt" + "reflect" + "slices" "github.com/go-logr/logr" "github.com/ironcore-dev/controller-utils/clientutils" @@ -18,9 +20,12 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 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/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/source" ) @@ -111,11 +116,17 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network return ctrl.Result{}, nil } -func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, network *apinetv1alpha1.Network, metalnetNetwork *metalnetv1alpha1.Network) error { - networkBase := network.DeepCopy() - network.Status.Peerings = metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings) - if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil { - return fmt.Errorf("unable to patch network: %w", err) +func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, log logr.Logger, network *apinetv1alpha1.Network, metalnetNetwork *metalnetv1alpha1.Network) error { + newStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings) + log.V(1).Info("apinet status", "old", network.Status.Peerings, "new", newStatusPeerings) + if network.Spec.Peerings != nil && newStatusPeerings != nil && !slices.Equal(network.Status.Peerings, newStatusPeerings) { + log.V(1).Info("Patching apinet network status", "status", newStatusPeerings) + networkBase := network.DeepCopy() + network.Status.Peerings = newStatusPeerings + if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil { + return fmt.Errorf("unable to patch network: %w", err) + } + log.V(1).Info("Patched apinet network status") } return nil } @@ -136,34 +147,46 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } if modified { log.V(1).Info("Added finalizer") - return ctrl.Result{Requeue: true}, nil + return ctrl.Result{}, nil } log.V(1).Info("Finalizer is present") - log.V(1).Info("Applying metalnet network") - metalnetNetwork := &metalnetv1alpha1.Network{ - TypeMeta: metav1.TypeMeta{ - APIVersion: metalnetv1alpha1.GroupVersion.String(), - Kind: "Network", - }, - ObjectMeta: metav1.ObjectMeta{ - Namespace: r.MetalnetNamespace, - Name: string(network.UID), - Labels: metalnetletclient.SourceLabels(r.Scheme(), r.RESTMapper(), network), - }, - Spec: metalnetv1alpha1.NetworkSpec{ - ID: vni, - }, + log.V(1).Info("Check if metalnet network already present") + isNetworkExist := false + metalnetNetwork := &metalnetv1alpha1.Network{} + metalnetNetworkKey := client.ObjectKey{Namespace: r.MetalnetNamespace, Name: string(network.UID)} + if err := r.MetalnetClient.Get(ctx, metalnetNetworkKey, metalnetNetwork); err != nil { + if !apierrors.IsNotFound(err) { + return ctrl.Result{}, fmt.Errorf("error getting metalnet network %s: %w", metalnetNetworkKey.Name, err) + } else { + metalnetNetwork = &metalnetv1alpha1.Network{ + TypeMeta: metav1.TypeMeta{ + APIVersion: metalnetv1alpha1.GroupVersion.String(), + Kind: "Network", + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: r.MetalnetNamespace, + Name: string(network.UID), + Labels: metalnetletclient.SourceLabels(r.Scheme(), r.RESTMapper(), network), + }, + Spec: metalnetv1alpha1.NetworkSpec{ + ID: vni, + }, + } + } + } else { + isNetworkExist = true } - - peeredPrefixes := []metalnetv1alpha1.PeeredPrefix{} + var peeredIDs []int32 + var peeredPrefixes []metalnetv1alpha1.PeeredPrefix for _, peering := range network.Spec.Peerings { id, err := networkid.ParseVNI(peering.ID) if err != nil { return ctrl.Result{}, fmt.Errorf("failed to parse peered network ID: %w", err) } - metalnetNetwork.Spec.PeeredIDs = append(metalnetNetwork.Spec.PeeredIDs, id) + // metalnetNetwork.Spec.PeeredIDs = append(metalnetNetwork.Spec.PeeredIDs, id) + peeredIDs = append(peeredIDs, id) if len(peering.Prefixes) > 0 { ipPrefixes := getIPPrefixes(peering.Prefixes) @@ -174,15 +197,33 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw peeredPrefixes = append(peeredPrefixes, peeredPrefix) } } - metalnetNetwork.Spec.PeeredPrefixes = peeredPrefixes + // metalnetNetwork.Spec.PeeredPrefixes = peeredPrefixes + isPeeredIDsEqual := slices.Equal(metalnetNetwork.Spec.PeeredIDs, peeredIDs) + isPeeredPrefixesEqual := reflect.DeepEqual(metalnetNetwork.Spec.PeeredPrefixes, peeredPrefixes) + + log.V(1).Info("Peered IDs", "old", metalnetNetwork.Spec.PeeredIDs, "new", peeredIDs) + log.V(1).Info("Peered Prefixes", "old", metalnetNetwork.Spec.PeeredPrefixes, "new", peeredPrefixes) + log.V(1).Info("Is equal", "peered ids", isPeeredIDsEqual, "peered prefixes", isPeeredPrefixesEqual) - if err := r.MetalnetClient.Patch(ctx, metalnetNetwork, client.Apply, MetalnetFieldOwner, client.ForceOwnership); err != nil { - return ctrl.Result{}, fmt.Errorf("error applying network: %w", err) + if !isNetworkExist || !isPeeredIDsEqual || !isPeeredPrefixesEqual { + log.V(1).Info("Applying metalnet network") + + if !isPeeredIDsEqual { + metalnetNetwork.Spec.PeeredIDs = peeredIDs + } + if !isPeeredPrefixesEqual { + metalnetNetwork.Spec.PeeredPrefixes = peeredPrefixes + } + metalnetNetwork.ManagedFields = nil + if err := r.MetalnetClient.Patch(ctx, metalnetNetwork, client.Apply, MetalnetFieldOwner, client.ForceOwnership); err != nil { + return ctrl.Result{}, fmt.Errorf("error applying metalnet network: %w", err) + } + log.V(1).Info("Applied metalnet network") } - log.V(1).Info("Applied metalnet network") log.V(1).Info("Updating apinet network status") - if err := r.updateApinetNetworkStatus(ctx, network, metalnetNetwork); err != nil { + log.V(1).Info("network status", "apinet", network.Status, "metalnet", metalnetNetwork.Status) + if err := r.updateApinetNetworkStatus(ctx, log, network, metalnetNetwork); err != nil { return ctrl.Result{}, fmt.Errorf("error updating apinet networkstatus: %w", err) } log.V(1).Info("Updated apinet network status") @@ -205,6 +246,7 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager, metalnetCache cac return ctrl.NewControllerManagedBy(mgr). For( &apinetv1alpha1.Network{}, + builder.WithPredicates(r.networkStatusChangedPredicate()), ). WatchesRawSource( source.Kind(metalnetCache, &metalnetv1alpha1.Network{}), @@ -212,3 +254,13 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager, metalnetCache cac ). Complete(r) } + +func (r *NetworkReconciler) networkStatusChangedPredicate() predicate.Predicate { + return predicate.Funcs{ + UpdateFunc: func(evt event.UpdateEvent) bool { + oldNetwork := evt.ObjectOld.(*apinetv1alpha1.Network) + newNetwork := evt.ObjectNew.(*apinetv1alpha1.Network) + return !slices.Equal(oldNetwork.Status.Peerings, newNetwork.Status.Peerings) && newNetwork.Status.Peerings != nil + }, + } +} From 67fd16f897342543c6481b80e0e26aee485ca0ee Mon Sep 17 00:00:00 2001 From: Kajol Asabe Date: Thu, 19 Sep 2024 14:25:00 +0530 Subject: [PATCH 2/5] Remove status changed predicate --- apinetlet/controllers/network_controller.go | 2 +- metalnetlet/controllers/network_controller.go | 25 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/apinetlet/controllers/network_controller.go b/apinetlet/controllers/network_controller.go index 490e129a..5135057c 100644 --- a/apinetlet/controllers/network_controller.go +++ b/apinetlet/controllers/network_controller.go @@ -122,7 +122,7 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network func (r *NetworkReconciler) updateNetworkStatus(ctx context.Context, log logr.Logger, network *networkingv1alpha1.Network, apiNetNetwork *apinetv1alpha1.Network, state networkingv1alpha1.NetworkState) error { networkBase := network.DeepCopy() statusPeerings := apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(apiNetNetwork.Status.Peerings, apiNetNetwork.Spec.Peerings) - log.V(1).Info("netwrok status peerings", "old", network.Status.Peerings, "new", statusPeerings) + log.V(1).Info("network status peerings", "old", network.Status.Peerings, "new", statusPeerings) if network.Status.State != state || !reflect.DeepEqual(network.Status.Peerings, statusPeerings) { log.V(1).Info("Patching network status") network.Status.State = state diff --git a/metalnetlet/controllers/network_controller.go b/metalnetlet/controllers/network_controller.go index bc19bfac..5fb62238 100644 --- a/metalnetlet/controllers/network_controller.go +++ b/metalnetlet/controllers/network_controller.go @@ -20,12 +20,9 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 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/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/source" ) @@ -119,7 +116,7 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, log logr.Logger, network *apinetv1alpha1.Network, metalnetNetwork *metalnetv1alpha1.Network) error { newStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings) log.V(1).Info("apinet status", "old", network.Status.Peerings, "new", newStatusPeerings) - if network.Spec.Peerings != nil && newStatusPeerings != nil && !slices.Equal(network.Status.Peerings, newStatusPeerings) { + if !slices.Equal(network.Status.Peerings, newStatusPeerings) { log.V(1).Info("Patching apinet network status", "status", newStatusPeerings) networkBase := network.DeepCopy() network.Status.Peerings = newStatusPeerings @@ -246,7 +243,7 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager, metalnetCache cac return ctrl.NewControllerManagedBy(mgr). For( &apinetv1alpha1.Network{}, - builder.WithPredicates(r.networkStatusChangedPredicate()), + // builder.WithPredicates(r.networkStatusChangedPredicate()), ). WatchesRawSource( source.Kind(metalnetCache, &metalnetv1alpha1.Network{}), @@ -255,12 +252,12 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager, metalnetCache cac Complete(r) } -func (r *NetworkReconciler) networkStatusChangedPredicate() predicate.Predicate { - return predicate.Funcs{ - UpdateFunc: func(evt event.UpdateEvent) bool { - oldNetwork := evt.ObjectOld.(*apinetv1alpha1.Network) - newNetwork := evt.ObjectNew.(*apinetv1alpha1.Network) - return !slices.Equal(oldNetwork.Status.Peerings, newNetwork.Status.Peerings) && newNetwork.Status.Peerings != nil - }, - } -} +// func (r *NetworkReconciler) networkStatusChangedPredicate() predicate.Predicate { +// return predicate.Funcs{ +// UpdateFunc: func(evt event.UpdateEvent) bool { +// oldNetwork := evt.ObjectOld.(*apinetv1alpha1.Network) +// newNetwork := evt.ObjectNew.(*apinetv1alpha1.Network) +// return !slices.Equal(oldNetwork.Status.Peerings, newNetwork.Status.Peerings) +// }, +// } +// } From 31e6b956d0f5bbc9103ade472100036bd9c7a00f Mon Sep 17 00:00:00 2001 From: Kajol Asabe Date: Mon, 23 Sep 2024 13:17:06 +0530 Subject: [PATCH 3/5] use equality.semantics.DeepEqual() wherever possible --- apinetlet/controllers/network_controller.go | 10 ++++++---- metalnetlet/controllers/network_controller.go | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apinetlet/controllers/network_controller.go b/apinetlet/controllers/network_controller.go index 5135057c..aa5f810b 100644 --- a/apinetlet/controllers/network_controller.go +++ b/apinetlet/controllers/network_controller.go @@ -12,6 +12,7 @@ import ( "github.com/go-logr/logr" apinetv1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" + "github.com/ironcore-dev/ironcore-net/apimachinery/equality" apinetletclient "github.com/ironcore-dev/ironcore-net/apinetlet/client" "github.com/ironcore-dev/ironcore-net/apinetlet/handler" "github.com/ironcore-dev/ironcore-net/apinetlet/provider" @@ -116,7 +117,7 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network } log.V(1).Info("Target APINet network is not yet gone, requeueing") - return ctrl.Result{}, nil + return ctrl.Result{Requeue: true}, nil } func (r *NetworkReconciler) updateNetworkStatus(ctx context.Context, log logr.Logger, network *networkingv1alpha1.Network, apiNetNetwork *apinetv1alpha1.Network, state networkingv1alpha1.NetworkState) error { @@ -144,7 +145,7 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } if modified { log.V(1).Info("Added finalizer, requeueing") - return ctrl.Result{}, nil + return ctrl.Result{Requeue: true}, nil } apiNetNetwork, err := r.applyAPINetNetwork(ctx, log, network) @@ -166,7 +167,7 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } log.V(1).Info("Set network provider id, requeueing") - return ctrl.Result{}, nil + return ctrl.Result{Requeue: true}, nil } log.V(1).Info("Updating network status") @@ -214,6 +215,7 @@ func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Log } } } else { + log.V(1).Info("APINet network already exists") isNetworkExist = true } @@ -250,7 +252,7 @@ func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Log log.V(1).Info("APINet network spec peerings", "old", apiNetNetwork.Spec.Peerings, "new", peerings) log.V(1).Info("APINet network status", "old", apiNetNetwork.Status.Peerings) - isPeeringsEqual := reflect.DeepEqual(apiNetNetwork.Spec.Peerings, peerings) + isPeeringsEqual := equality.Semantic.DeepEqual(apiNetNetwork.Spec.Peerings, peerings) if !isNetworkExist || !isPeeringsEqual { log.V(1).Info("Applying APINet network") diff --git a/metalnetlet/controllers/network_controller.go b/metalnetlet/controllers/network_controller.go index 5fb62238..17fbeb78 100644 --- a/metalnetlet/controllers/network_controller.go +++ b/metalnetlet/controllers/network_controller.go @@ -7,12 +7,12 @@ import ( "context" "fmt" "reflect" - "slices" "github.com/go-logr/logr" "github.com/ironcore-dev/controller-utils/clientutils" 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/apimachinery/equality" metalnetletclient "github.com/ironcore-dev/ironcore-net/metalnetlet/client" metalnetlethandler "github.com/ironcore-dev/ironcore-net/metalnetlet/handler" "github.com/ironcore-dev/ironcore-net/networkid" @@ -116,7 +116,7 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, log logr.Logger, network *apinetv1alpha1.Network, metalnetNetwork *metalnetv1alpha1.Network) error { newStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings) log.V(1).Info("apinet status", "old", network.Status.Peerings, "new", newStatusPeerings) - if !slices.Equal(network.Status.Peerings, newStatusPeerings) { + if !equality.Semantic.DeepEqual(network.Status.Peerings, newStatusPeerings) { log.V(1).Info("Patching apinet network status", "status", newStatusPeerings) networkBase := network.DeepCopy() network.Status.Peerings = newStatusPeerings @@ -144,7 +144,7 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } if modified { log.V(1).Info("Added finalizer") - return ctrl.Result{}, nil + return ctrl.Result{Requeue: true}, nil } log.V(1).Info("Finalizer is present") @@ -195,7 +195,7 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } } // metalnetNetwork.Spec.PeeredPrefixes = peeredPrefixes - isPeeredIDsEqual := slices.Equal(metalnetNetwork.Spec.PeeredIDs, peeredIDs) + isPeeredIDsEqual := equality.Semantic.DeepEqual(metalnetNetwork.Spec.PeeredIDs, peeredIDs) isPeeredPrefixesEqual := reflect.DeepEqual(metalnetNetwork.Spec.PeeredPrefixes, peeredPrefixes) log.V(1).Info("Peered IDs", "old", metalnetNetwork.Spec.PeeredIDs, "new", peeredIDs) From dd08b4de2d2537880f414e7769f1fc5adad896b5 Mon Sep 17 00:00:00 2001 From: Kajol Asabe Date: Tue, 1 Oct 2024 21:44:17 +0530 Subject: [PATCH 4/5] Add partition wise network peering status in apinetlet --- api/core/v1alpha1/network_types.go | 2 +- api/core/v1alpha1/zz_generated.deepcopy.go | 14 ++++++- apinetlet/controllers/conversion.go | 41 +++++++++++-------- apinetlet/controllers/network_controller.go | 3 -- .../controllers/network_controller_test.go | 8 ++-- .../core/v1alpha1/networkstatus.go | 23 +++++++---- .../applyconfigurations/internal/internal.go | 8 ++-- client-go/openapi/api_violations.report | 1 - client-go/openapi/zz_generated.openapi.go | 16 ++++++-- docs/api-reference/core.md | 11 ++--- internal/apis/core/network_types.go | 2 +- .../core/v1alpha1/zz_generated.conversion.go | 4 +- internal/apis/core/zz_generated.deepcopy.go | 14 ++++++- metalnetlet/controllers/network_controller.go | 23 ++++------- .../controllers/network_controller_test.go | 8 ++-- 15 files changed, 101 insertions(+), 77 deletions(-) diff --git a/api/core/v1alpha1/network_types.go b/api/core/v1alpha1/network_types.go index 7ce301c1..c525f4b3 100644 --- a/api/core/v1alpha1/network_types.go +++ b/api/core/v1alpha1/network_types.go @@ -36,7 +36,7 @@ type PeeringPrefix struct { type NetworkStatus struct { // Peerings contains the states of the network peerings for the network. - Peerings []NetworkPeeringStatus `json:"peerings,omitempty"` + Peerings map[string][]NetworkPeeringStatus `json:"peerings,omitempty"` } // NetworkState is the state of a network. diff --git a/api/core/v1alpha1/zz_generated.deepcopy.go b/api/core/v1alpha1/zz_generated.deepcopy.go index 322f2296..a8807fcb 100644 --- a/api/core/v1alpha1/zz_generated.deepcopy.go +++ b/api/core/v1alpha1/zz_generated.deepcopy.go @@ -1929,8 +1929,18 @@ 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) + *out = make(map[string][]NetworkPeeringStatus, len(*in)) + for key, val := range *in { + var outVal []NetworkPeeringStatus + if val == nil { + (*out)[key] = nil + } else { + in, out := &val, &outVal + *out = make([]NetworkPeeringStatus, len(*in)) + copy(*out, *in) + } + (*out)[key] = outVal + } } return } diff --git a/apinetlet/controllers/conversion.go b/apinetlet/controllers/conversion.go index 535a9848..b14c717b 100644 --- a/apinetlet/controllers/conversion.go +++ b/apinetlet/controllers/conversion.go @@ -80,27 +80,32 @@ func apiNetNetworkInterfaceStateToNetworkInterfaceState(state apinetv1alpha1.Net } } -func apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(peerings []apinetv1alpha1.NetworkPeeringStatus, specPeerings []apinetv1alpha1.NetworkPeering) []networkingv1alpha1.NetworkPeeringStatus { +func apiNetNetworkPeeringsStatusToNetworkPeeringsStatus(partitionPeeringsMap map[string][]apinetv1alpha1.NetworkPeeringStatus, specPeerings []apinetv1alpha1.NetworkPeering) []networkingv1alpha1.NetworkPeeringStatus { var networkPeeringsStatus []networkingv1alpha1.NetworkPeeringStatus - for _, peering := range peerings { - idx := slices.IndexFunc(specPeerings, func(specPeering apinetv1alpha1.NetworkPeering) bool { - return specPeering.ID == strconv.Itoa(int(peering.ID)) - }) - if idx != -1 { - var prefixStatus []networkingv1alpha1.PeeringPrefixStatus - if peering.State == apinetv1alpha1.NetworkPeeringStateReady { - for _, peeringPrefix := range specPeerings[idx].Prefixes { - prefixStatus = append(prefixStatus, networkingv1alpha1.PeeringPrefixStatus{ - Name: peeringPrefix.Name, - Prefix: (*commonv1alpha1.IPPrefix)(peeringPrefix.Prefix), - }) + for _, peerings := range partitionPeeringsMap { + if len(peerings) == 0 { + continue + } + for _, peering := range peerings { + idx := slices.IndexFunc(specPeerings, func(specPeering apinetv1alpha1.NetworkPeering) bool { + return specPeering.ID == strconv.Itoa(int(peering.ID)) + }) + if idx != -1 { + var prefixStatus []networkingv1alpha1.PeeringPrefixStatus + if peering.State == apinetv1alpha1.NetworkPeeringStateReady { + for _, peeringPrefix := range specPeerings[idx].Prefixes { + prefixStatus = append(prefixStatus, networkingv1alpha1.PeeringPrefixStatus{ + Name: peeringPrefix.Name, + Prefix: (*commonv1alpha1.IPPrefix)(peeringPrefix.Prefix), + }) + } } + networkPeeringsStatus = append(networkPeeringsStatus, networkingv1alpha1.NetworkPeeringStatus{ + Name: specPeerings[idx].Name, + State: networkingv1alpha1.NetworkPeeringState(peering.State), + Prefixes: prefixStatus, + }) } - networkPeeringsStatus = append(networkPeeringsStatus, networkingv1alpha1.NetworkPeeringStatus{ - Name: specPeerings[idx].Name, - State: networkingv1alpha1.NetworkPeeringState(peering.State), - Prefixes: prefixStatus, - }) } } return networkPeeringsStatus diff --git a/apinetlet/controllers/network_controller.go b/apinetlet/controllers/network_controller.go index aa5f810b..ad16afe9 100644 --- a/apinetlet/controllers/network_controller.go +++ b/apinetlet/controllers/network_controller.go @@ -248,10 +248,7 @@ func (r *NetworkReconciler) applyAPINetNetwork(ctx context.Context, log logr.Log }) } } - // apiNetNetwork.Spec.Peerings = peerings - log.V(1).Info("APINet network spec peerings", "old", apiNetNetwork.Spec.Peerings, "new", peerings) - log.V(1).Info("APINet network status", "old", apiNetNetwork.Status.Peerings) isPeeringsEqual := equality.Semantic.DeepEqual(apiNetNetwork.Spec.Peerings, peerings) if !isNetworkExist || !isPeeringsEqual { diff --git a/apinetlet/controllers/network_controller_test.go b/apinetlet/controllers/network_controller_test.go index 3b0cc086..6fc8d99f 100644 --- a/apinetlet/controllers/network_controller_test.go +++ b/apinetlet/controllers/network_controller_test.go @@ -201,7 +201,7 @@ var _ = Describe("NetworkController", func() { By("patching apinet network peering status") apiNetNetwork2ID, _ := strconv.Atoi(apiNetNetwork2.Spec.ID) Eventually(UpdateStatus(apiNetNetwork1, func() { - apiNetNetwork1.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{ + apiNetNetwork1.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork2ID), State: apinetv1alpha1.NetworkPeeringStateReady, }} @@ -209,7 +209,7 @@ var _ = Describe("NetworkController", func() { apiNetNetwork1ID, _ := strconv.Atoi(apiNetNetwork1.Spec.ID) Eventually(UpdateStatus(apiNetNetwork2, func() { - apiNetNetwork2.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{ + apiNetNetwork2.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork1ID), State: apinetv1alpha1.NetworkPeeringStateReady, }} @@ -377,7 +377,7 @@ var _ = Describe("NetworkController", func() { By("patching apinet network peering status") apiNetNetwork2ID, _ := strconv.Atoi(apiNetNetwork2.Spec.ID) Eventually(UpdateStatus(apiNetNetwork1, func() { - apiNetNetwork1.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{ + apiNetNetwork1.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork2ID), State: apinetv1alpha1.NetworkPeeringStateReady, }} @@ -385,7 +385,7 @@ var _ = Describe("NetworkController", func() { apiNetNetwork1ID, _ := strconv.Atoi(apiNetNetwork1.Spec.ID) Eventually(UpdateStatus(apiNetNetwork2, func() { - apiNetNetwork2.Status.Peerings = []apinetv1alpha1.NetworkPeeringStatus{{ + apiNetNetwork2.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork1ID), State: apinetv1alpha1.NetworkPeeringStateReady, }} diff --git a/client-go/applyconfigurations/core/v1alpha1/networkstatus.go b/client-go/applyconfigurations/core/v1alpha1/networkstatus.go index 02623207..8cb0c087 100644 --- a/client-go/applyconfigurations/core/v1alpha1/networkstatus.go +++ b/client-go/applyconfigurations/core/v1alpha1/networkstatus.go @@ -5,10 +5,14 @@ package v1alpha1 +import ( + v1alpha1 "github.com/ironcore-dev/ironcore-net/api/core/v1alpha1" +) + // NetworkStatusApplyConfiguration represents an declarative configuration of the NetworkStatus type for use // with apply. type NetworkStatusApplyConfiguration struct { - Peerings []NetworkPeeringStatusApplyConfiguration `json:"peerings,omitempty"` + Peerings map[string][]v1alpha1.NetworkPeeringStatus `json:"peerings,omitempty"` } // NetworkStatusApplyConfiguration constructs an declarative configuration of the NetworkStatus type for use with @@ -17,15 +21,16 @@ func NetworkStatus() *NetworkStatusApplyConfiguration { return &NetworkStatusApplyConfiguration{} } -// WithPeerings adds the given value to the Peerings field in the declarative configuration +// WithPeerings puts the entries into 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]) +// If called multiple times, the entries provided by each call will be put on the Peerings field, +// overwriting an existing map entries in Peerings field with the same key. +func (b *NetworkStatusApplyConfiguration) WithPeerings(entries map[string][]v1alpha1.NetworkPeeringStatus) *NetworkStatusApplyConfiguration { + if b.Peerings == nil && len(entries) > 0 { + b.Peerings = make(map[string][]v1alpha1.NetworkPeeringStatus, len(entries)) + } + for k, v := range entries { + b.Peerings[k] = v } return b } diff --git a/client-go/applyconfigurations/internal/internal.go b/client-go/applyconfigurations/internal/internal.go index f45ede9e..c56e4dee 100644 --- a/client-go/applyconfigurations/internal/internal.go +++ b/client-go/applyconfigurations/internal/internal.go @@ -972,10 +972,12 @@ var schemaYAML = typed.YAMLObject(`types: fields: - name: peerings type: - list: + map: elementType: - namedType: com.github.ironcore-dev.ironcore-net.api.core.v1alpha1.NetworkPeeringStatus - elementRelationship: atomic + 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/openapi/api_violations.report b/client-go/openapi/api_violations.report index b7c1e0db..2be1b68a 100644 --- a/client-go/openapi/api_violations.report +++ b/client-go/openapi/api_violations.report @@ -29,7 +29,6 @@ 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,NetworkPolicySpec,Ingress API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkPolicySpec,PolicyTypes API rule violation: list_type_missing,github.com/ironcore-dev/ironcore-net/api/core/v1alpha1,NetworkSpec,Peerings -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 4d24c205..24841bdd 100644 --- a/client-go/openapi/zz_generated.openapi.go +++ b/client-go/openapi/zz_generated.openapi.go @@ -3430,12 +3430,20 @@ func schema_ironcore_net_api_core_v1alpha1_NetworkStatus(ref common.ReferenceCal "peerings": { SchemaProps: spec.SchemaProps{ Description: "Peerings contains the states of the network peerings for the network.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/ironcore-dev/ironcore-net/api/core/v1alpha1.NetworkPeeringStatus"), + 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"), + }, + }, + }, }, }, }, diff --git a/docs/api-reference/core.md b/docs/api-reference/core.md index c9a7bc9a..47de3fda 100644 --- a/docs/api-reference/core.md +++ b/docs/api-reference/core.md @@ -1556,7 +1556,7 @@ LocalUIDReference -

NetworkRef is the network the load balancer is assigned to.

+

NetworkRef is the network to which network policy is applied.

@@ -3800,9 +3800,6 @@ to the peered network, if no prefixes are specified no filtering will be done.

NetworkPeeringStatus

-

-(Appears on:NetworkStatus) -

NetworkPeeringStatus is the status of a network peering.

@@ -4201,8 +4198,8 @@ string peerings
- -[]NetworkPeeringStatus + +map[string][]ironcore-net/api/core/v1alpha1.NetworkPeeringStatus @@ -4570,7 +4567,7 @@ string (Appears on:NetworkPeering)

-

PeeringPrefixes defines prefixes to be exposed to the peered network

+

PeeringPrefix defines prefixes to be exposed to the peered network

diff --git a/internal/apis/core/network_types.go b/internal/apis/core/network_types.go index 23b435d2..cdbebac8 100644 --- a/internal/apis/core/network_types.go +++ b/internal/apis/core/network_types.go @@ -35,7 +35,7 @@ type PeeringPrefix struct { } type NetworkStatus struct { // Peerings contains the states of the network peerings for the network. - Peerings []NetworkPeeringStatus + Peerings map[string][]NetworkPeeringStatus } // NetworkState is the state of a network. diff --git a/internal/apis/core/v1alpha1/zz_generated.conversion.go b/internal/apis/core/v1alpha1/zz_generated.conversion.go index ff3025ca..2720988c 100644 --- a/internal/apis/core/v1alpha1/zz_generated.conversion.go +++ b/internal/apis/core/v1alpha1/zz_generated.conversion.go @@ -2694,7 +2694,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)) + out.Peerings = *(*map[string][]core.NetworkPeeringStatus)(unsafe.Pointer(&in.Peerings)) return nil } @@ -2704,7 +2704,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)) + out.Peerings = *(*map[string][]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 2447be90..82b96241 100644 --- a/internal/apis/core/zz_generated.deepcopy.go +++ b/internal/apis/core/zz_generated.deepcopy.go @@ -1929,8 +1929,18 @@ 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) + *out = make(map[string][]NetworkPeeringStatus, len(*in)) + for key, val := range *in { + var outVal []NetworkPeeringStatus + if val == nil { + (*out)[key] = nil + } else { + in, out := &val, &outVal + *out = make([]NetworkPeeringStatus, len(*in)) + copy(*out, *in) + } + (*out)[key] = outVal + } } return } diff --git a/metalnetlet/controllers/network_controller.go b/metalnetlet/controllers/network_controller.go index 17fbeb78..062ca124 100644 --- a/metalnetlet/controllers/network_controller.go +++ b/metalnetlet/controllers/network_controller.go @@ -114,12 +114,14 @@ func (r *NetworkReconciler) delete(ctx context.Context, log logr.Logger, network } func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, log logr.Logger, network *apinetv1alpha1.Network, metalnetNetwork *metalnetv1alpha1.Network) error { - newStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings) - log.V(1).Info("apinet status", "old", network.Status.Peerings, "new", newStatusPeerings) - if !equality.Semantic.DeepEqual(network.Status.Peerings, newStatusPeerings) { - log.V(1).Info("Patching apinet network status", "status", newStatusPeerings) + apinetStatusPeerings := metalnetNetworkPeeringsStatusToNetworkPeeringsStatus(metalnetNetwork.Status.Peerings) + if !equality.Semantic.DeepEqual(network.Status.Peerings[r.PartitionName], apinetStatusPeerings) { + log.V(1).Info("Patching apinet network status", "status", apinetStatusPeerings) networkBase := network.DeepCopy() - network.Status.Peerings = newStatusPeerings + if network.Status.Peerings == nil { + network.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus, 0) + } + network.Status.Peerings[r.PartitionName] = apinetStatusPeerings if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil { return fmt.Errorf("unable to patch network: %w", err) } @@ -219,7 +221,6 @@ func (r *NetworkReconciler) reconcile(ctx context.Context, log logr.Logger, netw } log.V(1).Info("Updating apinet network status") - log.V(1).Info("network status", "apinet", network.Status, "metalnet", metalnetNetwork.Status) if err := r.updateApinetNetworkStatus(ctx, log, network, metalnetNetwork); err != nil { return ctrl.Result{}, fmt.Errorf("error updating apinet networkstatus: %w", err) } @@ -251,13 +252,3 @@ func (r *NetworkReconciler) SetupWithManager(mgr ctrl.Manager, metalnetCache cac ). Complete(r) } - -// func (r *NetworkReconciler) networkStatusChangedPredicate() predicate.Predicate { -// return predicate.Funcs{ -// UpdateFunc: func(evt event.UpdateEvent) bool { -// oldNetwork := evt.ObjectOld.(*apinetv1alpha1.Network) -// newNetwork := evt.ObjectNew.(*apinetv1alpha1.Network) -// return !slices.Equal(oldNetwork.Status.Peerings, newNetwork.Status.Peerings) -// }, -// } -// } diff --git a/metalnetlet/controllers/network_controller_test.go b/metalnetlet/controllers/network_controller_test.go index 0ad416b3..bbac3c9b 100644 --- a/metalnetlet/controllers/network_controller_test.go +++ b/metalnetlet/controllers/network_controller_test.go @@ -114,17 +114,17 @@ var _ = Describe("NetworkController", func() { By("ensuring apinet network status peerings are also updated") Eventually(Object(network1)).Should(SatisfyAll( - HaveField("Status.Peerings", []apinetv1alpha1.NetworkPeeringStatus{{ + HaveField("Status.Peerings", HaveKeyWithValue(partitionName, []apinetv1alpha1.NetworkPeeringStatus{{ ID: network2Vni, State: apinetv1alpha1.NetworkPeeringStateReady, - }}), + }})), )) Eventually(Object(network2)).Should(SatisfyAll( - HaveField("Status.Peerings", []apinetv1alpha1.NetworkPeeringStatus{{ + HaveField("Status.Peerings", HaveKeyWithValue(partitionName, []apinetv1alpha1.NetworkPeeringStatus{{ ID: network1Vni, State: apinetv1alpha1.NetworkPeeringStateReady, - }}), + }})), )) By("deleting the networks") From ee0a8ffc76746a8fc67a069dffe4ae7296801848 Mon Sep 17 00:00:00 2001 From: Kajol Asabe Date: Thu, 3 Oct 2024 10:33:59 +0530 Subject: [PATCH 5/5] fix apinet network testcases --- apinetlet/controllers/network_controller_test.go | 4 ++++ metalnetlet/controllers/network_controller.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apinetlet/controllers/network_controller_test.go b/apinetlet/controllers/network_controller_test.go index 6fc8d99f..90743b82 100644 --- a/apinetlet/controllers/network_controller_test.go +++ b/apinetlet/controllers/network_controller_test.go @@ -201,6 +201,7 @@ var _ = Describe("NetworkController", func() { By("patching apinet network peering status") apiNetNetwork2ID, _ := strconv.Atoi(apiNetNetwork2.Spec.ID) Eventually(UpdateStatus(apiNetNetwork1, func() { + apiNetNetwork1.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus) apiNetNetwork1.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork2ID), State: apinetv1alpha1.NetworkPeeringStateReady, @@ -209,6 +210,7 @@ var _ = Describe("NetworkController", func() { apiNetNetwork1ID, _ := strconv.Atoi(apiNetNetwork1.Spec.ID) Eventually(UpdateStatus(apiNetNetwork2, func() { + apiNetNetwork2.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus) apiNetNetwork2.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork1ID), State: apinetv1alpha1.NetworkPeeringStateReady, @@ -377,6 +379,7 @@ var _ = Describe("NetworkController", func() { By("patching apinet network peering status") apiNetNetwork2ID, _ := strconv.Atoi(apiNetNetwork2.Spec.ID) Eventually(UpdateStatus(apiNetNetwork1, func() { + apiNetNetwork1.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus) apiNetNetwork1.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork2ID), State: apinetv1alpha1.NetworkPeeringStateReady, @@ -385,6 +388,7 @@ var _ = Describe("NetworkController", func() { apiNetNetwork1ID, _ := strconv.Atoi(apiNetNetwork1.Spec.ID) Eventually(UpdateStatus(apiNetNetwork2, func() { + apiNetNetwork2.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus) apiNetNetwork2.Status.Peerings["partition1"] = []apinetv1alpha1.NetworkPeeringStatus{{ ID: int32(apiNetNetwork1ID), State: apinetv1alpha1.NetworkPeeringStateReady, diff --git a/metalnetlet/controllers/network_controller.go b/metalnetlet/controllers/network_controller.go index 062ca124..1c18241c 100644 --- a/metalnetlet/controllers/network_controller.go +++ b/metalnetlet/controllers/network_controller.go @@ -119,7 +119,7 @@ func (r *NetworkReconciler) updateApinetNetworkStatus(ctx context.Context, log l log.V(1).Info("Patching apinet network status", "status", apinetStatusPeerings) networkBase := network.DeepCopy() if network.Status.Peerings == nil { - network.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus, 0) + network.Status.Peerings = make(map[string][]apinetv1alpha1.NetworkPeeringStatus) } network.Status.Peerings[r.PartitionName] = apinetStatusPeerings if err := r.Status().Patch(ctx, network, client.MergeFrom(networkBase)); err != nil {