Skip to content

Commit f946fb1

Browse files
author
Jeff Peeler
committed
fix(olm): add deletion monitoring for api services
If an api service has owner labels, check to make sure that the namespace and owning CSV still exists. If either does not, delete the api service.
1 parent 9ba3512 commit f946fb1

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

pkg/controller/operators/olm/operator.go

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
310355
func (a *Operator) syncObject(obj interface{}) (syncError error) {
311356
// Assert as metav1.Object
312357
metaObj, ok := obj.(metav1.Object)

0 commit comments

Comments
 (0)