Add 'WithTransform' SharedInformerOption

Also add support for metadata informer factory to use SharedInformerOption

Signed-off-by: Eric Lin <exlin@google.com>
This commit is contained in:
Eric Lin 2023-06-04 12:26:58 +00:00
parent 238165450a
commit 9c4651bd04
3 changed files with 44 additions and 1 deletions

View File

@ -21,6 +21,7 @@ import (
"sync" "sync"
"time" "time"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
@ -31,6 +32,17 @@ import (
"k8s.io/client-go/tools/cache" "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. // NewSharedInformerFactory constructs a new instance of metadataSharedInformerFactory for all namespaces.
func NewSharedInformerFactory(client metadata.Interface, defaultResync time.Duration) SharedInformerFactory { func NewSharedInformerFactory(client metadata.Interface, defaultResync time.Duration) SharedInformerFactory {
return NewFilteredSharedInformerFactory(client, defaultResync, metav1.NamespaceAll, nil) 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 { type metadataSharedInformerFactory struct {
client metadata.Interface client metadata.Interface
defaultResync time.Duration defaultResync time.Duration
namespace string namespace string
transform cache.TransformFunc
lock sync.Mutex lock sync.Mutex
informers map[schema.GroupVersionResource]informers.GenericInformer 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 = 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 f.informers[key] = informer
return informer return informer

View File

@ -75,6 +75,7 @@ func (g *factoryGenerator) GenerateType(c *generator.Context, t *types.Type, w i
} }
m := map[string]interface{}{ m := map[string]interface{}{
"cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer),
"cacheTransformFunc": c.Universe.Type(cacheTransformFunc),
"groupVersions": g.groupVersions, "groupVersions": g.groupVersions,
"gvInterfaces": gvInterfaces, "gvInterfaces": gvInterfaces,
"gvNewFuncs": gvNewFuncs, "gvNewFuncs": gvNewFuncs,
@ -109,6 +110,7 @@ type sharedInformerFactory struct {
lock {{.syncMutex|raw}} lock {{.syncMutex|raw}}
defaultResync {{.timeDuration|raw}} defaultResync {{.timeDuration|raw}}
customResync map[{{.reflectType|raw}}]{{.timeDuration|raw}} customResync map[{{.reflectType|raw}}]{{.timeDuration|raw}}
transform {{.cacheTransformFunc|raw}}
informers map[{{.reflectType|raw}}]{{.cacheSharedIndexInformer|raw}} informers map[{{.reflectType|raw}}]{{.cacheSharedIndexInformer|raw}}
// startedInformers is used for tracking which informers have been started. // startedInformers is used for tracking which informers have been started.
@ -147,6 +149,14 @@ func WithNamespace(namespace string) SharedInformerOption {
} }
} }
// WithTransform sets a transform on all informers.
func WithTransform(transform {{.cacheTransformFunc|raw}}) SharedInformerOption {
return func(factory *sharedInformerFactory) *sharedInformerFactory {
factory.transform = transform
return factory
}
}
// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. // NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces.
func NewSharedInformerFactory(client {{.clientSetInterface|raw}}, defaultResync {{.timeDuration|raw}}) SharedInformerFactory { func NewSharedInformerFactory(client {{.clientSetInterface|raw}}, defaultResync {{.timeDuration|raw}}) SharedInformerFactory {
return NewSharedInformerFactoryWithOptions(client, defaultResync) return NewSharedInformerFactoryWithOptions(client, defaultResync)
@ -252,11 +262,11 @@ func (f *sharedInformerFactory) InformerFor(obj {{.runtimeObject|raw}}, newFunc
} }
informer = newFunc(f.client, resyncPeriod) informer = newFunc(f.client, resyncPeriod)
informer.SetTransform(f.transform)
f.informers[informerType] = informer f.informers[informerType] = informer
return informer return informer
} }
` `
var sharedInformerFactoryInterface = ` var sharedInformerFactoryInterface = `

View File

@ -28,6 +28,7 @@ var (
cacheNewGenericLister = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "NewGenericLister"} cacheNewGenericLister = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "NewGenericLister"}
cacheNewSharedIndexInformer = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "NewSharedIndexInformer"} cacheNewSharedIndexInformer = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "NewSharedIndexInformer"}
cacheSharedIndexInformer = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "SharedIndexInformer"} cacheSharedIndexInformer = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "SharedIndexInformer"}
cacheTransformFunc = types.Name{Package: "k8s.io/client-go/tools/cache", Name: "TransformFunc"}
listOptions = types.Name{Package: "k8s.io/kubernetes/pkg/apis/core", Name: "ListOptions"} listOptions = types.Name{Package: "k8s.io/kubernetes/pkg/apis/core", Name: "ListOptions"}
reflectType = types.Name{Package: "reflect", Name: "Type"} reflectType = types.Name{Package: "reflect", Name: "Type"}
runtimeObject = types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "Object"} runtimeObject = types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "Object"}