@@ -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" 
2628corev1 "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 , 
5253logger  logr.Logger ) * targetGroupBindingReconciler  {
5354
5455return  & 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
6163maxConcurrentReconciles : config .TargetGroupBindingMaxConcurrentReconciles ,
6264maxExponentialBackoffDelay : 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
7578maxConcurrentReconciles  int 
7679maxExponentialBackoffDelay  time.Duration 
@@ -110,10 +113,17 @@ func (r *targetGroupBindingReconciler) reconcileTargetGroupBinding(ctx context.C
110113return  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  {
114119return  err 
115120}
116121
122+ if  deferred  {
123+ r .deferredTargetGroupBindingReconciler .Enqueue (tgb )
124+ return  nil 
125+ }
126+ 
117127if  err  :=  r .updateTargetGroupBindingStatus (ctx , tgb ); err  !=  nil  {
118128r .eventRecorder .Event (tgb , corev1 .EventTypeWarning , k8s .TargetGroupBindingEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
119129return  err 
@@ -141,11 +151,14 @@ func (r *targetGroupBindingReconciler) updateTargetGroupBindingStatus(ctx contex
141151if  aws .ToInt64 (tgb .Status .ObservedGeneration ) ==  tgb .Generation  {
142152return  nil 
143153}
154+ 
144155tgbOld  :=  tgb .DeepCopy ()
156+ 
145157tgb .Status .ObservedGeneration  =  aws .Int64 (tgb .Generation )
146158if  err  :=  r .k8sClient .Status ().Patch (ctx , tgb , client .MergeFrom (tgbOld )); err  !=  nil  {
147159return  errors .Wrapf (err , "failed to update targetGroupBinding status: %v" , k8s .NamespacedName (tgb ))
148160}
161+ 
149162return  nil 
150163}
151164
@@ -159,34 +172,29 @@ func (r *targetGroupBindingReconciler) SetupWithManager(ctx context.Context, mgr
159172nodeEventsHandler  :=  eventhandlers .NewEnqueueRequestsForNodeEvent (r .k8sClient ,
160173r .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+ 
163178if  r .enableEndpointSlices  {
164- epSliceEventsHandler  :=  eventhandlers .NewEnqueueRequestsForEndpointSlicesEvent (r .k8sClient ,
179+ clientObj  =  & discv1.EndpointSlice {}
180+ eventHandler  =  eventhandlers .NewEnqueueRequestsForEndpointSlicesEvent (r .k8sClient ,
165181r .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 ,
178185r .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