summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIrbe Krumina <irbe@tailscale.com>2024-03-14 19:47:20 +0000
committerIrbe Krumina <irbe@tailscale.com>2024-03-21 14:50:50 +0100
commit10ce099e60f326be18978591e6ef03e44741377c (patch)
treebfdb14dc41833d979a8b1c38ccbb7e6c97a0173b
parent8a0c69d6d6ac566a777e51d357a40a8e2960d30a (diff)
downloadtailscale-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.go6
-rw-r--r--cmd/tailscale/cli/configure-kube_test.go25
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: