From 5be2adc57409d30a57dd49ee4f120346606ad177 Mon Sep 17 00:00:00 2001 From: Sebastian Sch Date: Thu, 25 Apr 2024 17:31:50 +0300 Subject: [PATCH] Support adding or removing node Add Watch in sriovNetworkNodePolicy for adding and removing nodes. With this change we will be able act faster when new nodes are added to the cluster and not waiting for the reconcile loop requeue Signed-off-by: Sebastian Sch --- controllers/drain_controller.go | 27 ++++++++++--------- .../sriovnetworknodepolicy_controller.go | 16 +++++++++++ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/controllers/drain_controller.go b/controllers/drain_controller.go index 2869e9a51..86da909d8 100644 --- a/controllers/drain_controller.go +++ b/controllers/drain_controller.go @@ -94,19 +94,27 @@ func (dr *DrainReconcile) Reconcile(ctx context.Context, req ctrl.Request) (ctrl // get node object node := &corev1.Node{} - err := dr.getObject(ctx, req, node) + found, err := dr.getObject(ctx, req, node) if err != nil { reqLogger.Error(err, "failed to get node object") return ctrl.Result{}, err } + if !found { + reqLogger.Info("node not found don't, requeue the request") + return ctrl.Result{}, nil + } // get sriovNodeNodeState object nodeNetworkState := &sriovnetworkv1.SriovNetworkNodeState{} - err = dr.getObject(ctx, req, nodeNetworkState) + found, err = dr.getObject(ctx, req, nodeNetworkState) if err != nil { reqLogger.Error(err, "failed to get sriovNetworkNodeState object") return ctrl.Result{}, err } + if !found { + reqLogger.Info("sriovNetworkNodeState not found, don't requeue the request") + return ctrl.Result{}, nil + } // create the drain state annotation if it doesn't exist in the sriovNetworkNodeState object nodeStateDrainAnnotationCurrent, err := dr.ensureAnnotationExists(ctx, nodeNetworkState, constants.NodeStateDrainAnnotationCurrent) @@ -241,22 +249,15 @@ func (dr *DrainReconcile) Reconcile(ctx context.Context, req ctrl.Request) (ctrl return reconcile.Result{}, fmt.Errorf("unexpected node drain annotation") } -func (dr *DrainReconcile) getObject(ctx context.Context, req ctrl.Request, object client.Object) error { - reqLogger := log.FromContext(ctx) - reqLogger.Info("getObject():") - +func (dr *DrainReconcile) getObject(ctx context.Context, req ctrl.Request, object client.Object) (bool, error) { err := dr.Get(ctx, req.NamespacedName, object) if err != nil { if errors.IsNotFound(err) { - reqLogger.Error(err, "object doesn't exist", "objectName", req.Name) - return nil + return false, nil } - - reqLogger.Error(err, "failed to get object from api re-queue the request", "objectName", req.Name) - return err + return false, err } - - return nil + return true, nil } func (dr *DrainReconcile) ensureAnnotationExists(ctx context.Context, object client.Object, key string) (string, error) { diff --git a/controllers/sriovnetworknodepolicy_controller.go b/controllers/sriovnetworknodepolicy_controller.go index c4c1fc42d..5f145d9e7 100644 --- a/controllers/sriovnetworknodepolicy_controller.go +++ b/controllers/sriovnetworknodepolicy_controller.go @@ -176,6 +176,20 @@ func (r *SriovNetworkNodePolicyReconciler) SetupWithManager(mgr ctrl.Manager) er }, } + // we want to act fast on new or deleted nodes + nodeEvenHandler := handler.Funcs{ + CreateFunc: func(ctx context.Context, e event.CreateEvent, q workqueue.RateLimitingInterface) { + log.Log.WithName("SriovNetworkNodePolicy"). + Info("Enqueuing sync for create event", "resource", e.Object.GetName()) + qHandler(q) + }, + DeleteFunc: func(ctx context.Context, e event.DeleteEvent, q workqueue.RateLimitingInterface) { + log.Log.WithName("SriovNetworkNodePolicy"). + Info("Enqueuing sync for delete event", "resource", e.Object.GetName()) + qHandler(q) + }, + } + // send initial sync event to trigger reconcile when controller is started var eventChan = make(chan event.GenericEvent, 1) eventChan <- event.GenericEvent{Object: &sriovnetworkv1.SriovNetworkNodePolicy{ @@ -184,6 +198,7 @@ func (r *SriovNetworkNodePolicyReconciler) SetupWithManager(mgr ctrl.Manager) er return ctrl.NewControllerManagedBy(mgr). For(&sriovnetworkv1.SriovNetworkNodePolicy{}). + Watches(&corev1.Node{}, nodeEvenHandler). Watches(&sriovnetworkv1.SriovNetworkNodePolicy{}, delayedEventHandler). WatchesRawSource(&source.Channel{Source: eventChan}, delayedEventHandler). Complete(r) @@ -282,6 +297,7 @@ func (r *SriovNetworkNodePolicyReconciler) syncAllSriovNetworkNodeStates(ctx con } } if !found { + logger.Info("Deleting SriovNetworkNodeState as node with that name doesn't exist", "nodeStateName", ns.Name) err := r.Delete(ctx, &ns, &client.DeleteOptions{}) if err != nil { logger.Error(err, "Fail to Delete", "SriovNetworkNodeState CR:", ns.GetName())