pkg/clustermanager/deleter.go (72 lines of code) (raw):
package clustermanager
import (
"context"
"math"
"time"
"github.com/go-logr/logr"
"github.com/pkg/errors"
"github.com/aws/eks-anywhere/pkg/clients/kubernetes"
"github.com/aws/eks-anywhere/pkg/cluster"
"github.com/aws/eks-anywhere/pkg/retrier"
"github.com/aws/eks-anywhere/pkg/types"
)
// DeleterOpt allows to customize a Deleter on construction.
type DeleterOpt func(*Deleter)
// Deleter deletes the cluster from the management cluster and waits
// until the deletions are fully reconciled.
type Deleter struct {
log logr.Logger
clientFactory ClientFactory
deleteClusterTimeout time.Duration
retryBackOff time.Duration
conditionCheckoutTotalCount int
}
const deleteClusterSpecTimeout = 5 * time.Minute
// NewDeleter builds an Deleter.
func NewDeleter(log logr.Logger, clientFactory ClientFactory, opts ...DeleterOpt) Deleter {
a := &Deleter{
log: log,
clientFactory: clientFactory,
deleteClusterTimeout: deleteClusterSpecTimeout,
retryBackOff: retryBackOff,
conditionCheckoutTotalCount: defaultConditionCheckTotalCount,
}
for _, opt := range opts {
opt(a)
}
return *a
}
// WithDeleterNoTimeouts disables the timeout for all the waits and retries in management upgrader.
func WithDeleterNoTimeouts() DeleterOpt {
return func(a *Deleter) {
maxTime := time.Duration(math.MaxInt64)
a.deleteClusterTimeout = maxTime
}
}
// WithDeleterApplyClusterTimeout allows to configure how long the deleter retries
// to delete the objects in case of failure.
// Generally only used in tests.
func WithDeleterApplyClusterTimeout(timeout time.Duration) DeleterOpt {
return func(a *Deleter) {
a.deleteClusterTimeout = timeout
}
}
// WithDeleterRetryBackOff allows to configure how long the deleter waits between requests
// to update the cluster spec objects and check the status of the Cluster.
// Generally only used in tests.
func WithDeleterRetryBackOff(backOff time.Duration) DeleterOpt {
return func(a *Deleter) {
a.retryBackOff = backOff
}
}
// Run deletes the cluster's spec in the management cluster and waits
// until the changes are fully reconciled.
func (a Deleter) Run(ctx context.Context, spec *cluster.Spec, managementCluster types.Cluster) error {
var client kubernetes.Client
a.log.V(3).Info("Deleting cluster spec")
err := retrier.New(
a.deleteClusterTimeout,
retrier.WithRetryPolicy(retrier.BackOffPolicy(a.retryBackOff)),
).Retry(func() error {
var err error
client, err = a.clientFactory.BuildClientFromKubeconfig(managementCluster.KubeconfigFile)
if err != nil {
return errors.Wrap(err, "building client to delete cluster")
}
if err := client.Delete(ctx, spec.Cluster); err != nil {
return errors.Wrapf(err, "deleting cluster")
}
return nil
})
if err != nil {
return err
}
return nil
}