Skip to content

Commit 349efaa

Browse files
authored
Merge pull request kubernetes#110436 from nicks/nicks/issue-1108
client-go: fix panic in ConfirmUsable validation
2 parents 2b51b25 + 7d2c609 commit 349efaa

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

staging/src/k8s.io/client-go/tools/clientcmd/validation.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,19 @@ func ConfirmUsable(config clientcmdapi.Config, passedContextName string) error {
204204

205205
if exists {
206206
validationErrors = append(validationErrors, validateContext(contextName, *context, config)...)
207-
validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *config.AuthInfos[context.AuthInfo])...)
208-
validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *config.Clusters[context.Cluster])...)
207+
208+
// Default to empty users and clusters and let the validation function report an error.
209+
authInfo := config.AuthInfos[context.AuthInfo]
210+
if authInfo == nil {
211+
authInfo = &clientcmdapi.AuthInfo{}
212+
}
213+
validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *authInfo)...)
214+
215+
cluster := config.Clusters[context.Cluster]
216+
if cluster == nil {
217+
cluster = &clientcmdapi.Cluster{}
218+
}
219+
validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *cluster)...)
209220
}
210221

211222
return newErrConfigurationInvalid(validationErrors)

staging/src/k8s.io/client-go/tools/clientcmd/validation_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,42 @@ func TestConfirmUsableBadInfoButOkConfig(t *testing.T) {
6565
badValidation.testConfig(t)
6666
}
6767

68+
func TestConfirmUsableMissingObjects(t *testing.T) {
69+
config := clientcmdapi.NewConfig()
70+
config.Clusters["kind-cluster"] = &clientcmdapi.Cluster{
71+
Server: "anything",
72+
}
73+
config.AuthInfos["kind-user"] = &clientcmdapi.AuthInfo{
74+
Token: "any-value",
75+
}
76+
config.Contexts["missing-user"] = &clientcmdapi.Context{
77+
Cluster: "kind-cluster",
78+
AuthInfo: "garbage",
79+
}
80+
config.Contexts["missing-cluster"] = &clientcmdapi.Context{
81+
Cluster: "garbage",
82+
AuthInfo: "kind-user",
83+
}
84+
85+
missingUser := configValidationTest{
86+
config: config,
87+
expectedErrorSubstring: []string{
88+
`user "garbage" was not found for context "missing-user"`,
89+
},
90+
}
91+
missingUser.testConfirmUsable("missing-user", t)
92+
missingUser.testConfig(t)
93+
94+
missingCluster := configValidationTest{
95+
config: config,
96+
expectedErrorSubstring: []string{
97+
`cluster "garbage" was not found for context "missing-cluster"`,
98+
},
99+
}
100+
missingCluster.testConfirmUsable("missing-cluster", t)
101+
missingCluster.testConfig(t)
102+
}
103+
68104
func TestConfirmUsableBadInfoConfig(t *testing.T) {
69105
config := clientcmdapi.NewConfig()
70106
config.Clusters["missing ca"] = &clientcmdapi.Cluster{

0 commit comments

Comments
 (0)