Skip to content

Commit

Permalink
Avoid reconciling policies multiple times
Browse files Browse the repository at this point in the history
`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 <[email protected]>
  • Loading branch information
zeeke committed Sep 1, 2023
1 parent b8c1305 commit df35d9f
Showing 1 changed file with 38 additions and 1 deletion.
39 changes: 38 additions & 1 deletion controllers/sriovnetworknodepolicy_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"os"
"sort"
"strings"
"time"

errs "github.com/pkg/errors"
appsv1 "k8s.io/api/apps/v1"
Expand All @@ -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"

Expand All @@ -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
Expand All @@ -69,8 +76,12 @@ type SriovNetworkNodePolicyReconciler struct {
// For more details, check Reconcile and its Result here:
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/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{}
Expand Down Expand Up @@ -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)
}

Expand Down

0 comments on commit df35d9f

Please sign in to comment.