diff --git a/go.mod b/go.mod index 246ac3c2..b3c82dec 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 google.golang.org/protobuf v1.27.1 - k8s.io/api v0.0.0-20220614194928-60387f6ceb7c + k8s.io/api v0.0.0-20220614194929-edebc6706dde k8s.io/apimachinery v0.0.0-20220614194717-c5be38573c73 k8s.io/klog/v2 v2.60.1 k8s.io/kube-openapi v0.0.0-20220603121420-31174f50af60 @@ -63,6 +63,6 @@ require ( ) replace ( - k8s.io/api => k8s.io/api v0.0.0-20220614194928-60387f6ceb7c + k8s.io/api => k8s.io/api v0.0.0-20220614194929-edebc6706dde k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20220614194717-c5be38573c73 ) diff --git a/go.sum b/go.sum index a40c3696..3cce31df 100644 --- a/go.sum +++ b/go.sum @@ -513,8 +513,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.0.0-20220614194928-60387f6ceb7c h1:DC+Zvr6/68fhuaIy5pTL0W4bAhbrnZi4jxozgPQ6vp0= -k8s.io/api v0.0.0-20220614194928-60387f6ceb7c/go.mod h1:GLhFhgtyTRwgH456jroUFHnl0QFlRJ7RFJ41U7TgOZc= +k8s.io/api v0.0.0-20220614194929-edebc6706dde h1:uI3Bauw5zHxpzCFMum9XlALU5iK37yEiAZgKdVUQHGA= +k8s.io/api v0.0.0-20220614194929-edebc6706dde/go.mod h1:GLhFhgtyTRwgH456jroUFHnl0QFlRJ7RFJ41U7TgOZc= k8s.io/apimachinery v0.0.0-20220614194717-c5be38573c73 h1:EBei3PXKAoJZbqTqFYcQVh/wJcgXA/X1w7m8tBDyi3s= k8s.io/apimachinery v0.0.0-20220614194717-c5be38573c73/go.mod h1:iknpugsBdD8jeaGNZyi85Q334Mj3GFqi1SEHEEB/KQM= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= diff --git a/tools/clientcmd/validation.go b/tools/clientcmd/validation.go index 2ae1eb70..088972ef 100644 --- a/tools/clientcmd/validation.go +++ b/tools/clientcmd/validation.go @@ -204,8 +204,19 @@ func ConfirmUsable(config clientcmdapi.Config, passedContextName string) error { if exists { validationErrors = append(validationErrors, validateContext(contextName, *context, config)...) - validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *config.AuthInfos[context.AuthInfo])...) - validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *config.Clusters[context.Cluster])...) + + // Default to empty users and clusters and let the validation function report an error. + authInfo := config.AuthInfos[context.AuthInfo] + if authInfo == nil { + authInfo = &clientcmdapi.AuthInfo{} + } + validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *authInfo)...) + + cluster := config.Clusters[context.Cluster] + if cluster == nil { + cluster = &clientcmdapi.Cluster{} + } + validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *cluster)...) } return newErrConfigurationInvalid(validationErrors) diff --git a/tools/clientcmd/validation_test.go b/tools/clientcmd/validation_test.go index bf72c6c0..f0065e3c 100644 --- a/tools/clientcmd/validation_test.go +++ b/tools/clientcmd/validation_test.go @@ -65,6 +65,42 @@ func TestConfirmUsableBadInfoButOkConfig(t *testing.T) { badValidation.testConfig(t) } +func TestConfirmUsableMissingObjects(t *testing.T) { + config := clientcmdapi.NewConfig() + config.Clusters["kind-cluster"] = &clientcmdapi.Cluster{ + Server: "anything", + } + config.AuthInfos["kind-user"] = &clientcmdapi.AuthInfo{ + Token: "any-value", + } + config.Contexts["missing-user"] = &clientcmdapi.Context{ + Cluster: "kind-cluster", + AuthInfo: "garbage", + } + config.Contexts["missing-cluster"] = &clientcmdapi.Context{ + Cluster: "garbage", + AuthInfo: "kind-user", + } + + missingUser := configValidationTest{ + config: config, + expectedErrorSubstring: []string{ + `user "garbage" was not found for context "missing-user"`, + }, + } + missingUser.testConfirmUsable("missing-user", t) + missingUser.testConfig(t) + + missingCluster := configValidationTest{ + config: config, + expectedErrorSubstring: []string{ + `cluster "garbage" was not found for context "missing-cluster"`, + }, + } + missingCluster.testConfirmUsable("missing-cluster", t) + missingCluster.testConfig(t) +} + func TestConfirmUsableBadInfoConfig(t *testing.T) { config := clientcmdapi.NewConfig() config.Clusters["missing ca"] = &clientcmdapi.Cluster{