forked from kubernetes-sigs/aws-load-balancer-controller
/
ingress_class_events.go
85 lines (72 loc) · 2.95 KB
/
ingress_class_events.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package eventhandlers
import (
"context"
"github.com/go-logr/logr"
"github.com/pjtatlow/aws-load-balancer-controller/pkg/ingress"
"github.com/pjtatlow/aws-load-balancer-controller/pkg/k8s"
networking "k8s.io/api/networking/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/client-go/tools/record"
"k8s.io/client-go/util/workqueue"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/handler"
)
// NewEnqueueRequestsForIngressClassEvent constructs new enqueueRequestsForIngressClassEvent.
func NewEnqueueRequestsForIngressClassEvent(ingEventChan chan<- event.GenericEvent,
k8sClient client.Client, eventRecorder record.EventRecorder, logger logr.Logger) *enqueueRequestsForIngressClassEvent {
return &enqueueRequestsForIngressClassEvent{
ingEventChan: ingEventChan,
k8sClient: k8sClient,
eventRecorder: eventRecorder,
logger: logger,
}
}
var _ handler.EventHandler = (*enqueueRequestsForIngressClassEvent)(nil)
type enqueueRequestsForIngressClassEvent struct {
ingEventChan chan<- event.GenericEvent
k8sClient client.Client
eventRecorder record.EventRecorder
logger logr.Logger
}
func (h *enqueueRequestsForIngressClassEvent) Create(e event.CreateEvent, _ workqueue.RateLimitingInterface) {
ingClassNew := e.Object.(*networking.IngressClass)
h.enqueueImpactedIngresses(ingClassNew)
}
func (h *enqueueRequestsForIngressClassEvent) Update(e event.UpdateEvent, _ workqueue.RateLimitingInterface) {
ingClassOld := e.ObjectOld.(*networking.IngressClass)
ingClassNew := e.ObjectNew.(*networking.IngressClass)
// we only care below update event:
// 2. IngressClass spec updates
// 3. IngressClass deletions
if equality.Semantic.DeepEqual(ingClassOld.Spec, ingClassNew.Spec) &&
equality.Semantic.DeepEqual(ingClassOld.DeletionTimestamp.IsZero(), ingClassNew.DeletionTimestamp.IsZero()) {
return
}
h.enqueueImpactedIngresses(ingClassNew)
}
func (h *enqueueRequestsForIngressClassEvent) Delete(e event.DeleteEvent, _ workqueue.RateLimitingInterface) {
ingClassOld := e.Object.(*networking.IngressClass)
h.enqueueImpactedIngresses(ingClassOld)
}
func (h *enqueueRequestsForIngressClassEvent) Generic(e event.GenericEvent, _ workqueue.RateLimitingInterface) {
ingClass := e.Object.(*networking.IngressClass)
h.enqueueImpactedIngresses(ingClass)
}
func (h *enqueueRequestsForIngressClassEvent) enqueueImpactedIngresses(ingClass *networking.IngressClass) {
ingList := &networking.IngressList{}
if err := h.k8sClient.List(context.Background(), ingList,
client.MatchingFields{ingress.IndexKeyIngressClassRefName: ingClass.GetName()}); err != nil {
h.logger.Error(err, "failed to fetch ingresses")
return
}
for index := range ingList.Items {
ing := &ingList.Items[index]
h.logger.V(1).Info("enqueue ingress for ingressClass event",
"ingressClass", ingClass.GetName(),
"ingress", k8s.NamespacedName(ing))
h.ingEventChan <- event.GenericEvent{
Object: ing,
}
}
}