Skip to content

Commit 6c4665c

Browse files
karkabbageyijie-04creydrCali0707
authored
Use filtered informer to watch OIDC service accounts (#3719)
* Changes in pkg/reconciler/trigger based on #7527 * codegen updated * fixing imported auth path * made fixes * bug fixes * fixed setup fake context lines * added label selector * linting * comitting changes to pass tests in /trigger_finalizer_test.go * Reconcile trigger on OIDC service account changes only, if SA references a trigger for correct broker class * Run goimport and gofmt * Namespaced broker: Reconcile trigger on OIDC service account changes only, if SA references a trigger for correct broker class * Remove unneeded comments * Remove one more of unneeded comments * Use correct BrokerClass for NamespacedBroker SA filter Co-authored-by: Calum Murray <[email protected]> --------- Co-authored-by: yijie-04 <[email protected]> Co-authored-by: Christoph Stäbler <[email protected]> Co-authored-by: Calum Murray <[email protected]>
1 parent 75fee8a commit 6c4665c

File tree

6 files changed

+262
-20
lines changed

6 files changed

+262
-20
lines changed

control-plane/pkg/reconciler/trigger/controller.go

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@ package trigger
1919
import (
2020
"context"
2121

22+
corev1 "k8s.io/api/core/v1"
23+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
2225
"go.uber.org/zap"
2326
"k8s.io/apimachinery/pkg/labels"
2427
"k8s.io/client-go/tools/cache"
28+
"knative.dev/eventing/pkg/auth"
2529
v1 "knative.dev/eventing/pkg/client/informers/externalversions/eventing/v1"
2630
kubeclient "knative.dev/pkg/client/injection/kube/client"
2731
configmapinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap"
@@ -44,7 +48,8 @@ import (
4448
triggerinformer "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/trigger"
4549
triggerreconciler "knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/trigger"
4650
eventinglisters "knative.dev/eventing/pkg/client/listers/eventing/v1"
47-
serviceaccountinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount"
51+
52+
serviceaccountinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/filtered"
4853

4954
"knative.dev/eventing-kafka-broker/control-plane/pkg/config"
5055
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka"
@@ -65,7 +70,7 @@ func NewController(ctx context.Context, watcher configmap.Watcher, configs *conf
6570
brokerInformer := brokerinformer.Get(ctx)
6671
triggerInformer := triggerinformer.Get(ctx)
6772
triggerLister := triggerInformer.Lister()
68-
serviceaccountInformer := serviceaccountinformer.Get(ctx)
73+
oidcServiceaccountInformer := serviceaccountinformer.Get(ctx, auth.OIDCLabelSelector)
6974

7075
clientPool := clientpool.Get(ctx)
7176

@@ -95,7 +100,7 @@ func NewController(ctx context.Context, watcher configmap.Watcher, configs *conf
95100
GetKafkaClient: clientPool.GetClient,
96101
GetKafkaClusterAdmin: clientPool.GetClusterAdmin,
97102
InitOffsetsFunc: offset.InitOffsets,
98-
ServiceAccountLister: serviceaccountInformer.Lister(),
103+
ServiceAccountLister: oidcServiceaccountInformer.Lister(),
99104
}
100105

101106
impl := triggerreconciler.NewImpl(ctx, reconciler, func(impl *controller.Impl) controller.Options {
@@ -153,8 +158,8 @@ func NewController(ctx context.Context, watcher configmap.Watcher, configs *conf
153158
secretinformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(reconciler.Tracker.OnChanged))
154159

155160
// Reconciler Trigger when the OIDC service account changes
156-
serviceaccountInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
157-
FilterFunc: controller.FilterController(&eventing.Trigger{}),
161+
oidcServiceaccountInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
162+
FilterFunc: filterOIDCServiceAccounts(triggerInformer.Lister(), brokerInformer.Lister(), kafka.BrokerClass, FinalizerName),
158163
Handler: controller.HandleAll(impl.EnqueueControllerOf),
159164
})
160165

@@ -182,6 +187,34 @@ func filterTriggers(lister eventinglisters.BrokerLister, brokerClass string, fin
182187
}
183188
}
184189

190+
// filterOIDCServiceAccounts returns a function that returns true if the resource passed
191+
// is a service account, which is owned by a trigger pointing to a the given broker class.
192+
func filterOIDCServiceAccounts(triggerLister eventinglisters.TriggerLister, brokerLister eventinglisters.BrokerLister, brokerClass string, finalizer string) func(interface{}) bool {
193+
return func(obj interface{}) bool {
194+
controlledByTrigger := controller.FilterController(&eventing.Trigger{})(obj)
195+
if !controlledByTrigger {
196+
return false
197+
}
198+
199+
sa, ok := obj.(*corev1.ServiceAccount)
200+
if !ok {
201+
return false
202+
}
203+
204+
owner := metav1.GetControllerOf(sa)
205+
if owner == nil {
206+
return false
207+
}
208+
209+
trigger, err := triggerLister.Triggers(sa.Namespace).Get(owner.Name)
210+
if err != nil {
211+
return false
212+
}
213+
214+
return filterTriggers(brokerLister, brokerClass, finalizer)(trigger)
215+
}
216+
}
217+
185218
func hasKafkaBrokerTriggerFinalizer(finalizers []string, finalizerName string) bool {
186219
for _, f := range finalizers {
187220
if f == finalizerName {

control-plane/pkg/reconciler/trigger/controller_test.go

Lines changed: 179 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,15 @@
1717
package trigger
1818

1919
import (
20+
"context"
2021
"testing"
2122

23+
triggerinformer "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/trigger"
24+
"knative.dev/pkg/ptr"
25+
26+
"knative.dev/eventing/pkg/auth"
27+
filteredFactory "knative.dev/pkg/client/injection/kube/informers/factory/filtered"
28+
2229
"github.com/stretchr/testify/assert"
2330
corev1 "k8s.io/api/core/v1"
2431
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -27,7 +34,8 @@ import (
2734
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap/fake"
2835
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/pod/fake"
2936
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/secret/fake"
30-
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/fake"
37+
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/filtered/fake"
38+
_ "knative.dev/pkg/client/injection/kube/informers/factory/filtered/fake"
3139
"knative.dev/pkg/configmap"
3240
reconcilertesting "knative.dev/pkg/reconciler/testing"
3341

@@ -42,8 +50,7 @@ import (
4250
)
4351

4452
func TestNewController(t *testing.T) {
45-
ctx, _ := reconcilertesting.SetupFakeContext(t)
46-
53+
ctx, _ := reconcilertesting.SetupFakeContext(t, SetUpInformerSelector)
4754
ctx = clientpool.WithKafkaClientPool(ctx)
4855

4956
controller := NewController(ctx, configmap.NewStaticWatcher(&corev1.ConfigMap{
@@ -60,8 +67,13 @@ func TestNewController(t *testing.T) {
6067
}
6168
}
6269

70+
func SetUpInformerSelector(ctx context.Context) context.Context {
71+
ctx = filteredFactory.WithSelectors(ctx, auth.OIDCLabelSelector)
72+
return ctx
73+
}
74+
6375
func TestFilterTriggers(t *testing.T) {
64-
ctx, _ := reconcilertesting.SetupFakeContext(t)
76+
ctx, _ := reconcilertesting.SetupFakeContext(t, SetUpInformerSelector)
6577

6678
tt := []struct {
6779
name string
@@ -184,3 +196,166 @@ func TestFilterTriggers(t *testing.T) {
184196
})
185197
}
186198
}
199+
200+
func TestFilterOIDCServiceAccounts(t *testing.T) {
201+
ctx, _ := reconcilertesting.SetupFakeContext(t, SetUpInformerSelector)
202+
203+
tt := []struct {
204+
name string
205+
sa *corev1.ServiceAccount
206+
trigger *eventing.Trigger
207+
brokers []*eventing.Broker
208+
pass bool
209+
}{{
210+
name: "matching owner reference",
211+
sa: &corev1.ServiceAccount{
212+
ObjectMeta: metav1.ObjectMeta{
213+
Namespace: "ns",
214+
Name: "sa",
215+
OwnerReferences: []metav1.OwnerReference{
216+
{
217+
APIVersion: eventing.SchemeGroupVersion.String(),
218+
Kind: "Trigger",
219+
Name: "tr",
220+
Controller: ptr.Bool(true),
221+
},
222+
},
223+
},
224+
},
225+
trigger: &eventing.Trigger{
226+
ObjectMeta: metav1.ObjectMeta{
227+
Namespace: "ns",
228+
Name: "tr",
229+
Finalizers: []string{FinalizerName},
230+
},
231+
Spec: eventing.TriggerSpec{
232+
Broker: "br",
233+
},
234+
},
235+
brokers: []*eventing.Broker{{
236+
ObjectMeta: metav1.ObjectMeta{
237+
Namespace: "ns",
238+
Name: "br",
239+
Annotations: map[string]string{
240+
eventing.BrokerClassAnnotationKey: kafka.BrokerClass,
241+
},
242+
},
243+
}},
244+
pass: true,
245+
}, {
246+
name: "references trigger for wrong broker class",
247+
sa: &corev1.ServiceAccount{
248+
ObjectMeta: metav1.ObjectMeta{
249+
Namespace: "ns",
250+
Name: "sa",
251+
OwnerReferences: []metav1.OwnerReference{
252+
{
253+
APIVersion: eventing.SchemeGroupVersion.String(),
254+
Kind: "Trigger",
255+
Name: "tr",
256+
Controller: ptr.Bool(true),
257+
},
258+
},
259+
},
260+
},
261+
trigger: &eventing.Trigger{
262+
ObjectMeta: metav1.ObjectMeta{
263+
Namespace: "ns",
264+
Name: "tr",
265+
},
266+
Spec: eventing.TriggerSpec{
267+
Broker: "br",
268+
},
269+
},
270+
brokers: []*eventing.Broker{{
271+
ObjectMeta: metav1.ObjectMeta{
272+
Namespace: "ns",
273+
Name: "br",
274+
Annotations: map[string]string{
275+
eventing.BrokerClassAnnotationKey: "another-broker-class",
276+
},
277+
},
278+
}},
279+
pass: false,
280+
}, {
281+
name: "references trigger with correct finalizer",
282+
sa: &corev1.ServiceAccount{
283+
ObjectMeta: metav1.ObjectMeta{
284+
Namespace: "ns",
285+
Name: "sa",
286+
OwnerReferences: []metav1.OwnerReference{
287+
{
288+
APIVersion: eventing.SchemeGroupVersion.String(),
289+
Kind: "Trigger",
290+
Name: "tr",
291+
Controller: ptr.Bool(true),
292+
},
293+
},
294+
},
295+
},
296+
trigger: &eventing.Trigger{
297+
ObjectMeta: metav1.ObjectMeta{
298+
Namespace: "ns",
299+
Name: "tr",
300+
Finalizers: []string{FinalizerName},
301+
},
302+
Spec: eventing.TriggerSpec{
303+
Broker: "br",
304+
},
305+
},
306+
brokers: []*eventing.Broker{{
307+
ObjectMeta: metav1.ObjectMeta{
308+
Namespace: "ns",
309+
Name: "br",
310+
},
311+
}},
312+
pass: true,
313+
}, {
314+
name: "no owner reference",
315+
sa: &corev1.ServiceAccount{
316+
ObjectMeta: metav1.ObjectMeta{
317+
Namespace: "ns",
318+
Name: "sa",
319+
},
320+
},
321+
trigger: &eventing.Trigger{
322+
ObjectMeta: metav1.ObjectMeta{
323+
Namespace: "ns",
324+
Name: "tr",
325+
Finalizers: []string{FinalizerName},
326+
},
327+
Spec: eventing.TriggerSpec{
328+
Broker: "br",
329+
},
330+
},
331+
brokers: []*eventing.Broker{{
332+
ObjectMeta: metav1.ObjectMeta{
333+
Namespace: "ns",
334+
Name: "br",
335+
Annotations: map[string]string{
336+
eventing.BrokerClassAnnotationKey: kafka.BrokerClass,
337+
},
338+
},
339+
}},
340+
pass: false,
341+
}}
342+
343+
for _, tc := range tt {
344+
tc := tc
345+
t.Run(tc.name, func(t *testing.T) {
346+
brokerInformer := brokerinformer.Get(ctx)
347+
for _, obj := range tc.brokers {
348+
err := brokerInformer.Informer().GetStore().Add(obj)
349+
assert.NoError(t, err)
350+
}
351+
352+
triggerInformer := triggerinformer.Get(ctx)
353+
err := triggerInformer.Informer().GetStore().Add(tc.trigger)
354+
assert.NoError(t, err)
355+
356+
filter := filterOIDCServiceAccounts(triggerInformer.Lister(), brokerInformer.Lister(), kafka.BrokerClass, FinalizerName)
357+
pass := filter(tc.sa)
358+
assert.Equal(t, tc.pass, pass)
359+
})
360+
}
361+
}

control-plane/pkg/reconciler/trigger/namespaced_controller.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,19 @@ import (
2424
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka/offset"
2525

2626
"k8s.io/client-go/tools/cache"
27+
"knative.dev/eventing/pkg/auth"
2728
kubeclient "knative.dev/pkg/client/injection/kube/client"
2829
configmapinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap"
2930
podinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/pod"
3031
secretinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/secret"
31-
serviceaccountinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount"
32+
33+
serviceaccountinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/filtered"
34+
3235
"knative.dev/pkg/configmap"
3336
"knative.dev/pkg/controller"
3437
"knative.dev/pkg/logging"
3538
"knative.dev/pkg/resolver"
3639

37-
eventing "knative.dev/eventing/pkg/apis/eventing/v1"
3840
"knative.dev/eventing/pkg/apis/feature"
3941
eventingclient "knative.dev/eventing/pkg/client/injection/client"
4042
brokerinformer "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/broker"
@@ -60,7 +62,7 @@ func NewNamespacedController(ctx context.Context, watcher configmap.Watcher, con
6062
brokerInformer := brokerinformer.Get(ctx)
6163
triggerInformer := triggerinformer.Get(ctx)
6264
triggerLister := triggerInformer.Lister()
63-
serviceaccountInformer := serviceaccountinformer.Get(ctx)
65+
oidcServiceaccountInformer := serviceaccountinformer.Get(ctx, auth.OIDCLabelSelector)
6466

6567
clientPool := clientpool.Get(ctx)
6668

@@ -82,7 +84,7 @@ func NewNamespacedController(ctx context.Context, watcher configmap.Watcher, con
8284
},
8385
BrokerLister: brokerInformer.Lister(),
8486
ConfigMapLister: configmapInformer.Lister(),
85-
ServiceAccountLister: serviceaccountInformer.Lister(),
87+
ServiceAccountLister: oidcServiceaccountInformer.Lister(),
8688
EventingClient: eventingclient.Get(ctx),
8789
Env: configs,
8890
GetKafkaClient: clientPool.GetClient,
@@ -150,8 +152,8 @@ func NewNamespacedController(ctx context.Context, watcher configmap.Watcher, con
150152
secretinformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(reconciler.Tracker.OnChanged))
151153

152154
// Reconciler Trigger when the OIDC service account changes
153-
serviceaccountInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
154-
FilterFunc: controller.FilterController(&eventing.Trigger{}),
155+
oidcServiceaccountInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
156+
FilterFunc: filterOIDCServiceAccounts(triggerInformer.Lister(), brokerInformer.Lister(), kafka.NamespacedBrokerClass, FinalizerName),
155157
Handler: controller.HandleAll(impl.EnqueueControllerOf),
156158
})
157159

control-plane/pkg/reconciler/trigger/namespaced_controller_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ import (
2929
"knative.dev/pkg/configmap"
3030
reconcilertesting "knative.dev/pkg/reconciler/testing"
3131

32+
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/filtered/fake"
33+
_ "knative.dev/pkg/client/injection/kube/informers/factory/filtered/fake"
34+
3235
_ "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/broker/fake"
3336
_ "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/trigger/fake"
3437

@@ -37,7 +40,7 @@ import (
3740
)
3841

3942
func TestNewNamespacedController(t *testing.T) {
40-
ctx, _ := reconcilertesting.SetupFakeContext(t)
43+
ctx, _ := reconcilertesting.SetupFakeContext(t, SetUpInformerSelector)
4144

4245
ctx = clientpool.WithKafkaClientPool(ctx)
4346

0 commit comments

Comments
 (0)