mirror of https://github.com/k3s-io/k3s
divide statically known typer from dynamically derive restmapper
parent
6fbcbc994f
commit
5432ef5c45
|
@ -46,7 +46,6 @@ type SetLastAppliedOptions struct {
|
||||||
Selector string
|
Selector string
|
||||||
InfoList []*resource.Info
|
InfoList []*resource.Info
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
|
||||||
Namespace string
|
Namespace string
|
||||||
EnforceNamespace bool
|
EnforceNamespace bool
|
||||||
DryRun bool
|
DryRun bool
|
||||||
|
@ -117,7 +116,7 @@ func (o *SetLastAppliedOptions) Complete(f cmdutil.Factory, cmd *cobra.Command)
|
||||||
o.Output = cmdutil.GetFlagString(cmd, "output")
|
o.Output = cmdutil.GetFlagString(cmd, "output")
|
||||||
o.ShortOutput = o.Output == "name"
|
o.ShortOutput = o.Output == "name"
|
||||||
|
|
||||||
o.Mapper, o.Typer = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
o.Namespace, o.EnforceNamespace, err = f.DefaultNamespace()
|
o.Namespace, o.EnforceNamespace, err = f.DefaultNamespace()
|
||||||
|
|
|
@ -16,6 +16,7 @@ go_library(
|
||||||
"//build/visible_to:pkg_kubectl_cmd_auth_CONSUMERS",
|
"//build/visible_to:pkg_kubectl_cmd_auth_CONSUMERS",
|
||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
"//pkg/apis/authorization:go_default_library",
|
"//pkg/apis/authorization:go_default_library",
|
||||||
"//pkg/apis/rbac:go_default_library",
|
"//pkg/apis/rbac:go_default_library",
|
||||||
"//pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion:go_default_library",
|
"//pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion:go_default_library",
|
||||||
|
|
|
@ -127,7 +127,7 @@ func (o *CanIOptions) Complete(f cmdutil.Factory, args []string) error {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
resourceTokens := strings.SplitN(args[1], "/", 2)
|
resourceTokens := strings.SplitN(args[1], "/", 2)
|
||||||
restMapper, _ := f.Object()
|
restMapper := f.RESTMapper()
|
||||||
o.Resource = o.resourceFor(restMapper, resourceTokens[0])
|
o.Resource = o.resourceFor(restMapper, resourceTokens[0])
|
||||||
if len(resourceTokens) > 1 {
|
if len(resourceTokens) > 1 {
|
||||||
o.ResourceName = resourceTokens[1]
|
o.ResourceName = resourceTokens[1]
|
||||||
|
|
|
@ -23,7 +23,6 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
|
@ -68,7 +67,6 @@ type AutoscaleOptions struct {
|
||||||
EnforceNamespace bool
|
EnforceNamespace bool
|
||||||
|
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
|
||||||
ClientForMapping func(mapping *meta.RESTMapping) (resource.RESTClient, error)
|
ClientForMapping func(mapping *meta.RESTMapping) (resource.RESTClient, error)
|
||||||
|
|
||||||
GeneratorFunc func(string, *meta.RESTMapping) (kubectl.StructuredGenerator, error)
|
GeneratorFunc func(string, *meta.RESTMapping) (kubectl.StructuredGenerator, error)
|
||||||
|
@ -133,7 +131,7 @@ func (o *AutoscaleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
|
||||||
o.CreateAnnotation = cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag)
|
o.CreateAnnotation = cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag)
|
||||||
o.Builder = f.NewBuilder()
|
o.Builder = f.NewBuilder()
|
||||||
o.CanBeAutoscaled = f.CanBeAutoscaled
|
o.CanBeAutoscaled = f.CanBeAutoscaled
|
||||||
o.Mapper, o.Typer = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
o.ClientForMapping = f.ClientForMapping
|
o.ClientForMapping = f.ClientForMapping
|
||||||
o.BuilderArgs = args
|
o.BuilderArgs = args
|
||||||
o.RecordFlags.Complete(f.Command(cmd, false))
|
o.RecordFlags.Complete(f.Command(cmd, false))
|
||||||
|
|
|
@ -389,9 +389,10 @@ func RunCreateSubcommand(f cmdutil.Factory, options *CreateSubcommandOptions) er
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
mapper, typer := f.Object()
|
mapper := f.RESTMapper()
|
||||||
if !options.DryRun {
|
if !options.DryRun {
|
||||||
gvks, _, err := typer.ObjectKinds(obj)
|
// create subcommands have compiled knowledge of things they create, so type them directly
|
||||||
|
gvks, _, err := legacyscheme.Scheme.ObjectKinds(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -437,7 +437,7 @@ func TestClusterRoleValidate(t *testing.T) {
|
||||||
|
|
||||||
for name, test := range tests {
|
for name, test := range tests {
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
test.clusterRoleOptions.Mapper, _ = tf.Object()
|
test.clusterRoleOptions.Mapper = tf.RESTMapper()
|
||||||
err := test.clusterRoleOptions.Validate()
|
err := test.clusterRoleOptions.Validate()
|
||||||
if test.expectErr && err == nil {
|
if test.expectErr && err == nil {
|
||||||
t.Errorf("%s: expect error happens, but validate passes.", name)
|
t.Errorf("%s: expect error happens, but validate passes.", name)
|
||||||
|
|
|
@ -205,7 +205,7 @@ func (o *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
|
||||||
o.ResourceNames = resourceNames
|
o.ResourceNames = resourceNames
|
||||||
|
|
||||||
// Complete other options for Run.
|
// Complete other options for Run.
|
||||||
o.Mapper, _ = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
|
|
||||||
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
||||||
o.OutputFormat = cmdutil.GetFlagString(cmd, "output")
|
o.OutputFormat = cmdutil.GetFlagString(cmd, "output")
|
||||||
|
|
|
@ -339,7 +339,7 @@ func TestValidate(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, test := range tests {
|
for name, test := range tests {
|
||||||
test.roleOptions.Mapper, _ = tf.Object()
|
test.roleOptions.Mapper = tf.RESTMapper()
|
||||||
err := test.roleOptions.Validate()
|
err := test.roleOptions.Validate()
|
||||||
if test.expectErr && err == nil {
|
if test.expectErr && err == nil {
|
||||||
t.Errorf("%s: expect error happens but validate passes.", name)
|
t.Errorf("%s: expect error happens but validate passes.", name)
|
||||||
|
|
|
@ -836,7 +836,7 @@ func TestDeletePods(t *testing.T) {
|
||||||
o := DrainOptions{
|
o := DrainOptions{
|
||||||
PrintFlags: printers.NewPrintFlags("drained"),
|
PrintFlags: printers.NewPrintFlags("drained"),
|
||||||
}
|
}
|
||||||
o.mapper, _ = tf.Object()
|
o.mapper = tf.RESTMapper()
|
||||||
o.Out = os.Stdout
|
o.Out = os.Stdout
|
||||||
|
|
||||||
o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {
|
o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {
|
||||||
|
|
|
@ -94,7 +94,7 @@ func (o *ExplainOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error {
|
||||||
o.Recursive = cmdutil.GetFlagBool(cmd, "recursive")
|
o.Recursive = cmdutil.GetFlagBool(cmd, "recursive")
|
||||||
o.ApiVersion = cmdutil.GetFlagString(cmd, "api-version")
|
o.ApiVersion = cmdutil.GetFlagString(cmd, "api-version")
|
||||||
|
|
||||||
o.Mapper, _ = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
o.Schema, err = f.OpenAPISchema()
|
o.Schema, err = f.OpenAPISchema()
|
||||||
|
|
|
@ -96,7 +96,6 @@ type ExposeServiceOptions struct {
|
||||||
|
|
||||||
Namespace string
|
Namespace string
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
|
||||||
|
|
||||||
Builder *resource.Builder
|
Builder *resource.Builder
|
||||||
|
|
||||||
|
@ -188,7 +187,7 @@ func (o *ExposeServiceOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) e
|
||||||
o.MapBasedSelectorForObject = f.MapBasedSelectorForObject
|
o.MapBasedSelectorForObject = f.MapBasedSelectorForObject
|
||||||
o.PortsForObject = f.PortsForObject
|
o.PortsForObject = f.PortsForObject
|
||||||
o.ProtocolsForObject = f.ProtocolsForObject
|
o.ProtocolsForObject = f.ProtocolsForObject
|
||||||
o.Mapper, o.Typer = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
o.LabelsForObject = f.LabelsForObject
|
o.LabelsForObject = f.LabelsForObject
|
||||||
|
|
||||||
o.Namespace, o.EnforceNamespace, err = f.DefaultNamespace()
|
o.Namespace, o.EnforceNamespace, err = f.DefaultNamespace()
|
||||||
|
|
|
@ -19,6 +19,7 @@ go_library(
|
||||||
"//build/visible_to:pkg_kubectl_cmd_rollout_CONSUMERS",
|
"//build/visible_to:pkg_kubectl_cmd_rollout_CONSUMERS",
|
||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
"//pkg/kubectl:go_default_library",
|
"//pkg/kubectl:go_default_library",
|
||||||
"//pkg/kubectl/cmd/set:go_default_library",
|
"//pkg/kubectl/cmd/set:go_default_library",
|
||||||
"//pkg/kubectl/cmd/templates:go_default_library",
|
"//pkg/kubectl/cmd/templates:go_default_library",
|
||||||
|
@ -29,7 +30,6 @@ go_library(
|
||||||
"//vendor/github.com/renstrom/dedent:go_default_library",
|
"//vendor/github.com/renstrom/dedent:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
||||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
|
|
@ -23,7 +23,6 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
|
@ -42,7 +41,6 @@ type PauseConfig struct {
|
||||||
|
|
||||||
Pauser func(info *resource.Info) ([]byte, error)
|
Pauser func(info *resource.Info) ([]byte, error)
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
|
||||||
Infos []*resource.Info
|
Infos []*resource.Info
|
||||||
|
|
||||||
Out io.Writer
|
Out io.Writer
|
||||||
|
@ -101,7 +99,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i
|
||||||
return cmdutil.UsageErrorf(cmd, "%s", cmd.Use)
|
return cmdutil.UsageErrorf(cmd, "%s", cmd.Use)
|
||||||
}
|
}
|
||||||
|
|
||||||
o.Mapper, o.Typer = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
|
|
||||||
o.Pauser = f.Pauser
|
o.Pauser = f.Pauser
|
||||||
o.Out = out
|
o.Out = out
|
||||||
|
|
|
@ -23,7 +23,6 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
|
@ -42,7 +41,6 @@ type ResumeConfig struct {
|
||||||
|
|
||||||
Resumer func(object *resource.Info) ([]byte, error)
|
Resumer func(object *resource.Info) ([]byte, error)
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
|
||||||
Infos []*resource.Info
|
Infos []*resource.Info
|
||||||
|
|
||||||
Out io.Writer
|
Out io.Writer
|
||||||
|
@ -99,7 +97,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out
|
||||||
return cmdutil.UsageErrorf(cmd, "%s", cmd.Use)
|
return cmdutil.UsageErrorf(cmd, "%s", cmd.Use)
|
||||||
}
|
}
|
||||||
|
|
||||||
o.Mapper, o.Typer = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
|
|
||||||
o.Resumer = f.Resumer
|
o.Resumer = f.Resumer
|
||||||
o.Out = out
|
o.Out = out
|
||||||
|
|
|
@ -20,7 +20,6 @@ import (
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
|
@ -39,7 +38,6 @@ type UndoOptions struct {
|
||||||
|
|
||||||
Rollbackers []kubectl.Rollbacker
|
Rollbackers []kubectl.Rollbacker
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
|
||||||
Infos []*resource.Info
|
Infos []*resource.Info
|
||||||
ToRevision int64
|
ToRevision int64
|
||||||
DryRun bool
|
DryRun bool
|
||||||
|
@ -103,7 +101,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io
|
||||||
}
|
}
|
||||||
|
|
||||||
o.ToRevision = cmdutil.GetFlagInt64(cmd, "to-revision")
|
o.ToRevision = cmdutil.GetFlagInt64(cmd, "to-revision")
|
||||||
o.Mapper, o.Typer = f.Object()
|
o.Mapper = f.RESTMapper()
|
||||||
o.Out = out
|
o.Out = out
|
||||||
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
||||||
|
|
||||||
|
|
|
@ -643,8 +643,9 @@ func (o *RunOptions) createGeneratedObject(f cmdutil.Factory, cmd *cobra.Command
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
mapper, typer := f.Object()
|
mapper := f.RESTMapper()
|
||||||
groupVersionKinds, _, err := typer.ObjectKinds(obj)
|
// run has compiled knowledge of the thing is is creating
|
||||||
|
groupVersionKinds, _, err := legacyscheme.Scheme.ObjectKinds(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ func (o *SetSelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, arg
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mapper, _ := f.Object()
|
mapper := f.RESTMapper()
|
||||||
o.mapper = mapper
|
o.mapper = mapper
|
||||||
|
|
||||||
o.resources, o.selector, err = getResourcesAndSelector(args)
|
o.resources, o.selector, err = getResourcesAndSelector(args)
|
||||||
|
|
|
@ -342,7 +342,7 @@ func (f *TestFactory) Command(*cobra.Command, bool) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *TestFactory) NewBuilder() *resource.Builder {
|
func (f *TestFactory) NewBuilder() *resource.Builder {
|
||||||
mapper, _ := f.Object()
|
mapper := f.RESTMapper()
|
||||||
|
|
||||||
return resource.NewBuilder(
|
return resource.NewBuilder(
|
||||||
&resource.Mapper{
|
&resource.Mapper{
|
||||||
|
@ -430,7 +430,7 @@ func (f *TestFactory) ClientSetForVersion(requiredVersion *schema.GroupVersion)
|
||||||
return f.ClientSet()
|
return f.ClientSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *TestFactory) Object() (meta.RESTMapper, runtime.ObjectTyper) {
|
func (f *TestFactory) RESTMapper() meta.RESTMapper {
|
||||||
groupResources := testDynamicResources()
|
groupResources := testDynamicResources()
|
||||||
mapper := discovery.NewRESTMapper(
|
mapper := discovery.NewRESTMapper(
|
||||||
groupResources,
|
groupResources,
|
||||||
|
@ -457,10 +457,9 @@ func (f *TestFactory) Object() (meta.RESTMapper, runtime.ObjectTyper) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: should probably be the external scheme
|
// TODO: should probably be the external scheme
|
||||||
typer := discovery.NewUnstructuredObjectTyper(groupResources, legacyscheme.Scheme)
|
|
||||||
fakeDs := &fakeCachedDiscoveryClient{}
|
fakeDs := &fakeCachedDiscoveryClient{}
|
||||||
expander := cmdutil.NewShortcutExpander(mapper, fakeDs)
|
expander := cmdutil.NewShortcutExpander(mapper, fakeDs)
|
||||||
return expander, typer
|
return expander
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *TestFactory) LogsForObject(object, options runtime.Object, timeout time.Duration) (*restclient.Request, error) {
|
func (f *TestFactory) LogsForObject(object, options runtime.Object, timeout time.Duration) (*restclient.Request, error) {
|
||||||
|
|
|
@ -164,7 +164,7 @@ type ClientAccessFactory interface {
|
||||||
// Generally they provide object typing and functions that build requests based on the negotiated clients.
|
// Generally they provide object typing and functions that build requests based on the negotiated clients.
|
||||||
type ObjectMappingFactory interface {
|
type ObjectMappingFactory interface {
|
||||||
// Returns interfaces for dealing with arbitrary runtime.Objects.
|
// Returns interfaces for dealing with arbitrary runtime.Objects.
|
||||||
Object() (meta.RESTMapper, runtime.ObjectTyper)
|
RESTMapper() meta.RESTMapper
|
||||||
// Returns interface for expanding categories like `all`.
|
// Returns interface for expanding categories like `all`.
|
||||||
CategoryExpander() categories.CategoryExpander
|
CategoryExpander() categories.CategoryExpander
|
||||||
// Returns a RESTClient for working with the specified RESTMapping or an error. This is intended
|
// Returns a RESTClient for working with the specified RESTMapping or an error. This is intended
|
||||||
|
|
|
@ -47,7 +47,7 @@ func NewBuilderFactory(clientAccessFactory ClientAccessFactory, objectMappingFac
|
||||||
// NewBuilder returns a new resource builder for structured api objects.
|
// NewBuilder returns a new resource builder for structured api objects.
|
||||||
func (f *ring2Factory) NewBuilder() *resource.Builder {
|
func (f *ring2Factory) NewBuilder() *resource.Builder {
|
||||||
clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping)
|
clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping)
|
||||||
mapper, _ := f.objectMappingFactory.Object()
|
mapper := f.objectMappingFactory.RESTMapper()
|
||||||
|
|
||||||
unstructuredClientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.UnstructuredClientForMapping)
|
unstructuredClientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.UnstructuredClientForMapping)
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ func (f *ring2Factory) ScaleClient() (scaleclient.ScalesGetter, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
resolver := scaleclient.NewDiscoveryScaleKindResolver(discoClient)
|
resolver := scaleclient.NewDiscoveryScaleKindResolver(discoClient)
|
||||||
mapper, _ := f.objectMappingFactory.Object()
|
mapper := f.objectMappingFactory.RESTMapper()
|
||||||
return scaleclient.New(restClient, mapper, dynamic.LegacyAPIPathResolverFunc, resolver), nil
|
return scaleclient.New(restClient, mapper, dynamic.LegacyAPIPathResolverFunc, resolver), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,34 +76,23 @@ func NewObjectMappingFactory(clientAccessFactory ClientAccessFactory) ObjectMapp
|
||||||
// the built in mapper if necessary. It supports unstructured objects either way, since
|
// the built in mapper if necessary. It supports unstructured objects either way, since
|
||||||
// the underlying Scheme supports Unstructured. The mapper will return converters that can
|
// the underlying Scheme supports Unstructured. The mapper will return converters that can
|
||||||
// convert versioned types to unstructured and back.
|
// convert versioned types to unstructured and back.
|
||||||
func (f *ring1Factory) objectLoader() (meta.RESTMapper, runtime.ObjectTyper, error) {
|
func (f *ring1Factory) restMapper() (meta.RESTMapper, error) {
|
||||||
discoveryClient, err := f.clientAccessFactory.DiscoveryClient()
|
discoveryClient, err := f.clientAccessFactory.DiscoveryClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(3).Infof("Unable to get a discovery client to find server resources, falling back to hardcoded types: %v", err)
|
glog.V(3).Infof("Unable to get a discovery client to find server resources, falling back to hardcoded types: %v", err)
|
||||||
return legacyscheme.Registry.RESTMapper(), legacyscheme.Scheme, nil
|
return legacyscheme.Registry.RESTMapper(), nil
|
||||||
}
|
|
||||||
|
|
||||||
groupResources, err := discovery.GetAPIGroupResources(discoveryClient)
|
|
||||||
if err != nil && !discoveryClient.Fresh() {
|
|
||||||
discoveryClient.Invalidate()
|
|
||||||
groupResources, err = discovery.GetAPIGroupResources(discoveryClient)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
glog.V(3).Infof("Unable to retrieve API resources, falling back to hardcoded types: %v", err)
|
|
||||||
return legacyscheme.Registry.RESTMapper(), legacyscheme.Scheme, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// allow conversion between typed and unstructured objects
|
// allow conversion between typed and unstructured objects
|
||||||
interfaces := meta.InterfacesForUnstructuredConversion(legacyscheme.Registry.InterfacesFor)
|
interfaces := meta.InterfacesForUnstructuredConversion(legacyscheme.Registry.InterfacesFor)
|
||||||
mapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.VersionInterfacesFunc(interfaces))
|
mapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.VersionInterfacesFunc(interfaces))
|
||||||
// TODO: should this also indicate it recognizes typed objects?
|
// TODO: should this also indicate it recognizes typed objects?
|
||||||
typer := discovery.NewUnstructuredObjectTyper(groupResources, legacyscheme.Scheme)
|
|
||||||
expander := NewShortcutExpander(mapper, discoveryClient)
|
expander := NewShortcutExpander(mapper, discoveryClient)
|
||||||
return expander, typer, err
|
return expander, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ring1Factory) Object() (meta.RESTMapper, runtime.ObjectTyper) {
|
func (f *ring1Factory) RESTMapper() meta.RESTMapper {
|
||||||
return meta.NewLazyObjectLoader(f.objectLoader)
|
return meta.NewLazyRESTMapperLoader(f.restMapper)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ring1Factory) CategoryExpander() categories.CategoryExpander {
|
func (f *ring1Factory) CategoryExpander() categories.CategoryExpander {
|
||||||
|
|
|
@ -29,6 +29,7 @@ go_library(
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
@ -55,6 +56,8 @@ go_test(
|
||||||
],
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
|
"//pkg/apis/core/install:go_default_library",
|
||||||
"//pkg/kubectl/categories:go_default_library",
|
"//pkg/kubectl/categories:go_default_library",
|
||||||
"//pkg/kubectl/scheme:go_default_library",
|
"//pkg/kubectl/scheme:go_default_library",
|
||||||
"//vendor/github.com/ghodss/yaml:go_default_library",
|
"//vendor/github.com/ghodss/yaml:go_default_library",
|
||||||
|
|
|
@ -644,6 +644,11 @@ func (b *Builder) mappingFor(resourceOrKindArg string) (*meta.RESTMapping, error
|
||||||
// if we error out here, it is because we could not match a resource or a kind
|
// if we error out here, it is because we could not match a resource or a kind
|
||||||
// for the given argument. To maintain consistency with previous behavior,
|
// for the given argument. To maintain consistency with previous behavior,
|
||||||
// announce that a resource type could not be found.
|
// announce that a resource type could not be found.
|
||||||
|
// if the error is a URL error, then we had trouble doing discovery, so we should return the original
|
||||||
|
// error since it may help a user diagnose what is actually wrong
|
||||||
|
if _, ok := err.(*url.Error); ok {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return nil, fmt.Errorf("the server doesn't have a resource type %q", groupResource.Resource)
|
return nil, fmt.Errorf("the server doesn't have a resource type %q", groupResource.Resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,7 @@ func (i *Info) versioned(convertor runtime.ObjectConvertor) (runtime.Object, err
|
||||||
// AsVersioned returns the object as a Go object in the external form if possible (matching the
|
// AsVersioned returns the object as a Go object in the external form if possible (matching the
|
||||||
// group version kind of the mapping, or i.Object if it cannot be converted.
|
// group version kind of the mapping, or i.Object if it cannot be converted.
|
||||||
// Deprecated this function will be removed once calling code is updated to indicate the correct
|
// Deprecated this function will be removed once calling code is updated to indicate the correct
|
||||||
// negoticatedserializers during contruction of the builder
|
// negoticatedserializers during construction of the builder
|
||||||
func (i *Info) AsVersioned(convertor runtime.ObjectConvertor) runtime.Object {
|
func (i *Info) AsVersioned(convertor runtime.ObjectConvertor) runtime.Object {
|
||||||
if obj, err := i.versioned(convertor); err == nil {
|
if obj, err := i.versioned(convertor); err == nil {
|
||||||
return obj
|
return obj
|
||||||
|
|
|
@ -19,27 +19,25 @@ package meta
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
// lazyObject defers loading the mapper and typer until necessary.
|
// lazyObject defers loading the mapper and typer until necessary.
|
||||||
type lazyObject struct {
|
type lazyObject struct {
|
||||||
loader func() (RESTMapper, runtime.ObjectTyper, error)
|
loader func() (RESTMapper, error)
|
||||||
|
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
loaded bool
|
loaded bool
|
||||||
err error
|
err error
|
||||||
mapper RESTMapper
|
mapper RESTMapper
|
||||||
typer runtime.ObjectTyper
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLazyObjectLoader handles unrecoverable errors when creating a RESTMapper / ObjectTyper by
|
// NewLazyObjectLoader handles unrecoverable errors when creating a RESTMapper / ObjectTyper by
|
||||||
// returning those initialization errors when the interface methods are invoked. This defers the
|
// returning those initialization errors when the interface methods are invoked. This defers the
|
||||||
// initialization and any server calls until a client actually needs to perform the action.
|
// initialization and any server calls until a client actually needs to perform the action.
|
||||||
func NewLazyObjectLoader(fn func() (RESTMapper, runtime.ObjectTyper, error)) (RESTMapper, runtime.ObjectTyper) {
|
func NewLazyRESTMapperLoader(fn func() (RESTMapper, error)) RESTMapper {
|
||||||
obj := &lazyObject{loader: fn}
|
obj := &lazyObject{loader: fn}
|
||||||
return obj, obj
|
return obj
|
||||||
}
|
}
|
||||||
|
|
||||||
// init lazily loads the mapper and typer, returning an error if initialization has failed.
|
// init lazily loads the mapper and typer, returning an error if initialization has failed.
|
||||||
|
@ -49,13 +47,12 @@ func (o *lazyObject) init() error {
|
||||||
if o.loaded {
|
if o.loaded {
|
||||||
return o.err
|
return o.err
|
||||||
}
|
}
|
||||||
o.mapper, o.typer, o.err = o.loader()
|
o.mapper, o.err = o.loader()
|
||||||
o.loaded = true
|
o.loaded = true
|
||||||
return o.err
|
return o.err
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ RESTMapper = &lazyObject{}
|
var _ RESTMapper = &lazyObject{}
|
||||||
var _ runtime.ObjectTyper = &lazyObject{}
|
|
||||||
|
|
||||||
func (o *lazyObject) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) {
|
func (o *lazyObject) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) {
|
||||||
if err := o.init(); err != nil {
|
if err := o.init(); err != nil {
|
||||||
|
@ -105,17 +102,3 @@ func (o *lazyObject) ResourceSingularizer(resource string) (singular string, err
|
||||||
}
|
}
|
||||||
return o.mapper.ResourceSingularizer(resource)
|
return o.mapper.ResourceSingularizer(resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *lazyObject) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) {
|
|
||||||
if err := o.init(); err != nil {
|
|
||||||
return nil, false, err
|
|
||||||
}
|
|
||||||
return o.typer.ObjectKinds(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *lazyObject) Recognizes(gvk schema.GroupVersionKind) bool {
|
|
||||||
if err := o.init(); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return o.typer.Recognizes(gvk)
|
|
||||||
}
|
|
||||||
|
|
|
@ -147,7 +147,7 @@ func TestServerSidePrint(t *testing.T) {
|
||||||
printer := newFakePrinter(printersinternal.AddHandlers)
|
printer := newFakePrinter(printersinternal.AddHandlers)
|
||||||
|
|
||||||
factory := util.NewFactory(clientcmd.NewDefaultClientConfig(*createKubeConfig(s.URL), &clientcmd.ConfigOverrides{}))
|
factory := util.NewFactory(clientcmd.NewDefaultClientConfig(*createKubeConfig(s.URL), &clientcmd.ConfigOverrides{}))
|
||||||
mapper, _ := factory.Object()
|
mapper := factory.RESTMapper()
|
||||||
|
|
||||||
for gvk, apiType := range legacyscheme.Scheme.AllKnownTypes() {
|
for gvk, apiType := range legacyscheme.Scheme.AllKnownTypes() {
|
||||||
// we do not care about internal objects or lists // TODO make sure this is always true
|
// we do not care about internal objects or lists // TODO make sure this is always true
|
||||||
|
|
|
@ -811,7 +811,7 @@ func startRealMasterOrDie(t *testing.T, certDir string) (*allClient, clientv3.KV
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
mapper, _ := util.NewFactory(clientcmd.NewDefaultClientConfig(*clientcmdapi.NewConfig(), &clientcmd.ConfigOverrides{})).Object()
|
mapper := util.NewFactory(clientcmd.NewDefaultClientConfig(*clientcmdapi.NewConfig(), &clientcmd.ConfigOverrides{})).RESTMapper()
|
||||||
|
|
||||||
return client, kvClient, mapper
|
return client, kvClient, mapper
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue