@@ -34,7 +34,9 @@ import (
3434 ctrl "sigs.k8s.io/controller-runtime"
3535 "sigs.k8s.io/controller-runtime/pkg/client"
3636 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
37+ "sigs.k8s.io/controller-runtime/pkg/event"
3738 "sigs.k8s.io/controller-runtime/pkg/log"
39+ "sigs.k8s.io/controller-runtime/pkg/predicate"
3840)
3941
4042// LeaseReconciler reconciles a Lease object
@@ -77,6 +79,10 @@ func (r *LeaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
7779 )
7880 }
7981
82+ if lease .Status .Ended && isLeaseEnded (& lease ) {
83+ return ctrl.Result {}, nil
84+ }
85+
8086 var result ctrl.Result
8187 if err := r .reconcileStatusExporterRef (ctx , & result , & lease ); err != nil {
8288 return result , err
@@ -585,9 +591,36 @@ func filterOutOfflineExporters(approvedExporters []ApprovedExporter) []ApprovedE
585591 return onlineExporters
586592}
587593
594+ // isLeaseEnded checks whether a lease object carries the ended label.
595+ func isLeaseEnded (obj client.Object ) bool {
596+ if v , ok := obj .GetLabels ()[string (jumpstarterdevv1alpha1 .LeaseLabelEnded )]; ok {
597+ return v == jumpstarterdevv1alpha1 .LeaseLabelEndedValue
598+ }
599+ return false
600+ }
601+
588602// SetupWithManager sets up the controller with the Manager.
589603func (r * LeaseReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
604+ // Skip ended leases: they are immutable and never need further reconciliation.
605+ // The Update funnel still admits the transition *into* ended so the label
606+ // and status update written by the reconciler itself is not swallowed.
607+ skipEnded := predicate.Funcs {
608+ CreateFunc : func (e event.CreateEvent ) bool {
609+ return ! isLeaseEnded (e .Object )
610+ },
611+ UpdateFunc : func (e event.UpdateEvent ) bool {
612+ return ! isLeaseEnded (e .ObjectNew )
613+ },
614+ DeleteFunc : func (e event.DeleteEvent ) bool {
615+ return true
616+ },
617+ GenericFunc : func (e event.GenericEvent ) bool {
618+ return ! isLeaseEnded (e .Object )
619+ },
620+ }
621+
590622 return ctrl .NewControllerManagedBy (mgr ).
591623 For (& jumpstarterdevv1alpha1.Lease {}).
624+ WithEventFilter (skipEnded ).
592625 Complete (r )
593626}
0 commit comments