diff options
| author | Irbe Krumina <irbe@tailscale.com> | 2024-03-14 19:47:20 +0000 |
|---|---|---|
| committer | Irbe Krumina <irbe@tailscale.com> | 2024-03-21 14:50:50 +0100 |
| commit | 10ce099e60f326be18978591e6ef03e44741377c (patch) | |
| tree | bfdb14dc41833d979a8b1c38ccbb7e6c97a0173b | |
| parent | 8a0c69d6d6ac566a777e51d357a40a8e2960d30a (diff) | |
| download | tailscale-irbekrm/cherry_fix_panic.tar.xz tailscale-irbekrm/cherry_fix_panic.zip | |
cmd/tailscale/cli: fix configuring partially empty kubeconfigirbekrm/cherry_fix_panic
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 <irbe@tailscale.com>
(cherry picked from commit 56f7a09931e5c8d538913ffde570b7d6e0ae753e)
| -rw-r--r-- | cmd/tailscale/cli/configure-kube.go | 6 | ||||
| -rw-r--r-- | 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 @@ -53,6 +53,31 @@ users: 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`, + }, + { name: "already-configured", in: `apiVersion: v1 clusters: |
