From da4a4e2e1628975935e43cc0f8977ccbdd01016c Mon Sep 17 00:00:00 2001 From: Eric Lin Date: Sun, 4 Jun 2023 12:26:58 +0000 Subject: [PATCH 1/2] Add 'WithTransform' SharedInformerOption Also add support for metadata informer factory to use SharedInformerOption Signed-off-by: Eric Lin Kubernetes-commit: 9c4651bd0479b84f5e5913649207476717f3f13e --- metadata/metadatainformer/informer.go | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/metadata/metadatainformer/informer.go b/metadata/metadatainformer/informer.go index c211a4b72..ff3537e98 100644 --- a/metadata/metadatainformer/informer.go +++ b/metadata/metadatainformer/informer.go @@ -21,6 +21,7 @@ import ( "sync" "time" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -31,6 +32,17 @@ import ( "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for metadataSharedInformerFactory. +type SharedInformerOption func(*metadataSharedInformerFactory) *metadataSharedInformerFactory + +// WithTransform sets a transform on all informers. +func WithTransform(transform cache.TransformFunc) SharedInformerOption { + return func(factory *metadataSharedInformerFactory) *metadataSharedInformerFactory { + factory.transform = transform + return factory + } +} + // NewSharedInformerFactory constructs a new instance of metadataSharedInformerFactory for all namespaces. func NewSharedInformerFactory(client metadata.Interface, defaultResync time.Duration) SharedInformerFactory { return NewFilteredSharedInformerFactory(client, defaultResync, metav1.NamespaceAll, nil) @@ -49,10 +61,29 @@ func NewFilteredSharedInformerFactory(client metadata.Interface, defaultResync t } } +// NewSharedInformerFactoryWithOptions constructs a new instance of metadataSharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client metadata.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &metadataSharedInformerFactory{ + client: client, + namespace: v1.NamespaceAll, + defaultResync: defaultResync, + informers: map[schema.GroupVersionResource]informers.GenericInformer{}, + startedInformers: make(map[schema.GroupVersionResource]bool), + } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory +} + type metadataSharedInformerFactory struct { client metadata.Interface defaultResync time.Duration namespace string + transform cache.TransformFunc lock sync.Mutex informers map[schema.GroupVersionResource]informers.GenericInformer @@ -80,6 +111,7 @@ func (f *metadataSharedInformerFactory) ForResource(gvr schema.GroupVersionResou } informer = NewFilteredMetadataInformer(f.client, gvr, f.namespace, f.defaultResync, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) + informer.Informer().SetTransform(f.transform) f.informers[key] = informer return informer From 411a1189f8f9319ed91062da062eda5857ebc790 Mon Sep 17 00:00:00 2001 From: Eric Lin Date: Sun, 4 Jun 2023 20:33:01 +0000 Subject: [PATCH 2/2] Run hack/update-codegen.sh informers subprojects Signed-off-by: Eric Lin Kubernetes-commit: c86f562f29b6b7498ea962d2ac596e6d26ecd723 --- informers/factory.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/informers/factory.go b/informers/factory.go index 7dd0ae635..9fc86441a 100644 --- a/informers/factory.go +++ b/informers/factory.go @@ -60,6 +60,7 @@ type sharedInformerFactory struct { lock sync.Mutex defaultResync time.Duration customResync map[reflect.Type]time.Duration + transform cache.TransformFunc informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -98,6 +99,14 @@ func WithNamespace(namespace string) SharedInformerOption { } } +// WithTransform sets a transform on all informers. +func WithTransform(transform cache.TransformFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.transform = transform + return factory + } +} + // NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client kubernetes.Interface, defaultResync time.Duration) SharedInformerFactory { return NewSharedInformerFactoryWithOptions(client, defaultResync) @@ -202,6 +211,7 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal } informer = newFunc(f.client, resyncPeriod) + informer.SetTransform(f.transform) f.informers[informerType] = informer return informer