From 03c109b74b0f2e3bbde87320127caf434bc3c27e Mon Sep 17 00:00:00 2001 From: Ciprian Hacman Date: Sun, 7 Jan 2024 07:15:25 +0200 Subject: [PATCH] Make cluster deletion configurable --- cmd/kops/delete_cluster.go | 16 +++++++++++++++- docs/cli/kops_delete_cluster.md | 13 ++++++++----- pkg/resources/ops/delete.go | 11 +++++++---- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/cmd/kops/delete_cluster.go b/cmd/kops/delete_cluster.go index fda3432a388b0..46e7a61bbfbc8 100644 --- a/cmd/kops/delete_cluster.go +++ b/cmd/kops/delete_cluster.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io" + "time" "github.com/spf13/cobra" "k8s.io/client-go/tools/clientcmd" @@ -44,6 +45,14 @@ type DeleteClusterOptions struct { External bool Unregister bool ClusterName string + wait time.Duration + count int + interval time.Duration +} + +func (o *DeleteClusterOptions) InitDefaults() { + o.count = 42 + o.interval = 10 * time.Second } var ( @@ -64,6 +73,7 @@ var ( func NewCmdDeleteCluster(f *util.Factory, out io.Writer) *cobra.Command { options := &DeleteClusterOptions{} + options.InitDefaults() cmd := &cobra.Command{ Use: "cluster [CLUSTER]", @@ -84,6 +94,10 @@ func NewCmdDeleteCluster(f *util.Factory, out io.Writer) *cobra.Command { cmd.Flags().StringVar(&options.Region, "region", options.Region, "External cluster's cloud region") cmd.RegisterFlagCompletionFunc("region", completeRegion) + cmd.Flags().DurationVar(&options.wait, "wait", options.wait, "Amount of time to wait for the cluster resources to de deleted") + cmd.Flags().IntVar(&options.count, "count", options.count, "Number of consecutive failures to make progress deleting the cluster resources") + cmd.Flags().DurationVar(&options.interval, "interval", options.interval, "Time in duration to wait between deletion attempts") + return cmd } @@ -171,7 +185,7 @@ func RunDeleteCluster(ctx context.Context, f *util.Factory, out io.Writer, optio fmt.Fprintf(out, "\n") - err = resourceops.DeleteResources(cloud, clusterResources) + err = resourceops.DeleteResources(cloud, clusterResources, options.count, options.interval, options.wait) if err != nil { return err } diff --git a/docs/cli/kops_delete_cluster.md b/docs/cli/kops_delete_cluster.md index 25893af73b331..f7d8006c98b8c 100644 --- a/docs/cli/kops_delete_cluster.md +++ b/docs/cli/kops_delete_cluster.md @@ -24,11 +24,14 @@ kops delete cluster [CLUSTER] [flags] ### Options ``` - --external Delete an external cluster - -h, --help help for cluster - --region string External cluster's cloud region - --unregister Don't delete cloud resources, just unregister the cluster - -y, --yes Specify --yes to delete the cluster + --count int Number of consecutive failures to make progress deleting the cluster resources (default 42) + --external Delete an external cluster + -h, --help help for cluster + --interval duration Time in duration to wait between deletion attempts (default 10s) + --region string External cluster's cloud region + --unregister Don't delete cloud resources, just unregister the cluster + --wait duration Amount of time to wait for the cluster resources to de deleted + -y, --yes Specify --yes to delete the cluster ``` ### Options inherited from parent commands diff --git a/pkg/resources/ops/delete.go b/pkg/resources/ops/delete.go index 5abf2f510eb22..f2680110db3f4 100644 --- a/pkg/resources/ops/delete.go +++ b/pkg/resources/ops/delete.go @@ -28,7 +28,7 @@ import ( ) // DeleteResources deletes the resources, as previously collected by ListResources -func DeleteResources(cloud fi.Cloud, resourceMap map[string]*resources.Resource) error { +func DeleteResources(cloud fi.Cloud, resourceMap map[string]*resources.Resource, count int, interval, wait time.Duration) error { depMap := make(map[string][]string) done := make(map[string]*resources.Resource) @@ -52,9 +52,12 @@ func DeleteResources(cloud fi.Cloud, resourceMap map[string]*resources.Resource) klog.V(2).Infof("\t%s\t%v", k, v) } + timeout := time.Now().Add(wait) iterationsWithNoProgress := 0 for { - // TODO: Some form of default ordering based on types? + if wait > 0 && time.Now().After(timeout) { + return fmt.Errorf("wait time exceeded during resources deletion") + } failed := make(map[string]*resources.Resource) @@ -167,10 +170,10 @@ func DeleteResources(cloud fi.Cloud, resourceMap map[string]*resources.Resource) } iterationsWithNoProgress++ - if iterationsWithNoProgress > 42 { + if iterationsWithNoProgress > count && count != 0 { return fmt.Errorf("not making progress deleting resources; giving up") } - time.Sleep(10 * time.Second) + time.Sleep(interval) } }