talos/pkg/conditions/kubeconfig.go
Andrey Smirnov 085c61b2ec
chore: add a special condition to check for kubeconfig readiness
The problem is that the kubelet kubeconfig gets created early, but the
actual client key and cert files are not written, so controllers spam
with scary errors that the config is not valid. This PR removes those
scary messages as we wait for the kubeconfig to be usable.

Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
2021-09-17 00:07:38 +03:00

52 lines
1.2 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package conditions
import (
"context"
"fmt"
"os"
"time"
"k8s.io/client-go/tools/clientcmd"
)
type kubeconfig string
func (filename kubeconfig) Wait(ctx context.Context) error {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
_, err := os.Stat(string(filename))
if err != nil && !os.IsNotExist(err) {
return err
}
_, err = clientcmd.BuildConfigFromFlags("", string(filename))
if err == nil {
return nil
}
// TODO: we can't check for specific error here (looking for file not found for client key/cert):
// https://github.com/kubernetes/kubernetes/pull/105080
select {
case <-ctx.Done():
return ctx.Err()
case <-ticker.C:
}
}
}
func (filename kubeconfig) String() string {
return fmt.Sprintf("kubeconfig %q to be ready", string(filename))
}
// WaitForKubeconfigReady is a condition that will wait for the kubeconfig to be ready.
func WaitForKubeconfigReady(filename string) Condition {
return kubeconfig(filename)
}