From df35d9fd7be21b9b671f09b3ded0523644ee76ff Mon Sep 17 00:00:00 2001 From: Andrea Panattoni Date: Fri, 14 Jul 2023 15:49:47 +0200 Subject: [PATCH] Avoid reconciling policies multiple times `SriovNetworkNodePolicy` reconcile function lists all node policies and updates all SriovNetworkNodeState. Hence there is no need to resync all of them periodically. Avoid triggering multiple reconciliations when creating multiple policies in a row (that is what happens when using yaml files). Signed-off-by: Andrea Panattoni --- .../sriovnetworknodepolicy_controller.go | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/controllers/sriovnetworknodepolicy_controller.go b/controllers/sriovnetworknodepolicy_controller.go index d0e7f3bb2..00dc808ac 100644 --- a/controllers/sriovnetworknodepolicy_controller.go +++ b/controllers/sriovnetworknodepolicy_controller.go @@ -23,6 +23,7 @@ import ( "os" "sort" "strings" + "time" errs "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" @@ -35,11 +36,15 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/util/workqueue" ctrl "sigs.k8s.io/controller-runtime" "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/handler" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/controller-runtime/pkg/source" dptypes "github.com/k8snetworkplumbingwg/sriov-network-device-plugin/pkg/types" @@ -49,6 +54,8 @@ import ( render "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/render" ) +const nodePolicySyncEventName = "node-policy-sync-event" + // SriovNetworkNodePolicyReconciler reconciles a SriovNetworkNodePolicy object type SriovNetworkNodePolicyReconciler struct { client.Client @@ -69,8 +76,12 @@ type SriovNetworkNodePolicyReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.8.3/pkg/reconcile func (r *SriovNetworkNodePolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - reqLogger := log.FromContext(ctx).WithValues("sriovnetworknodepolicy", req.NamespacedName) + // Only handle node-policy-sync-event + if req.Name != nodePolicySyncEventName || req.Namespace != "" { + return reconcile.Result{}, nil + } + reqLogger := log.FromContext(ctx) reqLogger.Info("Reconciling") defaultPolicy := &sriovnetworkv1.SriovNetworkNodePolicy{} @@ -152,8 +163,34 @@ func (r *SriovNetworkNodePolicyReconciler) Reconcile(ctx context.Context, req ct // SetupWithManager sets up the controller with the Manager. func (r *SriovNetworkNodePolicyReconciler) SetupWithManager(mgr ctrl.Manager) error { + qHandler := func(q workqueue.RateLimitingInterface) { + q.AddAfter(reconcile.Request{NamespacedName: types.NamespacedName{ + Namespace: "", + Name: nodePolicySyncEventName, + }}, time.Second) + } + + delayedEventHandler := handler.Funcs{ + CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) { + log.Log.WithName("SriovNetworkNodePolicy"). + Info("Enqueuing sync for create event", "resource", e.Object.GetName()) + qHandler(q) + }, + UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) { + log.Log.WithName("SriovNetworkNodePolicy"). + Info("Enqueuing sync for update event", "resource", e.ObjectNew.GetName()) + qHandler(q) + }, + DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) { + log.Log.WithName("SriovNetworkNodePolicy"). + Info("Enqueuing sync for delete event", "resource", e.Object.GetName()) + qHandler(q) + }, + } + return ctrl.NewControllerManagedBy(mgr). For(&sriovnetworkv1.SriovNetworkNodePolicy{}). + Watches(&source.Kind{Type: &sriovnetworkv1.SriovNetworkNodePolicy{}}, delayedEventHandler). Complete(r) }