Skip to content

Commit dd11ed8

Browse files
authored
Merge pull request #8989 from superbrothers/fix-nil-pointer-dereference
minikube update-context: Fix nil pointer dereference
2 parents 348b8c9 + bbf96e7 commit dd11ed8

File tree

4 files changed

+175
-12
lines changed

4 files changed

+175
-12
lines changed

go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ require (
7272
github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097
7373
golang.org/x/build v0.0.0-20190927031335-2835ba2e683f
7474
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
75-
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 // indirect
7675
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
7776
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
7877
golang.org/x/sys v0.0.0-20200523222454-059865788121

pkg/minikube/kubeconfig/kubeconfig.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ func UpdateEndpoint(contextName string, hostname string, port int, confpath stri
123123

124124
address := "https://" + hostname + ":" + strconv.Itoa(port)
125125

126-
// if the kubeconfig is missed, create new one
127-
if len(cfg.Clusters) == 0 {
126+
// if the cluster setting is missed in the kubeconfig, create new one
127+
if _, ok := cfg.Clusters[contextName]; !ok {
128128
lp := localpath.Profile(contextName)
129129
gp := localpath.MiniPath()
130130
kcs := &Settings{
@@ -139,8 +139,10 @@ func UpdateEndpoint(contextName string, hostname string, port int, confpath stri
139139
if err != nil {
140140
return false, errors.Wrap(err, "populating kubeconfig")
141141
}
142+
} else {
143+
cfg.Clusters[contextName].Server = address
142144
}
143-
cfg.Clusters[contextName].Server = address
145+
144146
err = writeToFile(cfg, confpath)
145147
if err != nil {
146148
return false, errors.Wrap(err, "write")

pkg/minikube/kubeconfig/kubeconfig_test.go

+92-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"k8s.io/client-go/tools/clientcmd/api"
2727
"k8s.io/minikube/pkg/minikube/constants"
28+
"k8s.io/minikube/pkg/minikube/localpath"
2829

2930
"k8s.io/client-go/tools/clientcmd"
3031
)
@@ -51,6 +52,40 @@ users:
5152
client-key: /home/la-croix/apiserver.key
5253
`)
5354

55+
var kubeConfigWithoutHTTPSUpdated = []byte(`
56+
apiVersion: v1
57+
clusters:
58+
- cluster:
59+
certificate-authority: /home/la-croix/apiserver.crt
60+
server: 192.168.1.1:8080
61+
name: la-croix
62+
- cluster:
63+
certificate-authority: /home/la-croix/.minikube/ca.crt
64+
server: https://192.168.10.100:8080
65+
name: minikube
66+
contexts:
67+
- context:
68+
cluster: la-croix
69+
user: la-croix
70+
name: la-croix
71+
- context:
72+
cluster: minikube
73+
user: minikube
74+
name: minikube
75+
current-context: minikube
76+
kind: Config
77+
preferences: {}
78+
users:
79+
- name: la-croix
80+
user:
81+
client-certificate: /home/la-croix/apiserver.crt
82+
client-key: /home/la-croix/apiserver.key
83+
- name: minikube
84+
user:
85+
client-certificate: /home/la-croix/.minikube/profiles/minikube/client.crt
86+
client-key: /home/la-croix/.minikube/profiles/minikube/client.key
87+
`)
88+
5489
var kubeConfig192 = []byte(`
5590
apiVersion: v1
5691
clusters:
@@ -117,6 +152,37 @@ users:
117152
client-key: /home/la-croix/apiserver.key
118153
`)
119154

155+
var kubeConfigNoClusters = []byte(`
156+
apiVersion: v1
157+
clusters:
158+
contexts:
159+
kind: Config
160+
preferences: {}
161+
users:
162+
`)
163+
164+
var kubeConfigNoClustersUpdated = []byte(`
165+
apiVersion: v1
166+
clusters:
167+
- cluster:
168+
certificate-authority: /home/la-croix/.minikube/ca.crt
169+
server: https://192.168.10.100:8080
170+
name: minikube
171+
contexts:
172+
- context:
173+
cluster: minikube
174+
user: minikube
175+
name: minikube
176+
current-context: minikube
177+
kind: Config
178+
preferences: {}
179+
users:
180+
- name: minikube
181+
user:
182+
client-certificate: /home/la-croix/.minikube/profiles/minikube/client.crt
183+
client-key: /home/la-croix/.minikube/profiles/minikube/client.key
184+
`)
185+
120186
func TestUpdate(t *testing.T) {
121187
setupCfg := &Settings{
122188
ClusterName: "test",
@@ -300,8 +366,8 @@ func TestUpdateIP(t *testing.T) {
300366
hostname: "192.168.10.100",
301367
port: 8080,
302368
existing: kubeConfigWithoutHTTPS,
303-
err: true,
304-
expCfg: kubeConfigWithoutHTTPS,
369+
status: true,
370+
expCfg: kubeConfigWithoutHTTPSUpdated,
305371
},
306372
{
307373
description: "same IP",
@@ -326,8 +392,20 @@ func TestUpdateIP(t *testing.T) {
326392
status: true,
327393
expCfg: kubeConfigLocalhost12345,
328394
},
395+
{
396+
description: "no clusters",
397+
hostname: "192.168.10.100",
398+
port: 8080,
399+
existing: kubeConfigNoClusters,
400+
status: true,
401+
expCfg: kubeConfigNoClustersUpdated,
402+
},
329403
}
404+
405+
os.Setenv(localpath.MinikubeHome, "/home/la-croix")
406+
330407
for _, test := range tests {
408+
test := test
331409
t.Run(test.description, func(t *testing.T) {
332410
t.Parallel()
333411
configFilename := tempFile(t, test.existing)
@@ -342,6 +420,18 @@ func TestUpdateIP(t *testing.T) {
342420
if test.status != statusActual {
343421
t.Errorf("Expected status %t, but got %t", test.status, statusActual)
344422
}
423+
424+
actual, err := readOrNew(configFilename)
425+
if err != nil {
426+
t.Fatal(err)
427+
}
428+
expected, err := decode(test.expCfg)
429+
if err != nil {
430+
t.Fatal(err)
431+
}
432+
if !configEquals(actual, expected) {
433+
t.Fatal("configs did not match")
434+
}
345435
})
346436

347437
}

test/integration/functional_test.go

+78-6
Original file line numberDiff line numberDiff line change
@@ -1007,14 +1007,86 @@ func validateCertSync(ctx context.Context, t *testing.T, profile string) {
10071007
func validateUpdateContextCmd(ctx context.Context, t *testing.T, profile string) {
10081008
defer PostMortemLogs(t, profile)
10091009

1010-
rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "update-context", "--alsologtostderr", "-v=2"))
1011-
if err != nil {
1012-
t.Errorf("failed to run minikube update-context: args %q: %v", rr.Command(), err)
1010+
tests := []struct {
1011+
name string
1012+
kubeconfig []byte
1013+
want []byte
1014+
}{
1015+
{
1016+
name: "no changes",
1017+
kubeconfig: nil,
1018+
want: []byte("No changes"),
1019+
},
1020+
{
1021+
name: "no minikube cluster",
1022+
kubeconfig: []byte(`
1023+
apiVersion: v1
1024+
clusters:
1025+
- cluster:
1026+
certificate-authority: /home/la-croix/apiserver.crt
1027+
server: 192.168.1.1:8080
1028+
name: la-croix
1029+
contexts:
1030+
- context:
1031+
cluster: la-croix
1032+
user: la-croix
1033+
name: la-croix
1034+
current-context: la-croix
1035+
kind: Config
1036+
preferences: {}
1037+
users:
1038+
- name: la-croix
1039+
user:
1040+
client-certificate: /home/la-croix/apiserver.crt
1041+
client-key: /home/la-croix/apiserver.key
1042+
`),
1043+
want: []byte("context has been updated"),
1044+
},
1045+
{
1046+
name: "no clusters",
1047+
kubeconfig: []byte(`
1048+
apiVersion: v1
1049+
clusters:
1050+
contexts:
1051+
kind: Config
1052+
preferences: {}
1053+
users:
1054+
`),
1055+
want: []byte("context has been updated"),
1056+
},
10131057
}
10141058

1015-
want := []byte("No changes")
1016-
if !bytes.Contains(rr.Stdout.Bytes(), want) {
1017-
t.Errorf("update-context: got=%q, want=*%q*", rr.Stdout.Bytes(), want)
1059+
for _, tc := range tests {
1060+
tc := tc
1061+
t.Run(tc.name, func(t *testing.T) {
1062+
t.Parallel()
1063+
c := exec.CommandContext(ctx, Target(), "-p", profile, "update-context", "--alsologtostderr", "-v=2")
1064+
if tc.kubeconfig != nil {
1065+
tf, err := ioutil.TempFile("", "kubeconfig")
1066+
if err != nil {
1067+
t.Fatal(err)
1068+
}
1069+
1070+
if err := ioutil.WriteFile(tf.Name(), tc.kubeconfig, 0644); err != nil {
1071+
t.Fatal(err)
1072+
}
1073+
1074+
t.Cleanup(func() {
1075+
os.Remove(tf.Name())
1076+
})
1077+
1078+
c.Env = append(os.Environ(), fmt.Sprintf("KUBECONFIG=%s", tf.Name()))
1079+
}
1080+
1081+
rr, err := Run(t, c)
1082+
if err != nil {
1083+
t.Errorf("failed to run minikube update-context: args %q: %v", rr.Command(), err)
1084+
}
1085+
1086+
if !bytes.Contains(rr.Stdout.Bytes(), tc.want) {
1087+
t.Errorf("update-context: got=%q, want=*%q*", rr.Stdout.Bytes(), tc.want)
1088+
}
1089+
})
10181090
}
10191091
}
10201092

0 commit comments

Comments
 (0)