From 1e33e0de8c7e538b62f3c85f1d6058f0a24282b7 Mon Sep 17 00:00:00 2001 From: iwilltry42 Date: Wed, 16 Oct 2019 13:45:22 +0200 Subject: [PATCH] add deleteCluster functionality --- cmd/delete/deleteCluster.go | 64 ++++++++++++++++++++++++++++++------- cmd/get/getCluster.go | 1 + pkg/cluster/cluster.go | 21 ++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) diff --git a/cmd/delete/deleteCluster.go b/cmd/delete/deleteCluster.go index f33d729a..336bba73 100644 --- a/cmd/delete/deleteCluster.go +++ b/cmd/delete/deleteCluster.go @@ -40,19 +40,21 @@ func NewCmdDeleteCluster() *cobra.Command { Long: `Delete a cluster.`, Run: func(cmd *cobra.Command, args []string) { log.Debugln("delete cluster called") - rt, err := cmd.Flags().GetString("runtime") - if err != nil { - log.Debugln("runtime not defined") - } - runtime, err := runtimes.GetRuntime(rt) - if err != nil { - log.Fatalf("Unsupported runtime '%s'", rt) - } - for _, name := range args { - if err := cluster.DeleteCluster(&k3d.Cluster{Name: name}, runtime); err != nil { - log.Errorln(err) + + rt, cs := parseDeleteClusterCmd(cmd, args) + + if len(cs) == 0 { + log.Infoln("No clusters found") + } else { + for _, c := range cs { + if err := cluster.DeleteCluster(c, rt); err != nil { + log.Fatalln(err) + } } } + + log.Debugln("...Finished") + }, } @@ -64,3 +66,43 @@ func NewCmdDeleteCluster() *cobra.Command { // done return cmd } + +// parseDeleteClusterCmd parses the command input into variables required to create a cluster +func parseDeleteClusterCmd(cmd *cobra.Command, args []string) (runtimes.Runtime, []*k3d.Cluster) { + // --runtime + rt, err := cmd.Flags().GetString("runtime") + if err != nil { + log.Fatalln("No runtime specified") + } + runtime, err := runtimes.GetRuntime(rt) + if err != nil { + log.Fatalln(err) + } + + // --all + var clusters []*k3d.Cluster + + if all, err := cmd.Flags().GetBool("all"); err != nil { + log.Fatalln(err) + } else if all { + clusters, err = cluster.GetClusters(runtime) + if err != nil { + log.Fatalln(err) + } + return runtime, clusters + } + + if len(args) < 1 { + log.Fatalln("Expecting at least one cluster name if `--all` is not set") + } + + for _, name := range args { + cluster, err := cluster.GetCluster(&k3d.Cluster{Name: name}, runtime) + if err != nil { + log.Fatalln(err) + } + clusters = append(clusters, cluster) + } + + return runtime, clusters +} diff --git a/cmd/get/getCluster.go b/cmd/get/getCluster.go index 1db40ace..5a975eda 100644 --- a/cmd/get/getCluster.go +++ b/cmd/get/getCluster.go @@ -90,6 +90,7 @@ func parseGetClusterCmd(cmd *cobra.Command, args []string) (*k3d.Cluster, runtim return cluster, runtime } +// TODO: improve (tabular output or output similar to kubectl) func printClusters(clusters []*k3d.Cluster) { for _, cluster := range clusters { fmt.Printf("@@@ Cluster '%s' @@@\n", cluster.Name) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 131da3e5..a1b49604 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -107,6 +107,23 @@ func CreateCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) error { // DeleteCluster deletes an existing cluster func DeleteCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) error { + + log.Infof("Deleting cluster '%s'", cluster.Name) + + failed := 0 + for _, node := range cluster.Nodes { + if err := runtime.DeleteNode(&node); err != nil { + log.Warningf("Failed to delete node '%s': Try to delete it manually", node.Name) + failed++ + continue + } + } + + // TODO: remove network + + if failed > 0 { + return fmt.Errorf("Failed to delete %d nodes: Try to delete them manually", failed) + } return nil } @@ -148,6 +165,10 @@ func GetCluster(cluster *k3d.Cluster, runtime k3drt.Runtime) (*k3d.Cluster, erro log.Errorf("Failed to get nodes for cluster '%s'", cluster.Name) } + if len(nodes) == 0 { + return nil, fmt.Errorf("No nodes found for cluster '%s'", cluster.Name) + } + // append nodes for _, node := range nodes { cluster.Nodes = append(cluster.Nodes, *node)