@@ -3,18 +3,20 @@ package reconciler
3
3
4
4
import (
5
5
"context"
6
+ "errors"
6
7
"fmt"
7
8
8
9
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
9
10
hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash"
10
- "github.com/pkg/errors"
11
+ pkgerrors "github.com/pkg/errors"
11
12
"github.com/sirupsen/logrus"
12
13
corev1 "k8s.io/api/core/v1"
13
14
rbacv1 "k8s.io/api/rbac/v1"
14
15
apierrors "k8s.io/apimachinery/pkg/api/errors"
15
16
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16
17
"k8s.io/apimachinery/pkg/labels"
17
18
"k8s.io/apimachinery/pkg/util/intstr"
19
+ "k8s.io/utils/ptr"
18
20
19
21
"github.com/operator-framework/api/pkg/operators/v1alpha1"
20
22
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
@@ -192,6 +194,7 @@ type ConfigMapRegistryReconciler struct {
192
194
193
195
var _ RegistryEnsurer = & ConfigMapRegistryReconciler {}
194
196
var _ RegistryChecker = & ConfigMapRegistryReconciler {}
197
+ var _ RegistryCleaner = & ConfigMapRegistryReconciler {}
195
198
var _ RegistryReconciler = & ConfigMapRegistryReconciler {}
196
199
197
200
func (c * ConfigMapRegistryReconciler ) currentService (source configMapCatalogSourceDecorator ) (* corev1.Service , error ) {
@@ -327,27 +330,27 @@ func (c *ConfigMapRegistryReconciler) EnsureRegistryServer(logger *logrus.Entry,
327
330
328
331
//TODO: if any of these error out, we should write a status back (possibly set RegistryServiceStatus to nil so they get recreated)
329
332
if err := c .ensureServiceAccount (source , overwrite ); err != nil {
330
- return errors .Wrapf (err , "error ensuring service account: %s" , source .serviceAccountName ())
333
+ return pkgerrors .Wrapf (err , "error ensuring service account: %s" , source .serviceAccountName ())
331
334
}
332
335
if err := c .ensureRole (source , overwrite ); err != nil {
333
- return errors .Wrapf (err , "error ensuring role: %s" , source .roleName ())
336
+ return pkgerrors .Wrapf (err , "error ensuring role: %s" , source .roleName ())
334
337
}
335
338
if err := c .ensureRoleBinding (source , overwrite ); err != nil {
336
- return errors .Wrapf (err , "error ensuring rolebinding: %s" , source .RoleBinding ().GetName ())
339
+ return pkgerrors .Wrapf (err , "error ensuring rolebinding: %s" , source .RoleBinding ().GetName ())
337
340
}
338
341
pod , err := source .Pod (image , defaultPodSecurityConfig )
339
342
if err != nil {
340
343
return err
341
344
}
342
345
if err := c .ensurePod (source , defaultPodSecurityConfig , overwritePod ); err != nil {
343
- return errors .Wrapf (err , "error ensuring pod: %s" , pod .GetName ())
346
+ return pkgerrors .Wrapf (err , "error ensuring pod: %s" , pod .GetName ())
344
347
}
345
348
service , err := source .Service ()
346
349
if err != nil {
347
350
return err
348
351
}
349
352
if err := c .ensureService (source , overwrite ); err != nil {
350
- return errors .Wrapf (err , "error ensuring service: %s" , service .GetName ())
353
+ return pkgerrors .Wrapf (err , "error ensuring service: %s" , service .GetName ())
351
354
}
352
355
353
356
if overwritePod {
@@ -420,15 +423,15 @@ func (c *ConfigMapRegistryReconciler) ensurePod(source configMapCatalogSourceDec
420
423
}
421
424
for _ , p := range currentPods {
422
425
if err := c .OpClient .KubernetesInterface ().CoreV1 ().Pods (pod .GetNamespace ()).Delete (context .TODO (), p .GetName (), * metav1 .NewDeleteOptions (1 )); err != nil && ! apierrors .IsNotFound (err ) {
423
- return errors .Wrapf (err , "error deleting old pod: %s" , p .GetName ())
426
+ return pkgerrors .Wrapf (err , "error deleting old pod: %s" , p .GetName ())
424
427
}
425
428
}
426
429
}
427
430
_ , err = c .OpClient .KubernetesInterface ().CoreV1 ().Pods (pod .GetNamespace ()).Create (context .TODO (), pod , metav1.CreateOptions {})
428
431
if err == nil {
429
432
return nil
430
433
}
431
- return errors .Wrapf (err , "error creating new pod: %s" , pod .GetGenerateName ())
434
+ return pkgerrors .Wrapf (err , "error creating new pod: %s" , pod .GetGenerateName ())
432
435
}
433
436
434
437
func (c * ConfigMapRegistryReconciler ) ensureService (source configMapCatalogSourceDecorator , overwrite bool ) error {
@@ -515,3 +518,31 @@ func (c *ConfigMapRegistryReconciler) CheckRegistryServer(logger *logrus.Entry,
515
518
healthy = true
516
519
return
517
520
}
521
+
522
+ // CleanRegistryServer attempts to force delete registry client pods that are stale.
523
+ func (c * ConfigMapRegistryReconciler ) CleanRegistryServer (logger * logrus.Entry , catalogSource * v1alpha1.CatalogSource ) error {
524
+ source := configMapCatalogSourceDecorator {catalogSource , c .createPodAsUser }
525
+ defaultPodSecurityConfig , err := getDefaultPodContextConfig (c .OpClient , catalogSource .GetNamespace ())
526
+ if err != nil {
527
+ return err
528
+ }
529
+ currentPods , err := c .currentPods (source , c .Image , defaultPodSecurityConfig )
530
+ if err != nil {
531
+ return err
532
+ }
533
+ var forceDeleteErrs []error
534
+ for _ , pod := range currentPods {
535
+ if isPodDead (pod ) {
536
+ logger .WithFields (logrus.Fields {"pod.namespace" : source .GetNamespace (), "pod.name" : pod .GetName ()}).Info ("force deleting dead pod" )
537
+ if err := c .OpClient .KubernetesInterface ().CoreV1 ().Pods (source .GetNamespace ()).Delete (context .TODO (), pod .GetName (), metav1.DeleteOptions {
538
+ GracePeriodSeconds : ptr.To [int64 ](0 ),
539
+ }); err != nil && ! apierrors .IsNotFound (err ) {
540
+ forceDeleteErrs = append (forceDeleteErrs , pkgerrors .Wrapf (err , "error deleting old pod: %s" , pod .GetName ()))
541
+ }
542
+ }
543
+ }
544
+ if len (forceDeleteErrs ) > 0 {
545
+ return errors .Join (forceDeleteErrs ... )
546
+ }
547
+ return nil
548
+ }
0 commit comments