...
1
2
3 package externalversions
4
5 import (
6 reflect "reflect"
7 sync "sync"
8 time "time"
9
10 versioned "github.com/openshift/client-go/securityinternal/clientset/versioned"
11 internalinterfaces "github.com/openshift/client-go/securityinternal/informers/externalversions/internalinterfaces"
12 securityinternal "github.com/openshift/client-go/securityinternal/informers/externalversions/securityinternal"
13 v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14 runtime "k8s.io/apimachinery/pkg/runtime"
15 schema "k8s.io/apimachinery/pkg/runtime/schema"
16 cache "k8s.io/client-go/tools/cache"
17 )
18
19
20 type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory
21
22 type sharedInformerFactory struct {
23 client versioned.Interface
24 namespace string
25 tweakListOptions internalinterfaces.TweakListOptionsFunc
26 lock sync.Mutex
27 defaultResync time.Duration
28 customResync map[reflect.Type]time.Duration
29
30 informers map[reflect.Type]cache.SharedIndexInformer
31
32
33 startedInformers map[reflect.Type]bool
34 }
35
36
37 func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption {
38 return func(factory *sharedInformerFactory) *sharedInformerFactory {
39 for k, v := range resyncConfig {
40 factory.customResync[reflect.TypeOf(k)] = v
41 }
42 return factory
43 }
44 }
45
46
47 func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption {
48 return func(factory *sharedInformerFactory) *sharedInformerFactory {
49 factory.tweakListOptions = tweakListOptions
50 return factory
51 }
52 }
53
54
55 func WithNamespace(namespace string) SharedInformerOption {
56 return func(factory *sharedInformerFactory) *sharedInformerFactory {
57 factory.namespace = namespace
58 return factory
59 }
60 }
61
62
63 func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
64 return NewSharedInformerFactoryWithOptions(client, defaultResync)
65 }
66
67
68
69
70
71 func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
72 return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions))
73 }
74
75
76 func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory {
77 factory := &sharedInformerFactory{
78 client: client,
79 namespace: v1.NamespaceAll,
80 defaultResync: defaultResync,
81 informers: make(map[reflect.Type]cache.SharedIndexInformer),
82 startedInformers: make(map[reflect.Type]bool),
83 customResync: make(map[reflect.Type]time.Duration),
84 }
85
86
87 for _, opt := range options {
88 factory = opt(factory)
89 }
90
91 return factory
92 }
93
94
95 func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
96 f.lock.Lock()
97 defer f.lock.Unlock()
98
99 for informerType, informer := range f.informers {
100 if !f.startedInformers[informerType] {
101 go informer.Run(stopCh)
102 f.startedInformers[informerType] = true
103 }
104 }
105 }
106
107
108 func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
109 informers := func() map[reflect.Type]cache.SharedIndexInformer {
110 f.lock.Lock()
111 defer f.lock.Unlock()
112
113 informers := map[reflect.Type]cache.SharedIndexInformer{}
114 for informerType, informer := range f.informers {
115 if f.startedInformers[informerType] {
116 informers[informerType] = informer
117 }
118 }
119 return informers
120 }()
121
122 res := map[reflect.Type]bool{}
123 for informType, informer := range informers {
124 res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
125 }
126 return res
127 }
128
129
130
131 func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer {
132 f.lock.Lock()
133 defer f.lock.Unlock()
134
135 informerType := reflect.TypeOf(obj)
136 informer, exists := f.informers[informerType]
137 if exists {
138 return informer
139 }
140
141 resyncPeriod, exists := f.customResync[informerType]
142 if !exists {
143 resyncPeriod = f.defaultResync
144 }
145
146 informer = newFunc(f.client, resyncPeriod)
147 f.informers[informerType] = informer
148
149 return informer
150 }
151
152
153
154 type SharedInformerFactory interface {
155 internalinterfaces.SharedInformerFactory
156 ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
157 WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
158
159 Security() securityinternal.Interface
160 }
161
162 func (f *sharedInformerFactory) Security() securityinternal.Interface {
163 return securityinternal.New(f, f.namespace, f.tweakListOptions)
164 }
165
View as plain text