diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/explain/explain.go b/staging/src/k8s.io/kubectl/pkg/cmd/explain/explain.go index f5c4a0af63d..d7705f536f2 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/explain/explain.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/explain/explain.go @@ -24,7 +24,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/client-go/discovery" + openapiclient "k8s.io/client-go/openapi" cmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/explain" explainv2 "k8s.io/kubectl/pkg/explain/v2" @@ -74,7 +74,7 @@ type ExplainOptions struct { OutputFormat string // Client capable of fetching openapi documents from the user's cluster - DiscoveryClient discovery.DiscoveryInterface + OpenAPIV3Client openapiclient.Client } func NewExplainOptions(parent string, streams genericclioptions.IOStreams) *ExplainOptions { @@ -125,13 +125,12 @@ func (o *ExplainOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] return err } - // Only openapi v3 needs the discovery client. + // Only openapi v3 needs the openapiv3client if o.EnableOpenAPIV3 { - discoveryClient, err := f.ToDiscoveryClient() + o.OpenAPIV3Client, err = f.OpenAPIV3Client() if err != nil { return err } - o.DiscoveryClient = discoveryClient } o.args = args @@ -176,7 +175,7 @@ func (o *ExplainOptions) Run() error { return explainv2.PrintModelDescription( fieldsPath, o.Out, - o.DiscoveryClient.OpenAPIV3(), + o.OpenAPIV3Client, fullySpecifiedGVR, recursive, o.OutputFormat, diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go b/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go index a8becec8178..df6fff8f5f0 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go @@ -38,6 +38,8 @@ import ( "k8s.io/client-go/dynamic" fakedynamic "k8s.io/client-go/dynamic/fake" "k8s.io/client-go/kubernetes" + openapiclient "k8s.io/client-go/openapi" + "k8s.io/client-go/openapi/openapitest" restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" "k8s.io/client-go/restmapper" @@ -418,6 +420,7 @@ type TestFactory struct { UnstructuredClientForMappingFunc resource.FakeClientFunc OpenAPISchemaFunc func() (openapi.Resources, error) + OpenAPIV3ClientFunc func() (openapiclient.Client, error) } // NewTestFactory returns an initialized TestFactory instance @@ -533,6 +536,13 @@ func (f *TestFactory) OpenAPISchema() (openapi.Resources, error) { return openapitesting.EmptyResources{}, nil } +func (f *TestFactory) OpenAPIV3Client() (openapiclient.Client, error) { + if f.OpenAPIV3ClientFunc != nil { + return f.OpenAPIV3ClientFunc() + } + return openapitest.NewFakeClient(), nil +} + // NewBuilder returns an initialized resource.Builder instance func (f *TestFactory) NewBuilder() *resource.Builder { return resource.NewFakeBuilder( diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/util/factory.go b/staging/src/k8s.io/kubectl/pkg/cmd/util/factory.go index e06060a3e80..cd806d620a1 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/util/factory.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/util/factory.go @@ -22,6 +22,7 @@ import ( "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" + openapiclient "k8s.io/client-go/openapi" restclient "k8s.io/client-go/rest" "k8s.io/kubectl/pkg/util/openapi" "k8s.io/kubectl/pkg/validation" @@ -63,4 +64,7 @@ type Factory interface { Validator(validationDirective string) (validation.Schema, error) // OpenAPISchema returns the parsed openapi schema definition OpenAPISchema() (openapi.Resources, error) + // OpenAPIV3Schema returns a client for fetching parsed schemas for + // any group version + OpenAPIV3Client() (openapiclient.Client, error) } diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go b/staging/src/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go index cf908402954..3943fc30f24 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go +++ b/staging/src/k8s.io/kubectl/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" + openapiclient "k8s.io/client-go/openapi" "k8s.io/client-go/openapi/cached" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -211,3 +212,12 @@ func (f *factoryImpl) openAPIGetter() discovery.OpenAPISchemaInterface { return f.oapi } + +func (f *factoryImpl) OpenAPIV3Client() (openapiclient.Client, error) { + discovery, err := f.clientGetter.ToDiscoveryClient() + if err != nil { + return nil, err + } + + return discovery.OpenAPIV3(), nil +}