diff --git a/pkg/cmd/util/factory_client_access.go b/pkg/cmd/util/factory_client_access.go index 4340c03ee..cf9084029 100644 --- a/pkg/cmd/util/factory_client_access.go +++ b/pkg/cmd/util/factory_client_access.go @@ -30,6 +30,7 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/openapi/cached" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/kubectl/pkg/util/openapi" @@ -167,8 +168,18 @@ func (f *factoryImpl) Validator(validationDirective string) (validation.Schema, return nil, err } // Create the FieldValidationVerifier for use in the ParamVerifyingSchema. - verifier := resource.NewQueryParamVerifier(dynamicClient, f.openAPIGetter(), resource.QueryParamFieldValidation) - return validation.NewParamVerifyingSchema(schema, verifier, string(validationDirective)), nil + discoveryClient, err := f.ToDiscoveryClient() + if err != nil { + return nil, err + } + // Memory-cache the OpenAPI V3 responses. The disk cache behavior is determined by + // the discovery client. + oapiV3Client := cached.NewClient(discoveryClient.OpenAPIV3()) + queryParam := resource.QueryParamFieldValidation + primary := resource.NewQueryParamVerifierV3(dynamicClient, oapiV3Client, queryParam) + secondary := resource.NewQueryParamVerifier(dynamicClient, f.openAPIGetter(), queryParam) + fallback := resource.NewFallbackQueryParamVerifier(primary, secondary) + return validation.NewParamVerifyingSchema(schema, fallback, string(validationDirective)), nil } // OpenAPISchema returns metadata and structural information about