forked from rook/rook
This includes and is based on the changes of: https://github.com/rook/rook/pull/14894 Co-authored-by: Blaine Gardner <b.blaine.gardner@gmail.com> Co-authored-by: subhamkrai <srai@redhat.com> Signed-off-by: Michael Adam <obnox@samba.org> Fixes: #14894
263 lines
9.0 KiB
Go
263 lines
9.0 KiB
Go
/*
|
||
Copyright 2018 The Rook Authors. All rights reserved.
|
||
|
||
Licensed under the Apache License, Version 2.0 (the "License");
|
||
you may not use this file except in compliance with the License.
|
||
You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing, software
|
||
distributed under the License is distributed on an "AS IS" BASIS,
|
||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
See the License for the specific language governing permissions and
|
||
limitations under the License.
|
||
*/
|
||
|
||
// Code generated by informer-gen. DO NOT EDIT.
|
||
|
||
package externalversions
|
||
|
||
import (
|
||
reflect "reflect"
|
||
sync "sync"
|
||
time "time"
|
||
|
||
versioned "github.com/rook/rook/pkg/client/clientset/versioned"
|
||
cephrookio "github.com/rook/rook/pkg/client/informers/externalversions/ceph.rook.io"
|
||
internalinterfaces "github.com/rook/rook/pkg/client/informers/externalversions/internalinterfaces"
|
||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||
runtime "k8s.io/apimachinery/pkg/runtime"
|
||
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||
cache "k8s.io/client-go/tools/cache"
|
||
)
|
||
|
||
// SharedInformerOption defines the functional option type for SharedInformerFactory.
|
||
type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory
|
||
|
||
type sharedInformerFactory struct {
|
||
client versioned.Interface
|
||
namespace string
|
||
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||
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.
|
||
// This allows Start() to be called multiple times safely.
|
||
startedInformers map[reflect.Type]bool
|
||
// wg tracks how many goroutines were started.
|
||
wg sync.WaitGroup
|
||
// shuttingDown is true when Shutdown has been called. It may still be running
|
||
// because it needs to wait for goroutines.
|
||
shuttingDown bool
|
||
}
|
||
|
||
// WithCustomResyncConfig sets a custom resync period for the specified informer types.
|
||
func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption {
|
||
return func(factory *sharedInformerFactory) *sharedInformerFactory {
|
||
for k, v := range resyncConfig {
|
||
factory.customResync[reflect.TypeOf(k)] = v
|
||
}
|
||
return factory
|
||
}
|
||
}
|
||
|
||
// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory.
|
||
func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption {
|
||
return func(factory *sharedInformerFactory) *sharedInformerFactory {
|
||
factory.tweakListOptions = tweakListOptions
|
||
return factory
|
||
}
|
||
}
|
||
|
||
// WithNamespace limits the SharedInformerFactory to the specified namespace.
|
||
func WithNamespace(namespace string) SharedInformerOption {
|
||
return func(factory *sharedInformerFactory) *sharedInformerFactory {
|
||
factory.namespace = namespace
|
||
return factory
|
||
}
|
||
}
|
||
|
||
// 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 versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
|
||
return NewSharedInformerFactoryWithOptions(client, defaultResync)
|
||
}
|
||
|
||
// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory.
|
||
// Listers obtained via this SharedInformerFactory will be subject to the same filters
|
||
// as specified here.
|
||
// Deprecated: Please use NewSharedInformerFactoryWithOptions instead
|
||
func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
|
||
return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions))
|
||
}
|
||
|
||
// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options.
|
||
func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory {
|
||
factory := &sharedInformerFactory{
|
||
client: client,
|
||
namespace: v1.NamespaceAll,
|
||
defaultResync: defaultResync,
|
||
informers: make(map[reflect.Type]cache.SharedIndexInformer),
|
||
startedInformers: make(map[reflect.Type]bool),
|
||
customResync: make(map[reflect.Type]time.Duration),
|
||
}
|
||
|
||
// Apply all options
|
||
for _, opt := range options {
|
||
factory = opt(factory)
|
||
}
|
||
|
||
return factory
|
||
}
|
||
|
||
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
|
||
f.lock.Lock()
|
||
defer f.lock.Unlock()
|
||
|
||
if f.shuttingDown {
|
||
return
|
||
}
|
||
|
||
for informerType, informer := range f.informers {
|
||
if !f.startedInformers[informerType] {
|
||
f.wg.Add(1)
|
||
// We need a new variable in each loop iteration,
|
||
// otherwise the goroutine would use the loop variable
|
||
// and that keeps changing.
|
||
informer := informer
|
||
go func() {
|
||
defer f.wg.Done()
|
||
informer.Run(stopCh)
|
||
}()
|
||
f.startedInformers[informerType] = true
|
||
}
|
||
}
|
||
}
|
||
|
||
func (f *sharedInformerFactory) Shutdown() {
|
||
f.lock.Lock()
|
||
f.shuttingDown = true
|
||
f.lock.Unlock()
|
||
|
||
// Will return immediately if there is nothing to wait for.
|
||
f.wg.Wait()
|
||
}
|
||
|
||
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
|
||
informers := func() map[reflect.Type]cache.SharedIndexInformer {
|
||
f.lock.Lock()
|
||
defer f.lock.Unlock()
|
||
|
||
informers := map[reflect.Type]cache.SharedIndexInformer{}
|
||
for informerType, informer := range f.informers {
|
||
if f.startedInformers[informerType] {
|
||
informers[informerType] = informer
|
||
}
|
||
}
|
||
return informers
|
||
}()
|
||
|
||
res := map[reflect.Type]bool{}
|
||
for informType, informer := range informers {
|
||
res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
|
||
}
|
||
return res
|
||
}
|
||
|
||
// InformerFor returns the SharedIndexInformer for obj using an internal
|
||
// client.
|
||
func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer {
|
||
f.lock.Lock()
|
||
defer f.lock.Unlock()
|
||
|
||
informerType := reflect.TypeOf(obj)
|
||
informer, exists := f.informers[informerType]
|
||
if exists {
|
||
return informer
|
||
}
|
||
|
||
resyncPeriod, exists := f.customResync[informerType]
|
||
if !exists {
|
||
resyncPeriod = f.defaultResync
|
||
}
|
||
|
||
informer = newFunc(f.client, resyncPeriod)
|
||
informer.SetTransform(f.transform)
|
||
f.informers[informerType] = informer
|
||
|
||
return informer
|
||
}
|
||
|
||
// SharedInformerFactory provides shared informers for resources in all known
|
||
// API group versions.
|
||
//
|
||
// It is typically used like this:
|
||
//
|
||
// ctx, cancel := context.Background()
|
||
// defer cancel()
|
||
// factory := NewSharedInformerFactory(client, resyncPeriod)
|
||
// defer factory.WaitForStop() // Returns immediately if nothing was started.
|
||
// genericInformer := factory.ForResource(resource)
|
||
// typedInformer := factory.SomeAPIGroup().V1().SomeType()
|
||
// factory.Start(ctx.Done()) // Start processing these informers.
|
||
// synced := factory.WaitForCacheSync(ctx.Done())
|
||
// for v, ok := range synced {
|
||
// if !ok {
|
||
// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v)
|
||
// return
|
||
// }
|
||
// }
|
||
//
|
||
// // Creating informers can also be created after Start, but then
|
||
// // Start must be called again:
|
||
// anotherGenericInformer := factory.ForResource(resource)
|
||
// factory.Start(ctx.Done())
|
||
type SharedInformerFactory interface {
|
||
internalinterfaces.SharedInformerFactory
|
||
|
||
// Start initializes all requested informers. They are handled in goroutines
|
||
// which run until the stop channel gets closed.
|
||
// Warning: Start does not block. When run in a go-routine, it will race with a later WaitForCacheSync.
|
||
Start(stopCh <-chan struct{})
|
||
|
||
// Shutdown marks a factory as shutting down. At that point no new
|
||
// informers can be started anymore and Start will return without
|
||
// doing anything.
|
||
//
|
||
// In addition, Shutdown blocks until all goroutines have terminated. For that
|
||
// to happen, the close channel(s) that they were started with must be closed,
|
||
// either before Shutdown gets called or while it is waiting.
|
||
//
|
||
// Shutdown may be called multiple times, even concurrently. All such calls will
|
||
// block until all goroutines have terminated.
|
||
Shutdown()
|
||
|
||
// WaitForCacheSync blocks until all started informers' caches were synced
|
||
// or the stop channel gets closed.
|
||
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
|
||
|
||
// ForResource gives generic access to a shared informer of the matching type.
|
||
ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
|
||
|
||
// InformerFor returns the SharedIndexInformer for obj using an internal
|
||
// client.
|
||
InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer
|
||
|
||
Ceph() cephrookio.Interface
|
||
}
|
||
|
||
func (f *sharedInformerFactory) Ceph() cephrookio.Interface {
|
||
return cephrookio.New(f, f.namespace, f.tweakListOptions)
|
||
}
|