constellation/bootstrapper/internal/kubernetes/kubewaiter/kubewaiter.go
Daniel Weiße 690b50b29d
dev-docs: Go package docs (#958)
* Remove unused package

* Add Go package docs to most packages

Signed-off-by: Daniel Weiße <dw@edgeless.systems>
Signed-off-by: Fabian Kammel <fk@edgeless.systems>
Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
Co-authored-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
Co-authored-by: Fabian Kammel <fk@edgeless.systems>
2023-01-19 15:57:50 +01:00

49 lines
1.3 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
// Package kubewaiter is used to wait for the Kubernetes API to be available.
package kubewaiter
import (
"context"
"time"
corev1 "k8s.io/api/core/v1"
"github.com/edgelesssys/constellation/v2/internal/retry"
)
// KubernetesClient is an interface for the Kubernetes client.
// It is used to check if the Kubernetes API is available.
type KubernetesClient interface {
ListAllNamespaces(ctx context.Context) (*corev1.NamespaceList, error)
}
// CloudKubeAPIWaiter waits for the Kubernetes API to be available.
type CloudKubeAPIWaiter struct{}
// Wait waits for the Kubernetes API to be available.
// Note that the kubernetesClient must have the kubeconfig already set.
func (w *CloudKubeAPIWaiter) Wait(ctx context.Context, kubernetesClient KubernetesClient) error {
funcAlwaysRetriable := func(err error) bool { return true }
doer := &kubeDoer{kubeClient: kubernetesClient}
retrier := retry.NewIntervalRetrier(doer, 5*time.Second, funcAlwaysRetriable)
if err := retrier.Do(ctx); err != nil {
return doer.Do(context.Background())
}
return nil
}
type kubeDoer struct {
kubeClient KubernetesClient
}
func (d *kubeDoer) Do(ctx context.Context) error {
_, err := d.kubeClient.ListAllNamespaces(ctx)
return err
}