@@ -7,8 +7,11 @@ import (
77"github.com/pkg/errors"
88corev1 "k8s.io/api/core/v1"
99networking "k8s.io/api/networking/v1beta1"
10+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011k8sruntime "k8s.io/apimachinery/pkg/runtime"
12+ "k8s.io/client-go/kubernetes"
1113"k8s.io/client-go/tools/record"
14+ elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
1215"sigs.k8s.io/aws-load-balancer-controller/controllers/ingress/eventhandlers"
1316"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
1417"sigs.k8s.io/aws-load-balancer-controller/pkg/aws"
@@ -30,6 +33,10 @@ import (
3033const (
3134ingressTagPrefix = "ingress.k8s.aws"
3235controllerName = "ingress"
36+
37+ // the groupVersion of used Ingress & IngressClass resource.
38+ ingressResourcesGroupVersion = "networking.k8s.io/v1beta1"
39+ ingressClassKind = "IngressClass"
3340)
3441
3542// NewGroupReconciler constructs new GroupReconciler
@@ -197,24 +204,30 @@ func (r *groupReconciler) updateIngressStatus(ctx context.Context, lbDNS string,
197204return nil
198205}
199206
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 {
201208c , err := controller .New (controllerName , mgr , controller.Options {
202209MaxConcurrentReconciles : r .maxConcurrentReconciles ,
203210Reconciler : r ,
204211})
205212if err != nil {
206213return err
207214}
208- if err := r .setupIndexes (ctx , mgr .GetFieldIndexer ()); err != nil {
215+
216+ resList , err := clientSet .ServerResourcesForGroupVersion (ingressResourcesGroupVersion )
217+ if err != nil {
209218return err
210219}
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 {
212225return err
213226}
214227return nil
215228}
216229
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 {
218231if err := fieldIndexer .IndexField (ctx , & networking.Ingress {}, ingress .IndexKeyServiceRefName ,
219232func (obj k8sruntime.Object ) []string {
220233return r .referenceIndexer .BuildServiceRefIndexes (context .Background (), obj .(* networking.Ingress ))
@@ -236,10 +249,26 @@ func (r *groupReconciler) setupIndexes(ctx context.Context, fieldIndexer client.
236249); err != nil {
237250return err
238251}
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+ }
239268return nil
240269}
241270
242- func (r * groupReconciler ) setupWatches (_ context.Context , c controller.Controller ) error {
271+ func (r * groupReconciler ) setupWatches (_ context.Context , c controller.Controller , ingressClassResourceAvailable bool ) error {
243272ingEventChan := make (chan event.GenericEvent )
244273svcEventChan := make (chan event.GenericEvent )
245274ingEventHandler := eventhandlers .NewEnqueueRequestsForIngressEvent (r .groupLoader , r .eventRecorder ,
@@ -248,7 +277,6 @@ func (r *groupReconciler) setupWatches(_ context.Context, c controller.Controlle
248277r .logger .WithName ("eventHandlers" ).WithName ("service" ))
249278secretEventHandler := eventhandlers .NewEnqueueRequestsForSecretEvent (ingEventChan , svcEventChan , r .k8sClient , r .eventRecorder ,
250279r .logger .WithName ("eventHandlers" ).WithName ("secret" ))
251-
252280if err := c .Watch (& source.Channel {Source : ingEventChan }, ingEventHandler ); err != nil {
253281return err
254282}
@@ -264,5 +292,32 @@ func (r *groupReconciler) setupWatches(_ context.Context, c controller.Controlle
264292if err := c .Watch (& source.Kind {Type : & corev1.Secret {}}, secretEventHandler ); err != nil {
265293return err
266294}
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+ }
267312return nil
268313}
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