Skip to content

Commit b68d841

Browse files
M00nF1shTimothy-Dougherty
authored andcommitted
add service/secret eventHandler for ingress (kubernetes-sigs#1471)
1 parent 28dc625 commit b68d841

16 files changed

+1015
-205
lines changed

controllers/elbv2/eventhandlers/endpoints.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"sigs.k8s.io/controller-runtime/pkg/reconcile"
1616
)
1717

18+
// NewEnqueueRequestsForEndpointsEvent constructs new enqueueRequestsForEndpointsEvent.
1819
func NewEnqueueRequestsForEndpointsEvent(k8sClient client.Client, logger logr.Logger) handler.EventHandler {
1920
return &enqueueRequestsForEndpointsEvent{
2021
k8sClient: k8sClient,

controllers/elbv2/eventhandlers/node.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"sigs.k8s.io/controller-runtime/pkg/reconcile"
1818
)
1919

20+
// NewEnqueueRequestsForNodeEvent constructs new enqueueRequestsForNodeEvent.
2021
func NewEnqueueRequestsForNodeEvent(k8sClient client.Client, logger logr.Logger) handler.EventHandler {
2122
return &enqueueRequestsForNodeEvent{
2223
k8sClient: k8sClient,

controllers/elbv2/suite_test.go

Lines changed: 0 additions & 81 deletions
This file was deleted.

controllers/elbv2/targetgroupbinding_controller.go

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,21 @@ const (
3838
)
3939

4040
// NewTargetGroupBindingReconciler constructs new targetGroupBindingReconciler
41-
func NewTargetGroupBindingReconciler(k8sClient client.Client, k8sFieldIndexer client.FieldIndexer, finalizerManager k8s.FinalizerManager, tgbResourceManager targetgroupbinding.ResourceManager, log logr.Logger) *targetGroupBindingReconciler {
41+
func NewTargetGroupBindingReconciler(k8sClient client.Client, finalizerManager k8s.FinalizerManager, tgbResourceManager targetgroupbinding.ResourceManager, logger logr.Logger) *targetGroupBindingReconciler {
4242
return &targetGroupBindingReconciler{
4343
k8sClient: k8sClient,
44-
k8sFieldIndexer: k8sFieldIndexer,
4544
finalizerManager: finalizerManager,
4645
tgbResourceManager: tgbResourceManager,
47-
log: log,
46+
logger: logger,
4847
}
4948
}
5049

5150
// targetGroupBindingReconciler reconciles a TargetGroupBinding object
5251
type targetGroupBindingReconciler struct {
5352
k8sClient client.Client
54-
k8sFieldIndexer client.FieldIndexer
5553
finalizerManager k8s.FinalizerManager
5654
tgbResourceManager targetgroupbinding.ResourceManager
57-
log logr.Logger
55+
logger logr.Logger
5856
}
5957

6058
// +kubebuilder:rbac:groups=elbv2.k8s.aws,resources=targetgroupbindings,verbs=get;list;watch;update;patch;create;delete
@@ -68,25 +66,7 @@ type targetGroupBindingReconciler struct {
6866
// +kubebuilder:rbac:groups="",resources=events,verbs=get;list;watch;update;patch;create;delete
6967

7068
func (r *targetGroupBindingReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
71-
return runtime.HandleReconcileError(r.reconcile(req), r.log)
72-
}
73-
74-
func (r *targetGroupBindingReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
75-
r.k8sFieldIndexer.IndexField(ctx, &elbv2api.TargetGroupBinding{},
76-
targetgroupbinding.IndexKeyServiceRefName, targetgroupbinding.IndexFuncServiceRefName)
77-
r.k8sFieldIndexer.IndexField(ctx, &elbv2api.TargetGroupBinding{},
78-
targetgroupbinding.IndexKeyTargetType, targetgroupbinding.IndexFuncTargetType)
79-
80-
epEventsHandler := eventhandlers.NewEnqueueRequestsForEndpointsEvent(r.k8sClient,
81-
r.log.WithName("eventHandlers").WithName("endpoints"))
82-
nodeEventsHandler := eventhandlers.NewEnqueueRequestsForNodeEvent(r.k8sClient,
83-
r.log.WithName("eventHandlers").WithName("node"))
84-
return ctrl.NewControllerManagedBy(mgr).
85-
For(&elbv2api.TargetGroupBinding{}).
86-
Watches(&source.Kind{Type: &corev1.Endpoints{}}, epEventsHandler).
87-
Watches(&source.Kind{Type: &corev1.Node{}}, nodeEventsHandler).
88-
WithOptions(controller.Options{MaxConcurrentReconciles: 3}).
89-
Complete(r)
69+
return runtime.HandleReconcileError(r.reconcile(req), r.logger)
9070
}
9171

9272
func (r *targetGroupBindingReconciler) reconcile(req ctrl.Request) error {
@@ -123,3 +103,32 @@ func (r *targetGroupBindingReconciler) cleanupTargetGroupBinding(ctx context.Con
123103
}
124104
return nil
125105
}
106+
107+
func (r *targetGroupBindingReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
108+
if err := r.setupIndexes(ctx, mgr.GetFieldIndexer()); err != nil {
109+
return err
110+
}
111+
112+
epEventsHandler := eventhandlers.NewEnqueueRequestsForEndpointsEvent(r.k8sClient,
113+
r.logger.WithName("eventHandlers").WithName("endpoints"))
114+
nodeEventsHandler := eventhandlers.NewEnqueueRequestsForNodeEvent(r.k8sClient,
115+
r.logger.WithName("eventHandlers").WithName("node"))
116+
return ctrl.NewControllerManagedBy(mgr).
117+
For(&elbv2api.TargetGroupBinding{}).
118+
Watches(&source.Kind{Type: &corev1.Endpoints{}}, epEventsHandler).
119+
Watches(&source.Kind{Type: &corev1.Node{}}, nodeEventsHandler).
120+
WithOptions(controller.Options{MaxConcurrentReconciles: 3}).
121+
Complete(r)
122+
}
123+
124+
func (r *targetGroupBindingReconciler) setupIndexes(ctx context.Context, fieldIndexer client.FieldIndexer) error {
125+
if err := fieldIndexer.IndexField(ctx, &elbv2api.TargetGroupBinding{},
126+
targetgroupbinding.IndexKeyServiceRefName, targetgroupbinding.IndexFuncServiceRefName); err != nil {
127+
return err
128+
}
129+
if err := fieldIndexer.IndexField(ctx, &elbv2api.TargetGroupBinding{},
130+
targetgroupbinding.IndexKeyTargetType, targetgroupbinding.IndexFuncTargetType); err != nil {
131+
return err
132+
}
133+
return nil
134+
}

controllers/ingress/eventhandlers/ingress_events.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,30 @@ package eventhandlers
22

33
import (
44
"context"
5+
"github.com/go-logr/logr"
56
networking "k8s.io/api/networking/v1beta1"
67
"k8s.io/apimachinery/pkg/api/equality"
78
"k8s.io/client-go/tools/record"
89
"k8s.io/client-go/util/workqueue"
910
"sigs.k8s.io/aws-load-balancer-controller/pkg/ingress"
1011
"sigs.k8s.io/controller-runtime/pkg/event"
1112
"sigs.k8s.io/controller-runtime/pkg/handler"
12-
"sigs.k8s.io/controller-runtime/pkg/log"
1313
)
1414

15-
var logger = log.Log.WithName("eventhandlers").WithName("ingress")
16-
17-
func NewEnqueueRequestsForIngressEvent(groupLoader ingress.GroupLoader, eventRecorder record.EventRecorder) *enqueueRequestsForIngressEvent {
18-
return &enqueueRequestsForIngressEvent{groupLoader: groupLoader, eventRecorder: eventRecorder}
15+
func NewEnqueueRequestsForIngressEvent(groupLoader ingress.GroupLoader, eventRecorder record.EventRecorder, logger logr.Logger) *enqueueRequestsForIngressEvent {
16+
return &enqueueRequestsForIngressEvent{
17+
groupLoader: groupLoader,
18+
eventRecorder: eventRecorder,
19+
logger: logger,
20+
}
1921
}
2022

2123
var _ handler.EventHandler = (*enqueueRequestsForIngressEvent)(nil)
2224

2325
type enqueueRequestsForIngressEvent struct {
2426
groupLoader ingress.GroupLoader
2527
eventRecorder record.EventRecorder
28+
logger logr.Logger
2629
}
2730

2831
func (h *enqueueRequestsForIngressEvent) Create(e event.CreateEvent, queue workqueue.RateLimitingInterface) {
@@ -33,11 +36,14 @@ func (h *enqueueRequestsForIngressEvent) Update(e event.UpdateEvent, queue workq
3336
ingOld := e.ObjectOld.(*networking.Ingress)
3437
ingNew := e.ObjectNew.(*networking.Ingress)
3538

36-
// we only care three update event: 1. Ingress annotation updates 2. Ingress spec updates 3. Ingress deletion
39+
// we only care below update event:
40+
// 1. Ingress annotation updates
41+
// 2. Ingress spec updates
42+
// 3. Ingress deletion
3743
if equality.Semantic.DeepEqual(ingOld.Annotations, ingNew.Annotations) &&
3844
equality.Semantic.DeepEqual(ingOld.Spec, ingNew.Spec) &&
3945
equality.Semantic.DeepEqual(ingOld.DeletionTimestamp.IsZero(), ingNew.DeletionTimestamp.IsZero()) {
40-
logger.V(1).Info("ignoring unchanged Ingress Update event", "event", e)
46+
h.logger.V(1).Info("ignoring unchanged Ingress Update event", "event", e)
4147
return
4248
}
4349

@@ -52,6 +58,7 @@ func (h *enqueueRequestsForIngressEvent) Delete(e event.DeleteEvent, queue workq
5258
}
5359

5460
func (h *enqueueRequestsForIngressEvent) Generic(e event.GenericEvent, queue workqueue.RateLimitingInterface) {
61+
h.enqueueIfBelongsToGroup(queue, e.Object.(*networking.Ingress))
5562
}
5663

5764
func (h *enqueueRequestsForIngressEvent) enqueueIfBelongsToGroup(queue workqueue.RateLimitingInterface, ingList ...*networking.Ingress) {
@@ -64,7 +71,7 @@ func (h *enqueueRequestsForIngressEvent) enqueueIfBelongsToGroup(queue workqueue
6471
continue
6572
}
6673
if groupID == nil {
67-
logger.V(1).Info("ignoring Ingress", "Ingress", ing)
74+
h.logger.V(1).Info("ignoring Ingress", "Ingress", ing)
6875
continue
6976
}
7077
groupIDs[*groupID] = struct{}{}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package eventhandlers
2+
3+
import (
4+
"context"
5+
"github.com/go-logr/logr"
6+
corev1 "k8s.io/api/core/v1"
7+
networking "k8s.io/api/networking/v1beta1"
8+
"k8s.io/apimachinery/pkg/api/equality"
9+
"k8s.io/apimachinery/pkg/api/meta"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/client-go/tools/record"
12+
"k8s.io/client-go/util/workqueue"
13+
"sigs.k8s.io/aws-load-balancer-controller/pkg/ingress"
14+
"sigs.k8s.io/controller-runtime/pkg/client"
15+
"sigs.k8s.io/controller-runtime/pkg/event"
16+
"sigs.k8s.io/controller-runtime/pkg/handler"
17+
)
18+
19+
// NewEnqueueRequestsForSecretEvent constructs new enqueueRequestsForSecretEvent.
20+
func NewEnqueueRequestsForSecretEvent(ingEventChan chan<- event.GenericEvent, svcEventChan chan<- event.GenericEvent,
21+
k8sClient client.Client, eventRecorder record.EventRecorder, logger logr.Logger) *enqueueRequestsForSecretEvent {
22+
return &enqueueRequestsForSecretEvent{
23+
ingEventChan: ingEventChan,
24+
svcEventChan: svcEventChan,
25+
k8sClient: k8sClient,
26+
eventRecorder: eventRecorder,
27+
logger: logger,
28+
}
29+
}
30+
31+
var _ handler.EventHandler = (*enqueueRequestsForSecretEvent)(nil)
32+
33+
type enqueueRequestsForSecretEvent struct {
34+
ingEventChan chan<- event.GenericEvent
35+
svcEventChan chan<- event.GenericEvent
36+
k8sClient client.Client
37+
eventRecorder record.EventRecorder
38+
logger logr.Logger
39+
}
40+
41+
func (h *enqueueRequestsForSecretEvent) Create(e event.CreateEvent, _ workqueue.RateLimitingInterface) {
42+
h.enqueueImpactedObjects(e.Meta)
43+
}
44+
45+
func (h *enqueueRequestsForSecretEvent) Update(e event.UpdateEvent, _ workqueue.RateLimitingInterface) {
46+
secretOld := e.ObjectOld.(*corev1.Secret)
47+
secretNew := e.ObjectNew.(*corev1.Secret)
48+
49+
// we only care below update event:
50+
// 1. Secret data updates
51+
// 2. Secret deletions
52+
if equality.Semantic.DeepEqual(secretOld.Data, secretNew.Data) &&
53+
equality.Semantic.DeepEqual(secretOld.DeletionTimestamp.IsZero(), secretNew.DeletionTimestamp.IsZero()) {
54+
h.logger.V(1).Info("ignoring unchanged Secret Update event")
55+
return
56+
}
57+
58+
h.enqueueImpactedObjects(e.MetaNew)
59+
}
60+
61+
func (h *enqueueRequestsForSecretEvent) Delete(e event.DeleteEvent, _ workqueue.RateLimitingInterface) {
62+
h.enqueueImpactedObjects(e.Meta)
63+
}
64+
65+
func (h *enqueueRequestsForSecretEvent) Generic(e event.GenericEvent, _ workqueue.RateLimitingInterface) {
66+
// we don't have any generic event for secrets.
67+
}
68+
69+
func (h *enqueueRequestsForSecretEvent) enqueueImpactedObjects(secret metav1.Object) {
70+
ingList := &networking.IngressList{}
71+
if err := h.k8sClient.List(context.Background(), ingList,
72+
client.InNamespace(secret.GetNamespace()),
73+
client.MatchingFields{ingress.IndexKeySecretRefName: secret.GetName()}); err != nil {
74+
h.logger.Error(err, "failed to fetch ingresses")
75+
return
76+
}
77+
for index := range ingList.Items {
78+
ing := &ingList.Items[index]
79+
meta, _ := meta.Accessor(ing)
80+
h.ingEventChan <- event.GenericEvent{
81+
Meta: meta,
82+
Object: ing,
83+
}
84+
}
85+
86+
svcList := &corev1.ServiceList{}
87+
if err := h.k8sClient.List(context.Background(), svcList,
88+
client.InNamespace(secret.GetNamespace()),
89+
client.MatchingFields{ingress.IndexKeySecretRefName: secret.GetName()}); err != nil {
90+
h.logger.Error(err, "failed to fetch services")
91+
return
92+
}
93+
for index := range svcList.Items {
94+
svc := &svcList.Items[index]
95+
meta, _ := meta.Accessor(svc)
96+
h.svcEventChan <- event.GenericEvent{
97+
Meta: meta,
98+
Object: svc,
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)