@@ -56,16 +56,15 @@ const (
5656// and creates/ updates certificates for VS resources as required,
5757// and VS resources when certificate objects are created/ updated
5858type 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
6968}
7069
7170// CmOpts is the options required for building the CmController
@@ -78,27 +77,42 @@ type CmOpts struct {
7877 vsClient k8s_nginx.Interface
7978}
8079
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+
8188func (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+ }
9092
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 ))
9898
99- c .sync = SyncFnFor ( c . recorder , c . cmClient , cmLister )
99+ c .addHandlers ( nsi )
100100
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 )
102116}
103117
104118func (c * CmController ) processItem (ctx context.Context , key string ) error {
@@ -108,14 +122,11 @@ func (c *CmController) processItem(ctx context.Context, key string) error {
108122 runtime .HandleError (fmt .Errorf ("invalid resource key: %s" , key ))
109123 return err
110124 }
125+ nsi := getNamespacedInformer (namespace , c .informerGroup )
111126
112127 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+
119130 if err != nil {
120131 return err
121132 }
@@ -168,25 +179,22 @@ func NewCmController(opts *CmOpts) *CmController {
168179 // Create a cert-manager api client
169180 intcl , _ := cm_clientset .NewForConfig (opts .kubeConfig )
170181
171- var vsSharedInformerFactory []vsinformers.SharedInformerFactory
172- var cmSharedInformerFactory []cm_informers.SharedInformerFactory
173- var kubeSharedInformerFactory []kubeinformers.SharedInformerFactory
182+ ig := make (map [string ]* namespacedInformer )
174183
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 ,
179192 }
180193
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 )
189196 }
197+
190198 cm .register ()
191199 return cm
192200}
@@ -201,14 +209,10 @@ func (c *CmController) Run(stopCh <-chan struct{}) {
201209
202210 glog .Infof ("Starting cert-manager control loop" )
203211
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 ())
212216 }
213217 // // wait for all the informer caches we depend on are synced
214218 glog .V (3 ).Infof ("Waiting for %d caches to sync" , len (c .mustSync ))
0 commit comments