Skip to content

Commit 3215e4e

Browse files
committed
fix(catsrc): force registry update on dep resource deletion
Check registry resource status on CatalogSource owned resource deletion. If found "unhealthy", force registry update by clearing the CatalogSource's registry status.
1 parent 4dfe85c commit 3215e4e

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

pkg/controller/operators/catalog/operator.go

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ type Operator struct {
6767
subQueue workqueue.RateLimitingInterface
6868
catSrcQueueSet *queueinformer.ResourceQueueSet
6969
namespaceResolveQueue workqueue.RateLimitingInterface
70-
reconciler reconciler.ReconcilerFactory
70+
reconciler reconciler.RegistryReconcilerFactory
7171
}
7272

7373
// NewOperator creates a new Catalog Operator.
@@ -136,6 +136,7 @@ func NewOperator(kubeconfigPath string, logger *logrus.Logger, wakeupInterval ti
136136
}
137137
catsrcQueue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), queueName)
138138
op.RegisterQueueInformer(queueinformer.NewInformer(catsrcQueue, catsrcInformer.Informer(), op.syncCatalogSources, deleteCatSrc, queueName, metrics.NewMetricsCatalogSource(op.client), logger))
139+
op.lister.OperatorsV1alpha1().RegisterCatalogSourceLister(namespace, catsrcInformer.Lister())
139140
op.catSrcQueueSet.Set(namespace, catsrcQueue)
140141
}
141142

@@ -209,11 +210,7 @@ func NewOperator(kubeconfigPath string, logger *logrus.Logger, wakeupInterval ti
209210
op.lister.CoreV1().RegisterPodLister(namespace, podInformer.Lister())
210211
op.lister.CoreV1().RegisterConfigMapLister(namespace, configMapInformer.Lister())
211212
}
212-
op.reconciler = &reconciler.RegistryReconcilerFactory{
213-
ConfigMapServerImage: configmapRegistryImage,
214-
OpClient: op.OpClient,
215-
Lister: op.lister,
216-
}
213+
op.reconciler = reconciler.NewRegistryReconcilerFactory(op.lister, op.OpClient, configmapRegistryImage)
217214

218215
// Namespace sync for resolving subscriptions
219216
namespaceInformer := informers.NewSharedInformerFactory(op.OpClient.KubernetesInterface(), wakeupInterval).Core().V1().Namespaces()
@@ -290,21 +287,60 @@ func (o *Operator) handleDeletion(obj interface{}) {
290287
if !ok {
291288
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
292289
if !ok {
293-
utilruntime.HandleError(fmt.Errorf("Couldn't get object from tombstone %#v", obj))
290+
utilruntime.HandleError(fmt.Errorf("couldn't get object from tombstone %#v", obj))
294291
return
295292
}
296293

297294
ownee, ok = tombstone.Obj.(metav1.Object)
298295
if !ok {
299-
utilruntime.HandleError(fmt.Errorf("Tombstone contained object that is not a metav1 object %#v", obj))
296+
utilruntime.HandleError(fmt.Errorf("tombstone contained object that is not a metav1 object %#v", obj))
300297
return
301298
}
302299
}
303300

304-
if owner := ownerutil.GetOwnerByKind(ownee, v1alpha1.CatalogSourceKind); owner != nil {
305-
if err := o.catSrcQueueSet.Requeue(owner.Name, ownee.GetNamespace()); err != nil {
306-
o.Log.Warn(err.Error())
301+
logger := o.Log.WithFields(logrus.Fields{
302+
"sync": "resourcedeletion",
303+
"name": ownee.GetName(),
304+
"namespace": ownee.GetNamespace(),
305+
})
306+
307+
owner := ownerutil.GetOwnerByKind(ownee, v1alpha1.CatalogSourceKind)
308+
if owner == nil {
309+
logger.Debug("no owner catalogsource found")
310+
return
311+
}
312+
313+
logger = logger.WithFields(logrus.Fields{
314+
"owner": owner.Name,
315+
"ownerkind": owner.Kind,
316+
})
317+
318+
// Get the owner CatalogSource
319+
catsrc, err := o.lister.OperatorsV1alpha1().CatalogSourceLister().CatalogSources(ownee.GetNamespace()).Get(owner.Name)
320+
if err != nil {
321+
logger.WithError(err).Warn("could not get owner catalogsource from cache")
322+
return
323+
}
324+
325+
// Check the registry server
326+
checker := o.reconciler.ReconcilerForSource(catsrc)
327+
healthy, err := checker.CheckRegistryServer(catsrc)
328+
if err != nil {
329+
logger.WithError(err).Warn("error checking registry health")
330+
} else if !healthy {
331+
logger.Debug("registry server unhealthy, updating catalog source")
332+
catsrc.Status.RegistryServiceStatus = nil
333+
_, err = o.client.OperatorsV1alpha1().CatalogSources(catsrc.GetNamespace()).UpdateStatus(catsrc)
334+
if err == nil {
335+
logger.Debug("successfully updated catalogsource registry status")
336+
return
307337
}
338+
logger.WithError(err).Warn("error updating catalogsource registry status")
339+
}
340+
341+
// Requeue CatalogSource
342+
if err := o.catSrcQueueSet.Requeue(catsrc.GetName(), catsrc.GetNamespace()); err != nil {
343+
logger.WithError(err).Warn("error requeuing owner catalogsource")
308344
}
309345
}
310346

@@ -398,9 +434,9 @@ func (o *Operator) syncCatalogSources(obj interface{}) (syncError error) {
398434
return fmt.Errorf("no reconciler for source type %s", catsrc.Spec.SourceType)
399435
}
400436

401-
// if registry pod hasn't been created or hasn't been updated since the last configmap update, recreate it
437+
// If registry pod hasn't been created or hasn't been updated since the last configmap update, recreate it
402438
if catsrc.Status.RegistryServiceStatus == nil || catsrc.Status.RegistryServiceStatus.CreatedAt.Before(&catsrc.Status.LastSync) {
403-
logger.Debug("registry server scheduled recheck")
439+
logger.Debug("ensuring registry server")
404440

405441
if err := reconciler.EnsureRegistryServer(out); err != nil {
406442
logger.WithError(err).Warn("couldn't ensure registry server")
@@ -409,7 +445,7 @@ func (o *Operator) syncCatalogSources(obj interface{}) (syncError error) {
409445
logger.Debug("ensured registry server")
410446

411447
out.Status.RegistryServiceStatus.CreatedAt = timeNow()
412-
out.Status.LastSync = timeNow()
448+
out.Status.LastSync = out.Status.RegistryServiceStatus.CreatedAt
413449

414450
logger.Debug("updating catsrc status")
415451
// update status

0 commit comments

Comments
 (0)