mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-10 04:27:54 +00:00
move Describer from factory
This commit is contained in:
parent
b143093a62
commit
cf29a30258
@ -137,7 +137,10 @@ func (o *DescribeOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [
|
|||||||
|
|
||||||
o.BuilderArgs = args
|
o.BuilderArgs = args
|
||||||
|
|
||||||
o.Describer = f.Describer
|
o.Describer = func(mapping *meta.RESTMapping) (printers.Describer, error) {
|
||||||
|
return cmdutil.DescriberFn(f, mapping)
|
||||||
|
}
|
||||||
|
|
||||||
o.NewBuilder = f.NewBuilder
|
o.NewBuilder = f.NewBuilder
|
||||||
|
|
||||||
// include the uninitialized objects by default
|
// include the uninitialized objects by default
|
||||||
|
@ -271,10 +271,17 @@ func NewTestFactory() *TestFactory {
|
|||||||
WithClientConfig(clientConfig).
|
WithClientConfig(clientConfig).
|
||||||
WithRESTMapper(testRESTMapper())
|
WithRESTMapper(testRESTMapper())
|
||||||
|
|
||||||
|
restConfig, err := clientConfig.ClientConfig()
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("unable to create a fake restclient config: %v", err))
|
||||||
|
}
|
||||||
|
|
||||||
return &TestFactory{
|
return &TestFactory{
|
||||||
Factory: cmdutil.NewFactory(configFlags),
|
Factory: cmdutil.NewFactory(configFlags),
|
||||||
FakeDynamicClient: fakedynamic.NewSimpleDynamicClient(legacyscheme.Scheme),
|
FakeDynamicClient: fakedynamic.NewSimpleDynamicClient(legacyscheme.Scheme),
|
||||||
tempConfigFile: tmpFile,
|
tempConfigFile: tmpFile,
|
||||||
|
|
||||||
|
ClientConfigVal: restConfig,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/validation"
|
"k8s.io/kubernetes/pkg/kubectl/validation"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Factory provides abstractions that allow the Kubectl command to be extended across multiple types
|
// Factory provides abstractions that allow the Kubectl command to be extended across multiple types
|
||||||
@ -102,8 +101,6 @@ type ObjectMappingFactory interface {
|
|||||||
ClientForMapping(mapping *meta.RESTMapping) (resource.RESTClient, error)
|
ClientForMapping(mapping *meta.RESTMapping) (resource.RESTClient, error)
|
||||||
// Returns a RESTClient for working with Unstructured objects.
|
// Returns a RESTClient for working with Unstructured objects.
|
||||||
UnstructuredClientForMapping(mapping *meta.RESTMapping) (resource.RESTClient, error)
|
UnstructuredClientForMapping(mapping *meta.RESTMapping) (resource.RESTClient, error)
|
||||||
// Returns a Describer for displaying the specified RESTMapping type or an error.
|
|
||||||
Describer(mapping *meta.RESTMapping) (printers.Describer, error)
|
|
||||||
|
|
||||||
// Returns a schema that can validate objects stored on disk.
|
// Returns a schema that can validate objects stored on disk.
|
||||||
Validator(validate bool) (validation.Schema, error)
|
Validator(validate bool) (validation.Schema, error)
|
||||||
|
@ -19,19 +19,15 @@ limitations under the License.
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/client-go/dynamic"
|
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi"
|
||||||
openapivalidation "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation"
|
openapivalidation "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/validation"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/validation"
|
"k8s.io/kubernetes/pkg/kubectl/validation"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ring1Factory struct {
|
type ring1Factory struct {
|
||||||
@ -91,46 +87,6 @@ func (f *ring1Factory) UnstructuredClientForMapping(mapping *meta.RESTMapping) (
|
|||||||
return restclient.RESTClientFor(cfg)
|
return restclient.RESTClientFor(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ring1Factory) Describer(mapping *meta.RESTMapping) (printers.Describer, error) {
|
|
||||||
clientConfig, err := f.clientAccessFactory.ToRESTConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// try to get a describer
|
|
||||||
if describer, ok := printersinternal.DescriberFor(mapping.GroupVersionKind.GroupKind(), clientConfig); ok {
|
|
||||||
return describer, nil
|
|
||||||
}
|
|
||||||
// if this is a kind we don't have a describer for yet, go generic if possible
|
|
||||||
if genericDescriber, genericErr := genericDescriber(f.clientAccessFactory, mapping); genericErr == nil {
|
|
||||||
return genericDescriber, nil
|
|
||||||
}
|
|
||||||
// otherwise return an unregistered error
|
|
||||||
return nil, fmt.Errorf("no description has been implemented for %s", mapping.GroupVersionKind.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
// helper function to make a generic describer, or return an error
|
|
||||||
func genericDescriber(clientAccessFactory ClientAccessFactory, mapping *meta.RESTMapping) (printers.Describer, error) {
|
|
||||||
clientConfig, err := clientAccessFactory.ToRESTConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// used to fetch the resource
|
|
||||||
dynamicClient, err := dynamic.NewForConfig(clientConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// used to get events for the resource
|
|
||||||
clientSet, err := clientAccessFactory.ClientSet()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
eventsClient := clientSet.Core()
|
|
||||||
|
|
||||||
return printersinternal.GenericDescriberFor(mapping, dynamicClient, eventsClient), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *ring1Factory) Validator(validate bool) (validation.Schema, error) {
|
func (f *ring1Factory) Validator(validate bool) (validation.Schema, error) {
|
||||||
if !validate {
|
if !validate {
|
||||||
return validation.NullSchema{}, nil
|
return validation.NullSchema{}, nil
|
||||||
|
@ -37,9 +37,14 @@ import (
|
|||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/yaml"
|
"k8s.io/apimachinery/pkg/util/yaml"
|
||||||
|
"k8s.io/client-go/dynamic"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
|
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
|
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||||
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
utilexec "k8s.io/utils/exec"
|
utilexec "k8s.io/utils/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -621,3 +626,50 @@ func ShouldIncludeUninitialized(cmd *cobra.Command, includeUninitialized bool) b
|
|||||||
}
|
}
|
||||||
return shouldIncludeUninitialized
|
return shouldIncludeUninitialized
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DescriberFunc gives a way to display the specified RESTMapping type
|
||||||
|
type DescriberFunc func(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error)
|
||||||
|
|
||||||
|
// DescriberFn gives a way to easily override the function for unit testing if needed
|
||||||
|
var DescriberFn DescriberFunc = describer
|
||||||
|
|
||||||
|
// Returns a Describer for displaying the specified RESTMapping type or an error.
|
||||||
|
func describer(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) {
|
||||||
|
clientConfig, err := restClientGetter.ToRESTConfig()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// try to get a describer
|
||||||
|
if describer, ok := printersinternal.DescriberFor(mapping.GroupVersionKind.GroupKind(), clientConfig); ok {
|
||||||
|
return describer, nil
|
||||||
|
}
|
||||||
|
// if this is a kind we don't have a describer for yet, go generic if possible
|
||||||
|
if genericDescriber, genericErr := genericDescriber(restClientGetter, mapping); genericErr == nil {
|
||||||
|
return genericDescriber, nil
|
||||||
|
}
|
||||||
|
// otherwise return an unregistered error
|
||||||
|
return nil, fmt.Errorf("no description has been implemented for %s", mapping.GroupVersionKind.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper function to make a generic describer, or return an error
|
||||||
|
func genericDescriber(restClientGetter genericclioptions.RESTClientGetter, mapping *meta.RESTMapping) (printers.Describer, error) {
|
||||||
|
clientConfig, err := restClientGetter.ToRESTConfig()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// used to fetch the resource
|
||||||
|
dynamicClient, err := dynamic.NewForConfig(clientConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// used to get events for the resource
|
||||||
|
clientSet, err := internalclientset.NewForConfig(clientConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
eventsClient := clientSet.Core()
|
||||||
|
return printersinternal.GenericDescriberFor(mapping, dynamicClient, eventsClient), nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user