@@ -8,15 +8,17 @@ import (
8
8
9
9
pmetrics "github.com/awslabs/operatorpkg/metrics"
10
10
"github.com/awslabs/operatorpkg/object"
11
+ "github.com/awslabs/operatorpkg/singleton"
12
+ "github.com/samber/lo"
11
13
v1 "k8s.io/api/core/v1"
14
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12
15
"k8s.io/apimachinery/pkg/runtime/schema"
16
+ "k8s.io/apimachinery/pkg/watch"
17
+ "k8s.io/client-go/kubernetes"
13
18
"k8s.io/utils/clock"
14
19
controllerruntime "sigs.k8s.io/controller-runtime"
15
- "sigs.k8s.io/controller-runtime/pkg/builder"
16
20
"sigs.k8s.io/controller-runtime/pkg/client"
17
- "sigs.k8s.io/controller-runtime/pkg/controller"
18
21
"sigs.k8s.io/controller-runtime/pkg/manager"
19
- "sigs.k8s.io/controller-runtime/pkg/predicate"
20
22
"sigs.k8s.io/controller-runtime/pkg/reconcile"
21
23
)
22
24
@@ -25,31 +27,32 @@ type Controller[T client.Object] struct {
25
27
startTime time.Time
26
28
kubeClient client.Client
27
29
EventCount pmetrics.CounterMetric
30
+ eventWatch watch.Interface
28
31
}
29
32
30
- func NewController [T client.Object ](client client.Client , clock clock.Clock ) * Controller [T ] {
33
+ func NewController [T client.Object ](ctx context. Context , client client.Client , clock clock.Clock , kubernetesInterface kubernetes. Interface ) * Controller [T ] {
31
34
gvk := object .GVK (object .New [T ]())
32
35
return & Controller [T ]{
33
36
gvk : gvk ,
34
37
startTime : clock .Now (),
35
38
kubeClient : client ,
36
39
EventCount : eventTotalMetric (strings .ToLower (gvk .Kind )),
40
+ eventWatch : lo .Must (kubernetesInterface .CoreV1 ().Events ("" ).Watch (ctx , metav1.ListOptions {})),
37
41
}
38
42
}
39
43
40
- func (c * Controller [T ]) Register (_ context.Context , m manager.Manager ) error {
44
+ func (c * Controller [T ]) Register (ctx context.Context , m manager.Manager ) error {
41
45
return controllerruntime .NewControllerManagedBy (m ).
42
- For (& v1.Event {}, builder .WithPredicates (predicate .NewTypedPredicateFuncs (func (o client.Object ) bool {
43
- // Only reconcile on the object kind we care about
44
- event := o .(* v1.Event )
45
- return event .InvolvedObject .Kind == c .gvk .Kind && event .InvolvedObject .APIVersion == c .gvk .GroupVersion ().String ()
46
- }))).
47
- WithOptions (controller.Options {MaxConcurrentReconciles : 10 }).
48
46
Named (fmt .Sprintf ("operatorpkg.%s.events" , strings .ToLower (c .gvk .Kind ))).
49
- Complete (reconcile .AsReconciler (m .GetClient (), c ))
47
+ WatchesRawSource (singleton .ChannelSource [* v1.Event ](ctx , c .eventWatch .ResultChan ())).
48
+ Complete (reconcile .AsReconciler (c .kubeClient , c ))
50
49
}
51
50
52
51
func (c * Controller [T ]) Reconcile (ctx context.Context , event * v1.Event ) (reconcile.Result , error ) {
52
+ if event .InvolvedObject .Kind != c .gvk .Kind && event .InvolvedObject .APIVersion != c .gvk .GroupVersion ().String () {
53
+ return reconcile.Result {}, nil
54
+ }
55
+
53
56
// We check if the event was created in the lifetime of this controller
54
57
// since we don't duplicate metrics on controller restart or lease handover
55
58
if c .startTime .Before (event .LastTimestamp .Time ) {
0 commit comments