@@ -50,10 +50,10 @@ const (
50
50
51
51
type Operator struct {
52
52
* queueinformer.Operator
53
- csvQueue workqueue.RateLimitingInterface
54
- client versioned.Interface
55
- resolver install.StrategyResolverInterface
56
- lister operatorlister.OperatorLister
53
+ csvQueues map [ string ] workqueue.RateLimitingInterface
54
+ client versioned.Interface
55
+ resolver install.StrategyResolverInterface
56
+ lister operatorlister.OperatorLister
57
57
recorder record.EventRecorder
58
58
}
59
59
@@ -75,11 +75,12 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
75
75
}
76
76
77
77
op := & Operator {
78
- Operator : queueOperator ,
79
- client : crClient ,
80
- lister : operatorlister .NewLister (),
81
- resolver : resolver ,
82
- recorder : eventRecorder ,
78
+ Operator : queueOperator ,
79
+ csvQueues : make (map [string ]workqueue.RateLimitingInterface ),
80
+ client : crClient ,
81
+ lister : operatorlister .NewLister (),
82
+ resolver : resolver ,
83
+ recorder : eventRecorder ,
83
84
}
84
85
85
86
// Set up RBAC informers
@@ -96,7 +97,7 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
96
97
namespaceInformer .Informer (),
97
98
op .syncObject ,
98
99
nil ,
99
- "namespace " ,
100
+ "namespaces " ,
100
101
metrics .NewMetricsNil (),
101
102
)
102
103
op .RegisterQueueInformer (queueInformer )
@@ -117,7 +118,7 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
117
118
& cache.ResourceEventHandlerFuncs {
118
119
DeleteFunc : op .handleDeletion ,
119
120
},
120
- "namespace " ,
121
+ "rbac " ,
121
122
metrics .NewMetricsNil (),
122
123
)
123
124
for _ , informer := range rbacQueueInformers {
@@ -181,95 +182,74 @@ func NewOperator(crClient versioned.Interface, opClient operatorclient.ClientInt
181
182
& cache.ResourceEventHandlerFuncs {
182
183
DeleteFunc : op .handleDeletion ,
183
184
},
184
- "services " ,
185
+ "serviceaccounts " ,
185
186
metrics .NewMetricsNil (),
186
187
))
187
188
op .lister .CoreV1 ().RegisterServiceAccountLister (metav1 .NamespaceAll , serviceAccountInformer .Lister ())
188
189
189
- // Set up watch on CSVs
190
- csvInformers := []cache.SharedIndexInformer {}
190
+ // csvInformers for each namespace all use the same backing queue keys are namespaced
191
+ csvHandlers := & cache.ResourceEventHandlerFuncs {
192
+ DeleteFunc : op .deleteClusterServiceVersion ,
193
+ }
191
194
for _ , namespace := range namespaces {
192
- log .Debugf ( "watching for CSVs in namespace %s " , namespace )
195
+ log .WithField ( " namespace" , namespace ). Infof ( "watching CSVs" )
193
196
sharedInformerFactory := externalversions .NewSharedInformerFactoryWithOptions (crClient , wakeupInterval , externalversions .WithNamespace (namespace ))
194
- informer := sharedInformerFactory .Operators ().V1alpha1 ().ClusterServiceVersions ()
195
- csvInformers = append (csvInformers , informer .Informer ())
196
- op .lister .OperatorsV1alpha1 ().RegisterClusterServiceVersionLister (namespace , informer .Lister ())
197
- }
197
+ csvInformer := sharedInformerFactory .Operators ().V1alpha1 ().ClusterServiceVersions ()
198
+ op .lister .OperatorsV1alpha1 ().RegisterClusterServiceVersionLister (namespace , csvInformer .Lister ())
198
199
199
- // csvInformers for each namespace all use the same backing queue
200
- // queue keys are namespaced
201
- csvQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "clusterserviceversions" )
202
- csvHandlers := cache.ResourceEventHandlerFuncs {
203
- DeleteFunc : op .deleteClusterServiceVersion ,
204
- }
205
- queueInformers := queueinformer .New (
206
- csvQueue ,
207
- csvInformers ,
208
- op .syncClusterServiceVersion ,
209
- & csvHandlers ,
210
- "csv" ,
211
- metrics .NewMetricsCSV (op .client ),
212
- )
213
- for _ , informer := range queueInformers {
214
- op .RegisterQueueInformer (informer )
200
+ // Register queue and QueueInformer
201
+ queueName := fmt .Sprintf ("%s/clusterserviceversions" , namespace )
202
+ csvQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), queueName )
203
+ csvQueueInformer := queueinformer .NewInformer (csvQueue , csvInformer .Informer (), op .syncClusterServiceVersion , csvHandlers , queueName , metrics .NewMetricsCSV (op .client ))
204
+ op .RegisterQueueInformer (csvQueueInformer )
205
+ op .csvQueues [namespace ] = csvQueue
215
206
}
216
- op .csvQueue = csvQueue
217
207
218
- // set up watch on deployments
219
- depInformers := []cache.SharedIndexInformer {}
220
- for _ , namespace := range namespaces {
221
- log .Debugf ("watching deployments in namespace %s" , namespace )
222
- informer := informers .NewSharedInformerFactoryWithOptions (opClient .KubernetesInterface (), wakeupInterval , informers .WithNamespace (namespace )).Apps ().V1 ().Deployments ()
223
- depInformers = append (depInformers , informer .Informer ())
224
- op .lister .AppsV1 ().RegisterDeploymentLister (namespace , informer .Lister ())
208
+ // Set up watch on deployments
209
+ depHandlers := & cache.ResourceEventHandlerFuncs {
210
+ DeleteFunc : op .handleDeletion ,
225
211
}
212
+ for _ , namespace := range namespaces {
213
+ log .WithField ("namespace" , namespace ).Infof ("watching deployments" )
214
+ depInformer := informers .NewSharedInformerFactoryWithOptions (opClient .KubernetesInterface (), wakeupInterval , informers .WithNamespace (namespace )).Apps ().V1 ().Deployments ()
215
+ op .lister .AppsV1 ().RegisterDeploymentLister (namespace , depInformer .Lister ())
226
216
227
- depQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "csv-deployments" )
228
- depQueueInformers := queueinformer .New (
229
- depQueue ,
230
- depInformers ,
231
- op .syncDeployment ,
232
- & cache.ResourceEventHandlerFuncs {
233
- DeleteFunc : op .handleDeletion ,
234
- },
235
- "deployment" ,
236
- metrics .NewMetricsNil (),
237
- )
238
- for _ , informer := range depQueueInformers {
239
- op .RegisterQueueInformer (informer )
217
+ // Register queue and QueueInformer
218
+ queueName := fmt .Sprintf ("%s/csv-deployments" , namespace )
219
+ depQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), queueName )
220
+ depQueueInformer := queueinformer .NewInformer (depQueue , depInformer .Informer (), op .syncDeployment , depHandlers , queueName , metrics .NewMetricsNil ())
221
+ op .RegisterQueueInformer (depQueueInformer )
240
222
}
241
223
242
224
// Create an informer for the operator group
243
- operatorGroupInformers := []cache.SharedIndexInformer {}
244
225
for _ , namespace := range namespaces {
245
- informerFactory := externalversions .NewSharedInformerFactoryWithOptions (crClient , wakeupInterval , externalversions .WithNamespace (namespace ))
246
- informer := informerFactory .Operators ().V1alpha2 ().OperatorGroups ()
247
- operatorGroupInformers = append (operatorGroupInformers , informer .Informer ())
248
- op .lister .OperatorsV1alpha2 ().RegisterOperatorGroupLister (namespace , informer .Lister ())
249
- }
250
-
251
- // Register OperatorGroup informers.
252
- operatorGroupQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "operatorgroups" )
253
- operatorGroupQueueInformer := queueinformer .New (
254
- operatorGroupQueue ,
255
- operatorGroupInformers ,
256
- op .syncOperatorGroups ,
257
- nil ,
258
- "operatorgroups" ,
259
- metrics .NewMetricsNil (),
260
- )
261
- for _ , informer := range operatorGroupQueueInformer {
262
- op .RegisterQueueInformer (informer )
226
+ log .WithField ("namespace" , namespace ).Infof ("watching OperatorGroups" )
227
+ sharedInformerFactory := externalversions .NewSharedInformerFactoryWithOptions (crClient , wakeupInterval , externalversions .WithNamespace (namespace ))
228
+ operatorGroupInformer := sharedInformerFactory .Operators ().V1alpha2 ().OperatorGroups ()
229
+ op .lister .OperatorsV1alpha2 ().RegisterOperatorGroupLister (namespace , operatorGroupInformer .Lister ())
230
+
231
+ // Register queue and QueueInformer
232
+ queueName := fmt .Sprintf ("%s/operatorgroups" , namespace )
233
+ operatorGroupQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), queueName )
234
+ operatorGroupQueueInformer := queueinformer .NewInformer (operatorGroupQueue , operatorGroupInformer .Informer (), op .syncOperatorGroups , nil , queueName , metrics .NewMetricsNil ())
235
+ op .RegisterQueueInformer (operatorGroupQueueInformer )
263
236
}
264
237
265
238
return op , nil
266
239
}
267
240
268
241
func (a * Operator ) requeueCSV (name , namespace string ) {
269
- // we can build the key directly, will need to change if queue uses different key scheme
242
+ // We can build the key directly, will need to change if queue uses different key scheme
270
243
key := fmt .Sprintf ("%s/%s" , namespace , name )
271
- log .Debugf ("requeueing CSV %s" , key )
272
- a .csvQueue .AddRateLimited (key )
244
+ logger := log .WithField ("key" , key )
245
+ logger .Debugf ("requeueing CSV" )
246
+
247
+ if queue , ok := a .csvQueues [namespace ]; ok {
248
+ queue .AddRateLimited (key )
249
+ return
250
+ }
251
+
252
+ logger .Debugf ("couldn't find queue for CSV" )
273
253
}
274
254
275
255
func (a * Operator ) syncDeployment (obj interface {}) (syncError error ) {
@@ -398,7 +378,9 @@ func (a *Operator) syncClusterServiceVersion(obj interface{}) (syncError error)
398
378
"phase" : clusterServiceVersion .Status .Phase ,
399
379
})
400
380
401
- if clusterServiceVersion .Status .Reason == v1alpha1 .CSVReasonCopied {
381
+ operatorNamespace , ok := clusterServiceVersion .GetAnnotations ()["olm.operatorNamespace" ]
382
+ if clusterServiceVersion .Status .Reason == v1alpha1 .CSVReasonCopied ||
383
+ ok && clusterServiceVersion .GetNamespace () != operatorNamespace {
402
384
logger .Info ("skip sync of dummy CSV" )
403
385
return a .removeDanglingChildCSVs (clusterServiceVersion )
404
386
}
0 commit comments