From 10ce099e60f326be18978591e6ef03e44741377c Mon Sep 17 00:00:00 2001 From: Irbe Krumina Date: Thu, 14 Mar 2024 19:47:20 +0000 Subject: [PATCH] cmd/tailscale/cli: fix configuring partially empty kubeconfig When a user deletes the last cluster/user/context from their kubeconfig via 'kubectl delete-[cluster|user|context] command, kubectx sets the relevant field in kubeconfig to 'null'. This was breaking our conversion logic that was assuming that the field is either non-existant or is an array. Updates tailscale/corp#18320 Signed-off-by: Irbe Krumina (cherry picked from commit 56f7a09931e5c8d538913ffde570b7d6e0ae753e) --- cmd/tailscale/cli/configure-kube.go | 6 +++--- cmd/tailscale/cli/configure-kube_test.go | 25 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/cmd/tailscale/cli/configure-kube.go b/cmd/tailscale/cli/configure-kube.go index 1231991de..dcda2f030 100644 --- a/cmd/tailscale/cli/configure-kube.go +++ b/cmd/tailscale/cli/configure-kube.go @@ -119,7 +119,7 @@ func updateKubeconfig(cfgYaml []byte, fqdn string) ([]byte, error) { var clusters []any if cm, ok := cfg["clusters"]; ok { - clusters = cm.([]any) + clusters, _ = cm.([]any) } cfg["clusters"] = appendOrSetNamed(clusters, fqdn, map[string]any{ "name": fqdn, @@ -130,7 +130,7 @@ func updateKubeconfig(cfgYaml []byte, fqdn string) ([]byte, error) { var users []any if um, ok := cfg["users"]; ok { - users = um.([]any) + users, _ = um.([]any) } cfg["users"] = appendOrSetNamed(users, "tailscale-auth", map[string]any{ // We just need one of these, and can reuse it for all clusters. @@ -144,7 +144,7 @@ func updateKubeconfig(cfgYaml []byte, fqdn string) ([]byte, error) { var contexts []any if cm, ok := cfg["contexts"]; ok { - contexts = cm.([]any) + contexts, _ = cm.([]any) } cfg["contexts"] = appendOrSetNamed(contexts, fqdn, map[string]any{ "name": fqdn, diff --git a/cmd/tailscale/cli/configure-kube_test.go b/cmd/tailscale/cli/configure-kube_test.go index 0f326cd64..d71a9b627 100644 --- a/cmd/tailscale/cli/configure-kube_test.go +++ b/cmd/tailscale/cli/configure-kube_test.go @@ -48,6 +48,31 @@ contexts: current-context: foo.tail-scale.ts.net kind: Config users: +- name: tailscale-auth + user: + token: unused`, + }, + { + name: "all configs, clusters, users have been deleted", + in: `apiVersion: v1 +clusters: null +contexts: null +kind: Config +current-context: some-non-existent-cluster +users: null`, + want: `apiVersion: v1 +clusters: +- cluster: + server: https://foo.tail-scale.ts.net + name: foo.tail-scale.ts.net +contexts: +- context: + cluster: foo.tail-scale.ts.net + user: tailscale-auth + name: foo.tail-scale.ts.net +current-context: foo.tail-scale.ts.net +kind: Config +users: - name: tailscale-auth user: token: unused`,