Skip to content

Commit a72e0b7

Browse files
committed
make ingressClass optional
1 parent f8688c2 commit a72e0b7

File tree

2 files changed

+62
-34
lines changed

2 files changed

+62
-34
lines changed

controllers/ingress/group_controller.go

Lines changed: 60 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"github.com/pkg/errors"
88
corev1 "k8s.io/api/core/v1"
99
networking "k8s.io/api/networking/v1beta1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
k8sruntime "k8s.io/apimachinery/pkg/runtime"
12+
"k8s.io/client-go/kubernetes"
1113
"k8s.io/client-go/tools/record"
1214
elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
1315
"sigs.k8s.io/aws-load-balancer-controller/controllers/ingress/eventhandlers"
@@ -31,6 +33,10 @@ import (
3133
const (
3234
ingressTagPrefix = "ingress.k8s.aws"
3335
controllerName = "ingress"
36+
37+
// the groupVersion of used Ingress & IngressClass resource.
38+
ingressResourcesGroupVersion = "networking.k8s.io/v1beta1"
39+
ingressClassKind = "IngressClass"
3440
)
3541

3642
// NewGroupReconciler constructs new GroupReconciler
@@ -198,38 +204,30 @@ func (r *groupReconciler) updateIngressStatus(ctx context.Context, lbDNS string,
198204
return nil
199205
}
200206

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 {
202208
c, err := controller.New(controllerName, mgr, controller.Options{
203209
MaxConcurrentReconciles: r.maxConcurrentReconciles,
204210
Reconciler: r,
205211
})
206212
if err != nil {
207213
return err
208214
}
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 {
210222
return err
211223
}
212-
if err := r.setupWatches(ctx, c); err != nil {
224+
if err := r.setupWatches(ctx, c, ingressClassResourceAvailable); err != nil {
213225
return err
214226
}
215227
return nil
216228
}
217229

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 {
233231
if err := fieldIndexer.IndexField(ctx, &networking.Ingress{}, ingress.IndexKeyServiceRefName,
234232
func(obj k8sruntime.Object) []string {
235233
return r.referenceIndexer.BuildServiceRefIndexes(context.Background(), obj.(*networking.Ingress))
@@ -251,38 +249,40 @@ func (r *groupReconciler) setupIndexes(ctx context.Context, fieldIndexer client.
251249
); err != nil {
252250
return err
253251
}
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+
}
254268
return nil
255269
}
256270

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 {
259272
ingEventChan := make(chan event.GenericEvent)
260273
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"))
265274
ingEventHandler := eventhandlers.NewEnqueueRequestsForIngressEvent(r.groupLoader, r.eventRecorder,
266275
r.logger.WithName("eventHandlers").WithName("ingress"))
267276
svcEventHandler := eventhandlers.NewEnqueueRequestsForServiceEvent(ingEventChan, r.k8sClient, r.eventRecorder,
268277
r.logger.WithName("eventHandlers").WithName("service"))
269278
secretEventHandler := eventhandlers.NewEnqueueRequestsForSecretEvent(ingEventChan, svcEventChan, r.k8sClient, r.eventRecorder,
270279
r.logger.WithName("eventHandlers").WithName("secret"))
271-
if err := c.Watch(&source.Channel{Source: ingClassEventChan}, ingClassEventHandler); err != nil {
272-
return err
273-
}
274280
if err := c.Watch(&source.Channel{Source: ingEventChan}, ingEventHandler); err != nil {
275281
return err
276282
}
277283
if err := c.Watch(&source.Channel{Source: svcEventChan}, svcEventHandler); err != nil {
278284
return err
279285
}
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-
}
286286
if err := c.Watch(&source.Kind{Type: &networking.Ingress{}}, ingEventHandler); err != nil {
287287
return err
288288
}
@@ -292,5 +292,32 @@ func (r *groupReconciler) setupWatches(_ context.Context, c controller.Controlle
292292
if err := c.Watch(&source.Kind{Type: &corev1.Secret{}}, secretEventHandler); err != nil {
293293
return err
294294
}
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+
}
295312
return nil
296313
}
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+
}

main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ func main() {
9797
setupLog.Error(err, "unable to obtain clientSet")
9898
os.Exit(1)
9999
}
100+
100101
podInfoRepo := k8s.NewDefaultPodInfoRepo(clientSet.CoreV1().RESTClient(), rtOpts.Namespace, ctrl.Log)
101102
finalizerManager := k8s.NewDefaultFinalizerManager(mgr.GetClient(), ctrl.Log)
102103
podENIResolver := networking.NewDefaultPodENIInfoResolver(cloud.EC2(), cloud.VpcID(), ctrl.Log)
@@ -118,7 +119,7 @@ func main() {
118119
finalizerManager, tgbResManager,
119120
controllerCFG, ctrl.Log.WithName("controllers").WithName("targetGroupBinding"))
120121
ctx := context.Background()
121-
if err = ingGroupReconciler.SetupWithManager(ctx, mgr); err != nil {
122+
if err = ingGroupReconciler.SetupWithManager(ctx, mgr, clientSet); err != nil {
122123
setupLog.Error(err, "unable to create controller", "controller", "Ingress")
123124
os.Exit(1)
124125
}

0 commit comments

Comments
 (0)