@@ -56,16 +56,15 @@ const (
56
56
// and creates/ updates certificates for VS resources as required,
57
57
// and VS resources when certificate objects are created/ updated
58
58
type CmController struct {
59
- vsLister []listers_v1.VirtualServerLister
60
- sync SyncFn
61
- ctx context.Context
62
- mustSync []cache.InformerSynced
63
- queue workqueue.RateLimitingInterface
64
- vsSharedInformerFactory []vsinformers.SharedInformerFactory
65
- cmSharedInformerFactory []cm_informers.SharedInformerFactory
66
- kubeSharedInformerFactory []kubeinformers.SharedInformerFactory
67
- recorder record.EventRecorder
68
- cmClient * cm_clientset.Clientset
59
+ sync SyncFn
60
+ ctx context.Context
61
+ mustSync []cache.InformerSynced
62
+ queue workqueue.RateLimitingInterface
63
+ informerGroup map [string ]* namespacedInformer
64
+ recorder record.EventRecorder
65
+ cmClient * cm_clientset.Clientset
66
+ kubeClient kubernetes.Interface
67
+ vsClient k8s_nginx.Interface
69
68
}
70
69
71
70
// CmOpts is the options required for building the CmController
@@ -78,27 +77,42 @@ type CmOpts struct {
78
77
vsClient k8s_nginx.Interface
79
78
}
80
79
80
+ type namespacedInformer struct {
81
+ vsSharedInformerFactory vsinformers.SharedInformerFactory
82
+ cmSharedInformerFactory cm_informers.SharedInformerFactory
83
+ kubeSharedInformerFactory kubeinformers.SharedInformerFactory
84
+ vsLister listers_v1.VirtualServerLister
85
+ cmLister cmlisters.CertificateLister
86
+ }
87
+
81
88
func (c * CmController ) register () workqueue.RateLimitingInterface {
82
- var cmLister []cmlisters.CertificateLister
83
- for _ , sif := range c .vsSharedInformerFactory {
84
- c .vsLister = append (c .vsLister , sif .K8s ().V1 ().VirtualServers ().Lister ())
85
- sif .K8s ().V1 ().VirtualServers ().Informer ().AddEventHandler (& controllerpkg.QueuingEventHandler {
86
- Queue : c .queue ,
87
- })
88
- c .mustSync = append (c .mustSync , sif .K8s ().V1 ().VirtualServers ().Informer ().HasSynced )
89
- }
89
+ c .sync = SyncFnFor (c .recorder , c .cmClient , c .informerGroup )
90
+ return c .queue
91
+ }
90
92
91
- for _ , cif := range c .cmSharedInformerFactory {
92
- cif .Certmanager ().V1 ().Certificates ().Informer ().AddEventHandler (& controllerpkg.BlockingEventHandler {
93
- WorkFunc : certificateHandler (c .queue ),
94
- })
95
- cmLister = append (cmLister , cif .Certmanager ().V1 ().Certificates ().Lister ())
96
- c .mustSync = append (c .mustSync , cif .Certmanager ().V1 ().Certificates ().Informer ().HasSynced )
97
- }
93
+ func (c * CmController ) newNamespacedInformer (ns string ) {
94
+ nsi := & namespacedInformer {}
95
+ nsi .cmSharedInformerFactory = cm_informers .NewSharedInformerFactoryWithOptions (c .cmClient , resyncPeriod , cm_informers .WithNamespace (ns ))
96
+ nsi .kubeSharedInformerFactory = kubeinformers .NewSharedInformerFactoryWithOptions (c .kubeClient , resyncPeriod , kubeinformers .WithNamespace (ns ))
97
+ nsi .vsSharedInformerFactory = vsinformers .NewSharedInformerFactoryWithOptions (c .vsClient , resyncPeriod , vsinformers .WithNamespace (ns ))
98
98
99
- c .sync = SyncFnFor ( c . recorder , c . cmClient , cmLister )
99
+ c .addHandlers ( nsi )
100
100
101
- return c .queue
101
+ c .informerGroup [ns ] = nsi
102
+ }
103
+
104
+ func (c * CmController ) addHandlers (nsi * namespacedInformer ) {
105
+ nsi .vsLister = nsi .vsSharedInformerFactory .K8s ().V1 ().VirtualServers ().Lister ()
106
+ nsi .vsSharedInformerFactory .K8s ().V1 ().VirtualServers ().Informer ().AddEventHandler (& controllerpkg.QueuingEventHandler {
107
+ Queue : c .queue ,
108
+ })
109
+ c .mustSync = append (c .mustSync , nsi .vsSharedInformerFactory .K8s ().V1 ().VirtualServers ().Informer ().HasSynced )
110
+
111
+ nsi .cmSharedInformerFactory .Certmanager ().V1 ().Certificates ().Informer ().AddEventHandler (& controllerpkg.BlockingEventHandler {
112
+ WorkFunc : certificateHandler (c .queue ),
113
+ })
114
+ nsi .cmLister = nsi .cmSharedInformerFactory .Certmanager ().V1 ().Certificates ().Lister ()
115
+ c .mustSync = append (c .mustSync , nsi .cmSharedInformerFactory .Certmanager ().V1 ().Certificates ().Informer ().HasSynced )
102
116
}
103
117
104
118
func (c * CmController ) processItem (ctx context.Context , key string ) error {
@@ -108,14 +122,11 @@ func (c *CmController) processItem(ctx context.Context, key string) error {
108
122
runtime .HandleError (fmt .Errorf ("invalid resource key: %s" , key ))
109
123
return err
110
124
}
125
+ nsi := getNamespacedInformer (namespace , c .informerGroup )
111
126
112
127
var vs * conf_v1.VirtualServer
113
- for _ , vl := range c .vsLister {
114
- vs , err = vl .VirtualServers (namespace ).Get (name )
115
- if err == nil {
116
- break
117
- }
118
- }
128
+ vs , err = nsi .vsLister .VirtualServers (namespace ).Get (name )
129
+
119
130
if err != nil {
120
131
return err
121
132
}
@@ -168,25 +179,22 @@ func NewCmController(opts *CmOpts) *CmController {
168
179
// Create a cert-manager api client
169
180
intcl , _ := cm_clientset .NewForConfig (opts .kubeConfig )
170
181
171
- var vsSharedInformerFactory []vsinformers.SharedInformerFactory
172
- var cmSharedInformerFactory []cm_informers.SharedInformerFactory
173
- var kubeSharedInformerFactory []kubeinformers.SharedInformerFactory
182
+ ig := make (map [string ]* namespacedInformer )
174
183
175
- for _ , ns := range opts .namespace {
176
- cmSharedInformerFactory = append (cmSharedInformerFactory , cm_informers .NewSharedInformerFactoryWithOptions (intcl , resyncPeriod , cm_informers .WithNamespace (ns )))
177
- kubeSharedInformerFactory = append (kubeSharedInformerFactory , kubeinformers .NewSharedInformerFactoryWithOptions (opts .kubeClient , resyncPeriod , kubeinformers .WithNamespace (ns )))
178
- vsSharedInformerFactory = append (vsSharedInformerFactory , vsinformers .NewSharedInformerFactoryWithOptions (opts .vsClient , resyncPeriod , vsinformers .WithNamespace (ns )))
184
+ cm := & CmController {
185
+ ctx : opts .context ,
186
+ queue : workqueue .NewNamedRateLimitingQueue (controllerpkg .DefaultItemBasedRateLimiter (), ControllerName ),
187
+ informerGroup : ig ,
188
+ recorder : opts .eventRecorder ,
189
+ cmClient : intcl ,
190
+ kubeClient : opts .kubeClient ,
191
+ vsClient : opts .vsClient ,
179
192
}
180
193
181
- cm := & CmController {
182
- ctx : opts .context ,
183
- queue : workqueue .NewNamedRateLimitingQueue (controllerpkg .DefaultItemBasedRateLimiter (), ControllerName ),
184
- cmSharedInformerFactory : cmSharedInformerFactory ,
185
- kubeSharedInformerFactory : kubeSharedInformerFactory ,
186
- recorder : opts .eventRecorder ,
187
- cmClient : intcl ,
188
- vsSharedInformerFactory : vsSharedInformerFactory ,
194
+ for _ , ns := range opts .namespace {
195
+ cm .newNamespacedInformer (ns )
189
196
}
197
+
190
198
cm .register ()
191
199
return cm
192
200
}
@@ -201,14 +209,10 @@ func (c *CmController) Run(stopCh <-chan struct{}) {
201
209
202
210
glog .Infof ("Starting cert-manager control loop" )
203
211
204
- for _ , vif := range c .vsSharedInformerFactory {
205
- go vif .Start (c .ctx .Done ())
206
- }
207
- for _ , cif := range c .cmSharedInformerFactory {
208
- go cif .Start (c .ctx .Done ())
209
- }
210
- for _ , kif := range c .kubeSharedInformerFactory {
211
- go kif .Start (c .ctx .Done ())
212
+ for _ , ig := range c .informerGroup {
213
+ go ig .vsSharedInformerFactory .Start (c .ctx .Done ())
214
+ go ig .cmSharedInformerFactory .Start (c .ctx .Done ())
215
+ go ig .kubeSharedInformerFactory .Start (c .ctx .Done ())
212
216
}
213
217
// // wait for all the informer caches we depend on are synced
214
218
glog .V (3 ).Infof ("Waiting for %d caches to sync" , len (c .mustSync ))
0 commit comments