refactor factory to support fake openapiv3

This commit is contained in:
Alexander Zielenski 2023-01-23 19:09:43 -08:00
parent 54ec651ab5
commit 81dd9e3d25
4 changed files with 29 additions and 6 deletions

View File

@ -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,

View File

@ -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(

View File

@ -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)
}

View File

@ -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
}