Skip to content

Commit a7e7c27

Browse files
committed
k8s/ctrl: propagate event filter to resource cache
1 parent e2bdb0c commit a7e7c27

1 file changed

Lines changed: 26 additions & 14 deletions

File tree

pkg/k8s/ctrl/controller.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/davidmdm/x/xruntime"
1717
"github.com/davidmdm/x/xsync"
1818

19+
kerrors "k8s.io/apimachinery/pkg/api/errors"
1920
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2021
"k8s.io/apimachinery/pkg/labels"
2122
"k8s.io/apimachinery/pkg/runtime"
@@ -61,6 +62,7 @@ type HandleFunc func(context.Context, Event) (Result, error)
6162
type gkstate struct {
6263
handler HandleFunc
6364
lister kcache.GenericLister
65+
filter func(Event) bool
6466
shutdown func()
6567
}
6668

@@ -131,10 +133,8 @@ func (instance *Instance) register(entry Entry) error {
131133
Namespace: resource.GetNamespace(),
132134
GroupKind: entry.GroupKind,
133135
}
134-
if entry.Filter == nil || entry.Filter(event) {
135-
instance.events.Enqueue(event)
136-
op(event)
137-
}
136+
instance.events.Enqueue(event)
137+
op(event)
138138
}
139139
}
140140

@@ -149,10 +149,8 @@ func (instance *Instance) register(entry Entry) error {
149149
Namespace: next.GetNamespace(),
150150
GroupKind: entry.GroupKind,
151151
}
152-
if entry.Filter == nil || entry.Filter(event) {
153-
instance.events.Enqueue(event)
154-
resourceMap.Add(event)
155-
}
152+
instance.events.Enqueue(event)
153+
resourceMap.Add(event)
156154
}
157155

158156
eventHandlers := kcache.ResourceEventHandlerFuncs{
@@ -179,9 +177,7 @@ func (instance *Instance) register(entry Entry) error {
179177
GroupKind: entry.GroupKind,
180178
}
181179
if resourceMap.Has(evt) {
182-
if entry.Filter == nil || entry.Filter(evt) {
183-
instance.events.Enqueue(evt)
184-
}
180+
instance.events.Enqueue(evt)
185181
}
186182
}
187183

@@ -211,6 +207,7 @@ func (instance *Instance) register(entry Entry) error {
211207
}
212208
}),
213209
lister: lister,
210+
filter: entry.Filter,
214211
},
215212
)
216213

@@ -257,6 +254,10 @@ func (instance *Instance) Run(ctx context.Context) error {
257254
return
258255
}
259256

257+
if state.filter != nil && !state.filter(event) {
258+
return
259+
}
260+
260261
count, _ := active.LoadOrStore(event.String(), new(atomic.Uint32))
261262
if count := count.Add(1); count > 1 {
262263
return
@@ -404,15 +405,21 @@ func safe(handler HandleFunc) HandleFunc {
404405

405406
type ResourceCache[T any] struct {
406407
lister kcache.GenericNamespaceLister
408+
filter func(Event) bool
407409
}
408410

409411
func (r ResourceCache[T]) Get(name string) (*T, error) {
410412
obj, err := r.lister.Get(name)
411413
if err != nil {
412414
return nil, err
413415
}
416+
raw := obj.(*unstructured.Unstructured)
417+
if r.filter != nil && !r.filter(Event{Name: raw.GetName(), Namespace: raw.GetNamespace()}) {
418+
gvk := raw.GetObjectKind().GroupVersionKind()
419+
return nil, kerrors.NewNotFound(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, raw.GetName())
420+
}
414421
var result T
415-
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.(*unstructured.Unstructured).Object, &result); err != nil {
422+
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &result); err != nil {
416423
return nil, err
417424
}
418425
return &result, nil
@@ -424,9 +431,13 @@ func (r ResourceCache[T]) List(selector labels.Selector) ([]*T, error) {
424431
return nil, err
425432
}
426433
result := make([]*T, len(objects))
427-
for i, obj := range objects {
434+
for i, item := range objects {
435+
raw := item.(*unstructured.Unstructured)
436+
if r.filter != nil && !r.filter(Event{Name: raw.GetName(), Namespace: raw.GetNamespace()}) {
437+
continue
438+
}
428439
var value T
429-
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.(*unstructured.Unstructured).Object, &value); err != nil {
440+
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &value); err != nil {
430441
return nil, err
431442
}
432443
result[i] = &value
@@ -446,6 +457,7 @@ func Cache[T any, obj internalk8s.MetaObject[T]](ctx context.Context, gk schema.
446457
}
447458
return state.lister
448459
}(),
460+
filter: state.filter,
449461
}
450462
}
451463

0 commit comments

Comments
 (0)