@@ -19,6 +19,7 @@ import (
1919 "k8s.io/client-go/tools/cache"
2020 "k8s.io/client-go/tools/record"
2121 "k8s.io/client-go/util/workqueue"
22+ apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
2223 kagg "k8s.io/kube-aggregator/pkg/client/informers/externalversions"
2324
2425 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
@@ -53,6 +54,7 @@ type Operator struct {
5354 * queueinformer.Operator
5455 csvQueueSet * queueinformer.ResourceQueueSet
5556 ogQueueSet * queueinformer.ResourceQueueSet
57+ apiSvcQueue workqueue.RateLimitingInterface
5658 client versioned.Interface
5759 resolver install.StrategyResolverInterface
5860 apiReconciler resolver.APIIntersectionReconciler
@@ -166,17 +168,20 @@ func NewOperator(logger *logrus.Logger, crClient versioned.Interface, opClient o
166168
167169 // Register APIService QueueInformer
168170 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 ,
171174 apiServiceInformer .Informer (),
172- op .syncObject ,
175+ op .syncAPIService ,
173176 & cache.ResourceEventHandlerFuncs {
174177 DeleteFunc : op .handleDeletion ,
175178 },
176179 "apiservices" ,
177180 metrics .NewMetricsNil (),
178181 logger ,
179- ))
182+ )
183+ op .RegisterQueueInformer (apiServiceQueueInformer )
184+ op .apiSvcQueue = apiServiceQueue
180185 op .lister .APIRegistrationV1 ().RegisterAPIServiceLister (apiServiceInformer .Lister ())
181186
182187 // Register CustomResourceDefinition QueueInformer
@@ -307,6 +312,46 @@ func NewOperator(logger *logrus.Logger, crClient versioned.Interface, opClient o
307312 return op , nil
308313}
309314
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+
310355func (a * Operator ) syncObject (obj interface {}) (syncError error ) {
311356 // Assert as metav1.Object
312357 metaObj , ok := obj .(metav1.Object )
0 commit comments