7
7
"github.com/pkg/errors"
8
8
corev1 "k8s.io/api/core/v1"
9
9
networking "k8s.io/api/networking/v1beta1"
10
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
11
k8sruntime "k8s.io/apimachinery/pkg/runtime"
12
+ "k8s.io/client-go/kubernetes"
11
13
"k8s.io/client-go/tools/record"
12
14
elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
13
15
"sigs.k8s.io/aws-load-balancer-controller/controllers/ingress/eventhandlers"
@@ -31,6 +33,10 @@ import (
31
33
const (
32
34
ingressTagPrefix = "ingress.k8s.aws"
33
35
controllerName = "ingress"
36
+
37
+ // the groupVersion of used Ingress & IngressClass resource.
38
+ ingressResourcesGroupVersion = "networking.k8s.io/v1beta1"
39
+ ingressClassKind = "IngressClass"
34
40
)
35
41
36
42
// NewGroupReconciler constructs new GroupReconciler
@@ -198,38 +204,30 @@ func (r *groupReconciler) updateIngressStatus(ctx context.Context, lbDNS string,
198
204
return nil
199
205
}
200
206
201
- func (r * groupReconciler ) SetupWithManager (ctx context.Context , mgr ctrl.Manager ) error {
207
+ func (r * groupReconciler ) SetupWithManager (ctx context.Context , mgr ctrl.Manager , clientSet * kubernetes. Clientset ) error {
202
208
c , err := controller .New (controllerName , mgr , controller.Options {
203
209
MaxConcurrentReconciles : r .maxConcurrentReconciles ,
204
210
Reconciler : r ,
205
211
})
206
212
if err != nil {
207
213
return err
208
214
}
209
- if err := r .setupIndexes (ctx , mgr .GetFieldIndexer ()); err != nil {
215
+
216
+ resList , err := clientSet .ServerResourcesForGroupVersion (ingressResourcesGroupVersion )
217
+ if err != nil {
218
+ return err
219
+ }
220
+ ingressClassResourceAvailable := isResourceKindAvailable (resList , ingressClassKind )
221
+ if err := r .setupIndexes (ctx , mgr .GetFieldIndexer (), ingressClassResourceAvailable ); err != nil {
210
222
return err
211
223
}
212
- if err := r .setupWatches (ctx , c ); err != nil {
224
+ if err := r .setupWatches (ctx , c , ingressClassResourceAvailable ); err != nil {
213
225
return err
214
226
}
215
227
return nil
216
228
}
217
229
218
- func (r * groupReconciler ) setupIndexes (ctx context.Context , fieldIndexer client.FieldIndexer ) error {
219
- if err := fieldIndexer .IndexField (ctx , & networking.IngressClass {}, ingress .IndexKeyIngressClassParamsRefName ,
220
- func (obj k8sruntime.Object ) []string {
221
- return r .referenceIndexer .BuildIngressClassParamsRefIndexes (ctx , obj .(* networking.IngressClass ))
222
- },
223
- ); err != nil {
224
- return err
225
- }
226
- if err := fieldIndexer .IndexField (ctx , & networking.Ingress {}, ingress .IndexKeyIngressClassRefName ,
227
- func (obj k8sruntime.Object ) []string {
228
- return r .referenceIndexer .BuildIngressClassRefIndexes (ctx , obj .(* networking.Ingress ))
229
- },
230
- ); err != nil {
231
- return err
232
- }
230
+ func (r * groupReconciler ) setupIndexes (ctx context.Context , fieldIndexer client.FieldIndexer , ingressClassResourceAvailable bool ) error {
233
231
if err := fieldIndexer .IndexField (ctx , & networking.Ingress {}, ingress .IndexKeyServiceRefName ,
234
232
func (obj k8sruntime.Object ) []string {
235
233
return r .referenceIndexer .BuildServiceRefIndexes (context .Background (), obj .(* networking.Ingress ))
@@ -251,38 +249,40 @@ func (r *groupReconciler) setupIndexes(ctx context.Context, fieldIndexer client.
251
249
); err != nil {
252
250
return err
253
251
}
252
+ if ingressClassResourceAvailable {
253
+ if err := fieldIndexer .IndexField (ctx , & networking.IngressClass {}, ingress .IndexKeyIngressClassParamsRefName ,
254
+ func (obj k8sruntime.Object ) []string {
255
+ return r .referenceIndexer .BuildIngressClassParamsRefIndexes (ctx , obj .(* networking.IngressClass ))
256
+ },
257
+ ); err != nil {
258
+ return err
259
+ }
260
+ if err := fieldIndexer .IndexField (ctx , & networking.Ingress {}, ingress .IndexKeyIngressClassRefName ,
261
+ func (obj k8sruntime.Object ) []string {
262
+ return r .referenceIndexer .BuildIngressClassRefIndexes (ctx , obj .(* networking.Ingress ))
263
+ },
264
+ ); err != nil {
265
+ return err
266
+ }
267
+ }
254
268
return nil
255
269
}
256
270
257
- func (r * groupReconciler ) setupWatches (_ context.Context , c controller.Controller ) error {
258
- ingClassEventChan := make (chan event.GenericEvent )
271
+ func (r * groupReconciler ) setupWatches (_ context.Context , c controller.Controller , ingressClassResourceAvailable bool ) error {
259
272
ingEventChan := make (chan event.GenericEvent )
260
273
svcEventChan := make (chan event.GenericEvent )
261
- ingClassParamsEventHandler := eventhandlers .NewEnqueueRequestsForIngressClassParamsEvent (ingClassEventChan , r .k8sClient , r .eventRecorder ,
262
- r .logger .WithName ("eventHandlers" ).WithName ("ingressClassParams" ))
263
- ingClassEventHandler := eventhandlers .NewEnqueueRequestsForIngressClassEvent (ingEventChan , r .k8sClient , r .eventRecorder ,
264
- r .logger .WithName ("eventHandlers" ).WithName ("ingressClass" ))
265
274
ingEventHandler := eventhandlers .NewEnqueueRequestsForIngressEvent (r .groupLoader , r .eventRecorder ,
266
275
r .logger .WithName ("eventHandlers" ).WithName ("ingress" ))
267
276
svcEventHandler := eventhandlers .NewEnqueueRequestsForServiceEvent (ingEventChan , r .k8sClient , r .eventRecorder ,
268
277
r .logger .WithName ("eventHandlers" ).WithName ("service" ))
269
278
secretEventHandler := eventhandlers .NewEnqueueRequestsForSecretEvent (ingEventChan , svcEventChan , r .k8sClient , r .eventRecorder ,
270
279
r .logger .WithName ("eventHandlers" ).WithName ("secret" ))
271
- if err := c .Watch (& source.Channel {Source : ingClassEventChan }, ingClassEventHandler ); err != nil {
272
- return err
273
- }
274
280
if err := c .Watch (& source.Channel {Source : ingEventChan }, ingEventHandler ); err != nil {
275
281
return err
276
282
}
277
283
if err := c .Watch (& source.Channel {Source : svcEventChan }, svcEventHandler ); err != nil {
278
284
return err
279
285
}
280
- if err := c .Watch (& source.Kind {Type : & elbv2api.IngressClassParams {}}, ingClassParamsEventHandler ); err != nil {
281
- return err
282
- }
283
- if err := c .Watch (& source.Kind {Type : & networking.IngressClass {}}, ingClassEventHandler ); err != nil {
284
- return err
285
- }
286
286
if err := c .Watch (& source.Kind {Type : & networking.Ingress {}}, ingEventHandler ); err != nil {
287
287
return err
288
288
}
@@ -292,5 +292,32 @@ func (r *groupReconciler) setupWatches(_ context.Context, c controller.Controlle
292
292
if err := c .Watch (& source.Kind {Type : & corev1.Secret {}}, secretEventHandler ); err != nil {
293
293
return err
294
294
}
295
+
296
+ if ingressClassResourceAvailable {
297
+ ingClassEventChan := make (chan event.GenericEvent )
298
+ ingClassParamsEventHandler := eventhandlers .NewEnqueueRequestsForIngressClassParamsEvent (ingClassEventChan , r .k8sClient , r .eventRecorder ,
299
+ r .logger .WithName ("eventHandlers" ).WithName ("ingressClassParams" ))
300
+ ingClassEventHandler := eventhandlers .NewEnqueueRequestsForIngressClassEvent (ingEventChan , r .k8sClient , r .eventRecorder ,
301
+ r .logger .WithName ("eventHandlers" ).WithName ("ingressClass" ))
302
+ if err := c .Watch (& source.Channel {Source : ingClassEventChan }, ingClassEventHandler ); err != nil {
303
+ return err
304
+ }
305
+ if err := c .Watch (& source.Kind {Type : & elbv2api.IngressClassParams {}}, ingClassParamsEventHandler ); err != nil {
306
+ return err
307
+ }
308
+ if err := c .Watch (& source.Kind {Type : & networking.IngressClass {}}, ingClassEventHandler ); err != nil {
309
+ return err
310
+ }
311
+ }
295
312
return nil
296
313
}
314
+
315
+ // isResourceKindAvailable checks whether specific kind is available.
316
+ func isResourceKindAvailable (resList * metav1.APIResourceList , kind string ) bool {
317
+ for _ , res := range resList .APIResources {
318
+ if res .Kind == kind {
319
+ return true
320
+ }
321
+ }
322
+ return false
323
+ }
0 commit comments