@@ -19,6 +19,7 @@ import (
19
19
"k8s.io/client-go/tools/cache"
20
20
"k8s.io/client-go/tools/record"
21
21
"k8s.io/client-go/util/workqueue"
22
+ apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
22
23
kagg "k8s.io/kube-aggregator/pkg/client/informers/externalversions"
23
24
24
25
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
@@ -53,6 +54,7 @@ type Operator struct {
53
54
* queueinformer.Operator
54
55
csvQueueSet * queueinformer.ResourceQueueSet
55
56
ogQueueSet * queueinformer.ResourceQueueSet
57
+ apiSvcQueue workqueue.RateLimitingInterface
56
58
client versioned.Interface
57
59
resolver install.StrategyResolverInterface
58
60
apiReconciler resolver.APIIntersectionReconciler
@@ -166,17 +168,20 @@ func NewOperator(logger *logrus.Logger, crClient versioned.Interface, opClient o
166
168
167
169
// Register APIService QueueInformer
168
170
apiServiceInformer := kagg .NewSharedInformerFactory (opClient .ApiregistrationV1Interface (), wakeupInterval ).Apiregistration ().V1 ().APIServices ()
169
- op .RegisterQueueInformer (queueinformer .NewInformer (
170
- workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "apiservices" ),
171
+ apiServiceQueue := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "apiservices" )
172
+ apiServiceQueueInformer := queueinformer .NewInformer (
173
+ apiServiceQueue ,
171
174
apiServiceInformer .Informer (),
172
- op .syncObject ,
175
+ op .syncAPIService ,
173
176
& cache.ResourceEventHandlerFuncs {
174
177
DeleteFunc : op .handleDeletion ,
175
178
},
176
179
"apiservices" ,
177
180
metrics .NewMetricsNil (),
178
181
logger ,
179
- ))
182
+ )
183
+ op .RegisterQueueInformer (apiServiceQueueInformer )
184
+ op .apiSvcQueue = apiServiceQueue
180
185
op .lister .APIRegistrationV1 ().RegisterAPIServiceLister (apiServiceInformer .Lister ())
181
186
182
187
// Register CustomResourceDefinition QueueInformer
@@ -307,6 +312,46 @@ func NewOperator(logger *logrus.Logger, crClient versioned.Interface, opClient o
307
312
return op , nil
308
313
}
309
314
315
+ func (a * Operator ) syncAPIService (obj interface {}) (syncError error ) {
316
+ apiSvc , ok := obj .(* apiregistrationv1.APIService )
317
+ if ! ok {
318
+ a .Log .Debugf ("wrong type: %#v" , obj )
319
+ return fmt .Errorf ("casting APIService failed" )
320
+ }
321
+
322
+ logger := a .Log .WithFields (logrus.Fields {
323
+ "id" : queueinformer .NewLoopID (),
324
+ "apiSvc" : apiSvc .GetName (),
325
+ })
326
+ logger .Info ("syncing APIService" )
327
+
328
+ if name , ns , ok := ownerutil .GetOwnerByKindLabel (apiSvc , v1alpha1 .ClusterServiceVersionKind ); ok {
329
+ _ , err := a .lister .CoreV1 ().NamespaceLister ().Get (ns )
330
+ if k8serrors .IsNotFound (err ) {
331
+ logger .Debug ("Deleting api service since owning namespace is not found" )
332
+ syncError = a .OpClient .DeleteAPIService (apiSvc .GetName (), & metav1.DeleteOptions {})
333
+ return
334
+ }
335
+
336
+ _ , err = a .lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (ns ).Get (name )
337
+ if k8serrors .IsNotFound (err ) {
338
+ logger .Debug ("Deleting api service since owning CSV is not found" )
339
+ syncError = a .OpClient .DeleteAPIService (apiSvc .GetName (), & metav1.DeleteOptions {})
340
+ return
341
+ } else if err != nil {
342
+ syncError = err
343
+ return
344
+ } else {
345
+ if ownerutil .IsOwnedByKindLabel (apiSvc , v1alpha1 .ClusterServiceVersionKind ) {
346
+ logger .Debug ("requeueing owner CSVs" )
347
+ a .requeueOwnerCSVs (apiSvc )
348
+ }
349
+ }
350
+ }
351
+
352
+ return nil
353
+ }
354
+
310
355
func (a * Operator ) syncObject (obj interface {}) (syncError error ) {
311
356
// Assert as metav1.Object
312
357
metaObj , ok := obj .(metav1.Object )
0 commit comments