Skip to content

Commit

Permalink
Merge pull request openshift#688 from SchSeba/add_predicate_for_nodes
Browse files Browse the repository at this point in the history
Support adding or removing node
  • Loading branch information
SchSeba committed May 1, 2024
2 parents dbc06b5 + 5be2adc commit 047114b
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 13 deletions.
27 changes: 14 additions & 13 deletions controllers/drain_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
16 changes: 16 additions & 0 deletions controllers/sriovnetworknodepolicy_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,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{
Expand All @@ -180,6 +194,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)
Expand Down Expand Up @@ -278,6 +293,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())
Expand Down

0 comments on commit 047114b

Please sign in to comment.