@@ -19,12 +19,13 @@ package controllers
1919import (
2020 "context"
2121 "fmt"
22+ discv1 "k8s.io/api/discovery/v1"
23+ "sigs.k8s.io/controller-runtime/pkg/handler"
2224 "time"
2325
2426 "github.com/aws/aws-sdk-go-v2/aws"
2527 "github.com/pkg/errors"
2628 corev1 "k8s.io/api/core/v1"
27- discv1 "k8s.io/api/discovery/v1"
2829 "k8s.io/client-go/tools/record"
2930 "k8s.io/client-go/util/workqueue"
3031 "sigs.k8s.io/aws-load-balancer-controller/controllers/elbv2/eventhandlers"
@@ -48,15 +49,16 @@ const (
4849
4950// NewTargetGroupBindingReconciler constructs new targetGroupBindingReconciler
5051func NewTargetGroupBindingReconciler (k8sClient client.Client , eventRecorder record.EventRecorder , finalizerManager k8s.FinalizerManager ,
51- tgbResourceManager targetgroupbinding.ResourceManager , config config.ControllerConfig ,
52+ tgbResourceManager targetgroupbinding.ResourceManager , config config.ControllerConfig , deferredTargetGroupBindingReconciler DeferredTargetGroupBindingReconciler ,
5253 logger logr.Logger ) * targetGroupBindingReconciler {
5354
5455 return & targetGroupBindingReconciler {
55- k8sClient : k8sClient ,
56- eventRecorder : eventRecorder ,
57- finalizerManager : finalizerManager ,
58- tgbResourceManager : tgbResourceManager ,
59- logger : logger ,
56+ k8sClient : k8sClient ,
57+ eventRecorder : eventRecorder ,
58+ finalizerManager : finalizerManager ,
59+ tgbResourceManager : tgbResourceManager ,
60+ deferredTargetGroupBindingReconciler : deferredTargetGroupBindingReconciler ,
61+ logger : logger ,
6062
6163 maxConcurrentReconciles : config .TargetGroupBindingMaxConcurrentReconciles ,
6264 maxExponentialBackoffDelay : config .TargetGroupBindingMaxExponentialBackoffDelay ,
@@ -66,11 +68,12 @@ func NewTargetGroupBindingReconciler(k8sClient client.Client, eventRecorder reco
6668
6769// targetGroupBindingReconciler reconciles a TargetGroupBinding object
6870type targetGroupBindingReconciler struct {
69- k8sClient client.Client
70- eventRecorder record.EventRecorder
71- finalizerManager k8s.FinalizerManager
72- tgbResourceManager targetgroupbinding.ResourceManager
73- logger logr.Logger
71+ k8sClient client.Client
72+ eventRecorder record.EventRecorder
73+ finalizerManager k8s.FinalizerManager
74+ tgbResourceManager targetgroupbinding.ResourceManager
75+ deferredTargetGroupBindingReconciler DeferredTargetGroupBindingReconciler
76+ logger logr.Logger
7477
7578 maxConcurrentReconciles int
7679 maxExponentialBackoffDelay time.Duration
@@ -110,10 +113,17 @@ func (r *targetGroupBindingReconciler) reconcileTargetGroupBinding(ctx context.C
110113 return err
111114 }
112115
113- if err := r .tgbResourceManager .Reconcile (ctx , tgb ); err != nil {
116+ deferred , err := r .tgbResourceManager .Reconcile (ctx , tgb )
117+
118+ if err != nil {
114119 return err
115120 }
116121
122+ if deferred {
123+ r .deferredTargetGroupBindingReconciler .Enqueue (tgb )
124+ return nil
125+ }
126+
117127 if err := r .updateTargetGroupBindingStatus (ctx , tgb ); err != nil {
118128 r .eventRecorder .Event (tgb , corev1 .EventTypeWarning , k8s .TargetGroupBindingEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
119129 return err
@@ -141,11 +151,14 @@ func (r *targetGroupBindingReconciler) updateTargetGroupBindingStatus(ctx contex
141151 if aws .ToInt64 (tgb .Status .ObservedGeneration ) == tgb .Generation {
142152 return nil
143153 }
154+
144155 tgbOld := tgb .DeepCopy ()
156+
145157 tgb .Status .ObservedGeneration = aws .Int64 (tgb .Generation )
146158 if err := r .k8sClient .Status ().Patch (ctx , tgb , client .MergeFrom (tgbOld )); err != nil {
147159 return errors .Wrapf (err , "failed to update targetGroupBinding status: %v" , k8s .NamespacedName (tgb ))
148160 }
161+
149162 return nil
150163}
151164
@@ -159,34 +172,29 @@ func (r *targetGroupBindingReconciler) SetupWithManager(ctx context.Context, mgr
159172 nodeEventsHandler := eventhandlers .NewEnqueueRequestsForNodeEvent (r .k8sClient ,
160173 r .logger .WithName ("eventHandlers" ).WithName ("node" ))
161174
162- // Use the config flag to decide whether to use and watch an Endpoints event handler or an EndpointSlices event handler
175+ var eventHandler handler.EventHandler
176+ var clientObj client.Object
177+
163178 if r .enableEndpointSlices {
164- epSliceEventsHandler := eventhandlers .NewEnqueueRequestsForEndpointSlicesEvent (r .k8sClient ,
179+ clientObj = & discv1.EndpointSlice {}
180+ eventHandler = eventhandlers .NewEnqueueRequestsForEndpointSlicesEvent (r .k8sClient ,
165181 r .logger .WithName ("eventHandlers" ).WithName ("endpointslices" ))
166- return ctrl .NewControllerManagedBy (mgr ).
167- For (& elbv2api.TargetGroupBinding {}).
168- Named (controllerName ).
169- Watches (& corev1.Service {}, svcEventHandler ).
170- Watches (& discv1.EndpointSlice {}, epSliceEventsHandler ).
171- Watches (& corev1.Node {}, nodeEventsHandler ).
172- WithOptions (controller.Options {
173- MaxConcurrentReconciles : r .maxConcurrentReconciles ,
174- RateLimiter : workqueue .NewItemExponentialFailureRateLimiter (5 * time .Millisecond , r .maxExponentialBackoffDelay )}).
175- Complete (r )
176182 } else {
177- epsEventsHandler := eventhandlers .NewEnqueueRequestsForEndpointsEvent (r .k8sClient ,
183+ clientObj = & corev1.Endpoints {}
184+ eventHandler = eventhandlers .NewEnqueueRequestsForEndpointsEvent (r .k8sClient ,
178185 r .logger .WithName ("eventHandlers" ).WithName ("endpoints" ))
179- return ctrl .NewControllerManagedBy (mgr ).
180- For (& elbv2api.TargetGroupBinding {}).
181- Named (controllerName ).
182- Watches (& corev1.Service {}, svcEventHandler ).
183- Watches (& corev1.Endpoints {}, epsEventsHandler ).
184- Watches (& corev1.Node {}, nodeEventsHandler ).
185- WithOptions (controller.Options {
186- MaxConcurrentReconciles : r .maxConcurrentReconciles ,
187- RateLimiter : workqueue .NewItemExponentialFailureRateLimiter (5 * time .Millisecond , r .maxExponentialBackoffDelay )}).
188- Complete (r )
189186 }
187+
188+ return ctrl .NewControllerManagedBy (mgr ).
189+ For (& elbv2api.TargetGroupBinding {}).
190+ Named (controllerName ).
191+ Watches (& corev1.Service {}, svcEventHandler ).
192+ Watches (clientObj , eventHandler ).
193+ Watches (& corev1.Node {}, nodeEventsHandler ).
194+ WithOptions (controller.Options {
195+ MaxConcurrentReconciles : r .maxConcurrentReconciles ,
196+ RateLimiter : workqueue .NewItemExponentialFailureRateLimiter (5 * time .Millisecond , r .maxExponentialBackoffDelay )}).
197+ Complete (r )
190198}
191199
192200func (r * targetGroupBindingReconciler ) setupIndexes (ctx context.Context , fieldIndexer client.FieldIndexer ) error {
0 commit comments