@@ -15,7 +15,6 @@ import (
1515 "slices"
1616 "time"
1717
18- "github.com/avast/retry-go"
1918 "github.com/bombsimon/logrusr/v4"
2019 "github.com/k0sproject/k0s/internal/pkg/templatewriter"
2120 helmv1beta1 "github.com/k0sproject/k0s/pkg/apis/helm/v1beta1"
@@ -28,9 +27,11 @@ import (
2827 kubeutil "github.com/k0sproject/k0s/pkg/kubernetes"
2928 "github.com/k0sproject/k0s/pkg/leaderelection"
3029 "github.com/sirupsen/logrus"
30+ "golang.org/x/time/rate"
3131 "helm.sh/helm/v3/pkg/release"
3232 "helm.sh/helm/v3/pkg/storage/driver"
3333 apierrors "k8s.io/apimachinery/pkg/api/errors"
34+ "k8s.io/apimachinery/pkg/api/meta"
3435 "k8s.io/apimachinery/pkg/runtime/schema"
3536 "k8s.io/apimachinery/pkg/types"
3637 "k8s.io/client-go/tools/clientcmd"
@@ -414,10 +415,6 @@ func (ec *ExtensionsController) instantiateManager(ctx context.Context) (crman.M
414415 if err != nil {
415416 return nil , fmt .Errorf ("can't build controller-runtime controller for helm extensions: %w" , err )
416417 }
417- gk := schema.GroupKind {
418- Group : helmv1beta1 .GroupName ,
419- Kind : "Chart" ,
420- }
421418
422419 mgr , err := controllerruntime .NewManager (clientConfig , crman.Options {
423420 Scheme : k0sscheme .Scheme ,
@@ -430,16 +427,27 @@ func (ec *ExtensionsController) instantiateManager(ctx context.Context) (crman.M
430427 if err != nil {
431428 return nil , fmt .Errorf ("can't build controller-runtime controller for helm extensions: %w" , err )
432429 }
433- if err := retry .Do (func () error {
434- _ , err := mgr .GetRESTMapper ().RESTMapping (gk )
435- if err != nil {
436- ec .L .Warn ("Extensions CRD is not yet ready, waiting before starting ExtensionsController" )
437- return err
430+
431+ for chart , sometimes := (schema.GroupKind {Group : helmv1beta1 .GroupName , Kind : "Chart" }), (& rate.Sometimes {Every : 5 }); ; {
432+ _ , err := mgr .GetRESTMapper ().RESTMapping (chart )
433+ if err == nil {
434+ ec .L .Info (chart , " CRD is ready, going nuts" )
435+ break
436+ }
437+
438+ sometimes .Do (func () {
439+ if meta .IsNoMatchError (err ) {
440+ ec .L .Warn (chart , " CRD is not yet ready, waiting before starting ExtensionsController" )
441+ } else {
442+ ec .L .WithError (err ).Error ("Failed to check for " , chart , " CRD readiness" )
443+ }
444+ })
445+
446+ select {
447+ case <- time .After (2 * time .Second ):
448+ case <- ctx .Done ():
449+ return nil , fmt .Errorf ("while waiting for %s CRD: %w (last error: %w)" , chart , context .Cause (ctx ), err )
438450 }
439- ec .L .Info ("Extensions CRD is ready, going nuts" )
440- return nil
441- }, retry .Context (ctx )); err != nil {
442- return nil , fmt .Errorf ("can't start ExtensionsReconciler, helm CRD is not registered, check CRD registration reconciler: %w" , err )
443451 }
444452
445453 if err := builder .
0 commit comments