diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 17bd8c8..f2d779c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,7 @@ jobs: - name: Set up Go 1.x uses: actions/setup-go@v2 with: - go-version: ^1.16 + go-version: ^1.22 - name: Build run: make diff --git a/.gitignore b/.gitignore index e1ce6f3..e580730 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -kubenv-* +kubenv* diff --git a/cmd/delete.go b/cmd/delete.go new file mode 100644 index 0000000..dd2228a --- /dev/null +++ b/cmd/delete.go @@ -0,0 +1,87 @@ +package cmd + +import ( + "fmt" + "slices" + + "github.com/AlecAivazis/survey/v2" + "github.com/manifoldco/promptui" + "github.com/spf13/cobra" + "k8s.io/klog" + + "github.com/mqllr/kubenv/cmd/helpers" + "github.com/mqllr/kubenv/pkg/k8s" +) + +func deleteCmd() *cobra.Command { + return &cobra.Command{ + Use: "delete", + Short: "delete a context", + Aliases: []string{"rm"}, + Run: func(cmd *cobra.Command, args []string) { + deleteContext() + }, + } +} + +func deleteContext() { + k, err := helpers.NewKubeConfig() + if err != nil { + klog.Fatalf("cannot read the kubeconfig file: %s", err) + } + + context, err := k.GetContextByContextName(k.CurrentContext) + if err != nil { + klog.Errorf("cannot retrieve the context %s: %s", k.CurrentContext, err.Error()) + } + + choiceContext := false + err = survey.AskOne(&survey.Confirm{ + Message: fmt.Sprintf("Do you really want to delete context %s ?", k.CurrentContext), + }, &choiceContext) + if err != nil { + klog.Fatal("failed to get context answer") + } + + if !choiceContext { + return + } + + k.Contexts = slices.DeleteFunc(k.Contexts, func(n *k8s.ContextWithName) bool { + return n.Name == k.CurrentContext + }) + + choiceUsers := false + err = survey.AskOne(&survey.Confirm{ + Message: fmt.Sprintf("Do you want to delete user %s ?", context.User), + }, &choiceUsers) + if err != nil { + klog.Fatal("failed to get user answer") + } + + if choiceUsers { + k.Users = slices.DeleteFunc(k.Users, func(n *k8s.UserWithName) bool { + return n.Name == context.User + }) + } + + choiceClusters := false + err = survey.AskOne(&survey.Confirm{ + Message: fmt.Sprintf("Do you want to delete cluster %s ?", context.Cluster), + }, &choiceClusters) + if err != nil { + klog.Fatal("failed to get cluster answer") + } + + if choiceClusters { + k.Clusters = slices.DeleteFunc(k.Clusters, func(n *k8s.ClusterWithName) bool { + return n.Name == context.Cluster + }) + } + + if err := helpers.SaveKubeConfig(k); err != nil { + klog.Fatalf("error when saving config file: %s", err.Error()) + } + + fmt.Printf("%v Config saved!", promptui.IconGood) +} diff --git a/cmd/root.go b/cmd/root.go index d2bd05e..56a6e48 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -52,6 +52,7 @@ func init() { rootCmd.AddCommand(syncCommand()) rootCmd.AddCommand(useContextCmd()) rootCmd.AddCommand(withContextCmd()) + rootCmd.AddCommand(deleteCmd()) // show cmd s := showCmd() diff --git a/go.mod b/go.mod index 85b2f2d..0dadc7a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/mqllr/kubenv -go 1.17 +go 1.22 require ( github.com/AlecAivazis/survey/v2 v2.3.2 diff --git a/pkg/k8s/kubeconfig.go b/pkg/k8s/kubeconfig.go index 1a54822..7573dc7 100644 --- a/pkg/k8s/kubeconfig.go +++ b/pkg/k8s/kubeconfig.go @@ -3,7 +3,6 @@ package k8s import ( "fmt" "io" - "io/ioutil" "os" "os/exec" @@ -32,7 +31,7 @@ func NewKubeConfig() *KubeConfig { // NewKubeConfigFromReader creates a new struct KubeConfig from an io.Reader func NewKubeConfigFromReader(r io.Reader) (*KubeConfig, error) { - content, err := ioutil.ReadAll(r) + content, err := io.ReadAll(r) if err != nil { return nil, fmt.Errorf("Error when reading kubeconfig reader: %s", err) }