@@ -7,8 +7,11 @@ import (
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"
14
+ elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
12
15
"sigs.k8s.io/aws-load-balancer-controller/controllers/ingress/eventhandlers"
13
16
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
14
17
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws"
@@ -30,6 +33,10 @@ import (
30
33
const (
31
34
ingressTagPrefix = "ingress.k8s.aws"
32
35
controllerName = "ingress"
36
+
37
+ // the groupVersion of used Ingress & IngressClass resource.
38
+ ingressResourcesGroupVersion = "networking.k8s.io/v1beta1"
39
+ ingressClassKind = "IngressClass"
33
40
)
34
41
35
42
// NewGroupReconciler constructs new GroupReconciler
@@ -197,24 +204,30 @@ func (r *groupReconciler) updateIngressStatus(ctx context.Context, lbDNS string,
197
204
return nil
198
205
}
199
206
200
- 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 {
201
208
c , err := controller .New (controllerName , mgr , controller.Options {
202
209
MaxConcurrentReconciles : r .maxConcurrentReconciles ,
203
210
Reconciler : r ,
204
211
})
205
212
if err != nil {
206
213
return err
207
214
}
208
- if err := r .setupIndexes (ctx , mgr .GetFieldIndexer ()); err != nil {
215
+
216
+ resList , err := clientSet .ServerResourcesForGroupVersion (ingressResourcesGroupVersion )
217
+ if err != nil {
209
218
return err
210
219
}
211
- if err := r .setupWatches (ctx , c ); err != nil {
220
+ ingressClassResourceAvailable := isResourceKindAvailable (resList , ingressClassKind )
221
+ if err := r .setupIndexes (ctx , mgr .GetFieldIndexer (), ingressClassResourceAvailable ); err != nil {
222
+ return err
223
+ }
224
+ if err := r .setupWatches (ctx , c , ingressClassResourceAvailable ); err != nil {
212
225
return err
213
226
}
214
227
return nil
215
228
}
216
229
217
- func (r * groupReconciler ) setupIndexes (ctx context.Context , fieldIndexer client.FieldIndexer ) error {
230
+ func (r * groupReconciler ) setupIndexes (ctx context.Context , fieldIndexer client.FieldIndexer , ingressClassResourceAvailable bool ) error {
218
231
if err := fieldIndexer .IndexField (ctx , & networking.Ingress {}, ingress .IndexKeyServiceRefName ,
219
232
func (obj k8sruntime.Object ) []string {
220
233
return r .referenceIndexer .BuildServiceRefIndexes (context .Background (), obj .(* networking.Ingress ))
@@ -236,10 +249,26 @@ func (r *groupReconciler) setupIndexes(ctx context.Context, fieldIndexer client.
236
249
); err != nil {
237
250
return err
238
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
+ }
239
268
return nil
240
269
}
241
270
242
- func (r * groupReconciler ) setupWatches (_ context.Context , c controller.Controller ) error {
271
+ func (r * groupReconciler ) setupWatches (_ context.Context , c controller.Controller , ingressClassResourceAvailable bool ) error {
243
272
ingEventChan := make (chan event.GenericEvent )
244
273
svcEventChan := make (chan event.GenericEvent )
245
274
ingEventHandler := eventhandlers .NewEnqueueRequestsForIngressEvent (r .groupLoader , r .eventRecorder ,
@@ -248,7 +277,6 @@ func (r *groupReconciler) setupWatches(_ context.Context, c controller.Controlle
248
277
r .logger .WithName ("eventHandlers" ).WithName ("service" ))
249
278
secretEventHandler := eventhandlers .NewEnqueueRequestsForSecretEvent (ingEventChan , svcEventChan , r .k8sClient , r .eventRecorder ,
250
279
r .logger .WithName ("eventHandlers" ).WithName ("secret" ))
251
-
252
280
if err := c .Watch (& source.Channel {Source : ingEventChan }, ingEventHandler ); err != nil {
253
281
return err
254
282
}
@@ -264,5 +292,32 @@ func (r *groupReconciler) setupWatches(_ context.Context, c controller.Controlle
264
292
if err := c .Watch (& source.Kind {Type : & corev1.Secret {}}, secretEventHandler ); err != nil {
265
293
return err
266
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
+ }
267
312
return nil
268
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