diff --git a/pkg/kubectl/cmd/annotate.go b/pkg/kubectl/cmd/annotate.go index ce6bfa9ed4f..d53b50144a3 100644 --- a/pkg/kubectl/cmd/annotate.go +++ b/pkg/kubectl/cmd/annotate.go @@ -189,23 +189,31 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro changeCause := f.Command(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) - - var b *resource.Builder - if o.local { - b = f.NewBuilder(). - Local(f.ClientForMapping) - } else { - b = f.NewUnstructuredBuilder(). - LabelSelectorParam(o.selector). - ResourceTypeOrNameArgs(o.all, o.resources...). - Latest() - } - r := b.ContinueOnError(). + b := f.NewBuilder(). + ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). IncludeUninitialized(includeUninitialized). - Flatten(). - Do() + Flatten() + + if !o.local { + // call this method here, as it requires an api call + // and will cause the command to fail when there is + // no connection to a server + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + + b = b.LabelSelectorParam(o.selector). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). + ResourceTypeOrNameArgs(o.all, o.resources...). + Latest() + } else { + b = b.Local(f.ClientForMapping) + } + + r := b.Do() if err := r.Err(); err != nil { return err } diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index b877889e0e9..a1ab8e6f5a5 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -198,7 +198,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti return err } - mapper, _, err := f.UnstructuredObject() + mapper, typer, err := f.UnstructuredObject() if err != nil { return err } @@ -213,7 +213,8 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti // include the uninitialized objects by default if --prune is true // unless explicitly set --include-uninitialized=false includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, options.Prune) - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/apply_set_last_applied.go b/pkg/kubectl/cmd/apply_set_last_applied.go index 4cdeb22fa2f..58328dea83d 100644 --- a/pkg/kubectl/cmd/apply_set_last_applied.go +++ b/pkg/kubectl/cmd/apply_set_last_applied.go @@ -122,13 +122,19 @@ func (o *SetLastAppliedOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) } func (o *SetLastAppliedOptions) Validate(f cmdutil.Factory, cmd *cobra.Command) error { - r := f.NewUnstructuredBuilder(). + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(o.Namespace).DefaultNamespace(). FilenameParam(o.EnforceNamespace, &o.FilenameOptions). Latest(). Flatten(). Do() - err := r.Err() + err = r.Err() if err != nil { return err } diff --git a/pkg/kubectl/cmd/apply_view_last_applied.go b/pkg/kubectl/cmd/apply_view_last_applied.go index 7a01bee09cc..8692cffde1f 100644 --- a/pkg/kubectl/cmd/apply_view_last_applied.go +++ b/pkg/kubectl/cmd/apply_view_last_applied.go @@ -87,7 +87,13 @@ func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) erro return err } - r := f.NewUnstructuredBuilder(). + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). ResourceTypeOrNameArgs(enforceNamespace, args...). diff --git a/pkg/kubectl/cmd/convert.go b/pkg/kubectl/cmd/convert.go index 2c91b7d8a8a..c37ad0003c8 100644 --- a/pkg/kubectl/cmd/convert.go +++ b/pkg/kubectl/cmd/convert.go @@ -129,14 +129,14 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C // build the builder o.builder = f.NewBuilder() - if o.local { - o.builder = o.builder.Local(f.ClientForMapping) - } else { + if !o.local { schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } o.builder = o.builder.Schema(schema) + } else { + o.builder = o.builder.Local(f.ClientForMapping) } cmdNamespace, _, err := f.DefaultNamespace() diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index bed50b62176..5b60874d719 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -184,12 +184,13 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt return err } - mapper, _, err := f.UnstructuredObject() + mapper, typer, err := f.UnstructuredObject() if err != nil { return err } - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/delete.go b/pkg/kubectl/cmd/delete.go index 29cb96d729e..be087c5808f 100644 --- a/pkg/kubectl/cmd/delete.go +++ b/pkg/kubectl/cmd/delete.go @@ -170,14 +170,15 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args } // Set up client based support. - mapper, _, err := f.UnstructuredObject() + mapper, typer, err := f.UnstructuredObject() if err != nil { return err } o.Mapper = mapper includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). diff --git a/pkg/kubectl/cmd/describe.go b/pkg/kubectl/cmd/describe.go index efb47985513..0f69c73164a 100644 --- a/pkg/kubectl/cmd/describe.go +++ b/pkg/kubectl/cmd/describe.go @@ -116,10 +116,16 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a return cmdutil.UsageErrorf(cmd, "Required resource not specified.") } + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + // include the uninitialized objects by default // unless user explicitly set --include-uninitialized=false includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, true) - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). FilenameParam(enforceNamespace, options). diff --git a/pkg/kubectl/cmd/diff.go b/pkg/kubectl/cmd/diff.go index c3aaca5e7cb..fb4fa2baa1f 100644 --- a/pkg/kubectl/cmd/diff.go +++ b/pkg/kubectl/cmd/diff.go @@ -408,12 +408,18 @@ func RunDiff(f cmdutil.Factory, diff *DiffProgram, options *DiffOptions, from, t printer := Printer{} + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err } - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &options.FilenameOptions). Flatten(). diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index 6ce9634d5f9..4ba688d0e1e 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -191,25 +191,32 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { changeCause := f.Command(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) - var b *resource.Builder - if o.local { - b = f.NewBuilder(). - Local(f.ClientForMapping) - } else { - b = f.NewUnstructuredBuilder(). - LabelSelectorParam(o.selector). - ResourceTypeOrNameArgs(o.all, o.resources...). - Latest() - } - - one := false - r := b.ContinueOnError(). + b := f.NewBuilder(). + ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). IncludeUninitialized(includeUninitialized). - Flatten(). - Do(). - IntoSingleItemImplied(&one) + Flatten() + + if !o.local { + // call this method here, as it requires an api call + // and will cause the command to fail when there is + // no connection to a server + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + + b = b.LabelSelectorParam(o.selector). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). + ResourceTypeOrNameArgs(o.all, o.resources...). + Latest() + } else { + b = b.Local(f.ClientForMapping) + } + + one := false + r := b.Do().IntoSingleItemImplied(&one) if err := r.Err(); err != nil { return err } diff --git a/pkg/kubectl/cmd/patch.go b/pkg/kubectl/cmd/patch.go index c54ab89b739..b60ca83a35c 100644 --- a/pkg/kubectl/cmd/patch.go +++ b/pkg/kubectl/cmd/patch.go @@ -153,7 +153,13 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin return fmt.Errorf("unable to parse %q: %v", patch, err) } - r := f.NewUnstructuredBuilder(). + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &options.FilenameOptions). diff --git a/pkg/kubectl/cmd/replace.go b/pkg/kubectl/cmd/replace.go index 1dc357209ce..2ad34c99e74 100644 --- a/pkg/kubectl/cmd/replace.go +++ b/pkg/kubectl/cmd/replace.go @@ -120,12 +120,13 @@ func RunReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str return fmt.Errorf("--timeout must have --force specified") } - mapper, _, err := f.UnstructuredObject() + mapper, typer, err := f.UnstructuredObject() if err != nil { return err } - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -248,7 +249,8 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s return err } - r = f.NewUnstructuredBuilder(). + r = f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/resource/get.go b/pkg/kubectl/cmd/resource/get.go index 60dfe780318..ba2eea82318 100644 --- a/pkg/kubectl/cmd/resource/get.go +++ b/pkg/kubectl/cmd/resource/get.go @@ -232,7 +232,13 @@ func (options *GetOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []str return options.watch(f, cmd, args) } - r := f.NewUnstructuredBuilder(). + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(options.Namespace).DefaultNamespace().AllNamespaces(options.AllNamespaces). FilenameParam(options.ExplicitNamespace, &options.FilenameOptions). LabelSelectorParam(options.LabelSelector). @@ -439,12 +445,18 @@ func (options *GetOptions) raw(f cmdutil.Factory) error { // watch starts a client-side watch of one or more resources. // TODO: remove the need for arguments here. func (options *GetOptions) watch(f cmdutil.Factory, cmd *cobra.Command, args []string) error { + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return err + } + // TODO: this could be better factored // include uninitialized objects when watching on a single object // unless explicitly set --include-uninitialized=false includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, len(args) == 2) - r := f.NewUnstructuredBuilder(). + r := f.NewBuilder(). + Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(options.Namespace).DefaultNamespace().AllNamespaces(options.AllNamespaces). FilenameParam(options.ExplicitNamespace, &options.FilenameOptions). LabelSelectorParam(options.LabelSelector). @@ -456,7 +468,7 @@ func (options *GetOptions) watch(f cmdutil.Factory, cmd *cobra.Command, args []s SingleResourceType(). Latest(). Do() - err := r.Err() + err = r.Err() if err != nil { return err } diff --git a/pkg/kubectl/cmd/set/set_env.go b/pkg/kubectl/cmd/set/set_env.go index e721fc53a53..d4895119fdb 100644 --- a/pkg/kubectl/cmd/set/set_env.go +++ b/pkg/kubectl/cmd/set/set_env.go @@ -241,13 +241,13 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { FilenameParam(enforceNamespace, &o.FilenameOptions). Flatten() - if o.Local { - b = b.Local(f.ClientForMapping) - } else { + if !o.Local { b = b. LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, o.From). Latest() + } else { + b = b.Local(f.ClientForMapping) } infos, err := b.Do().Infos() @@ -309,13 +309,13 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { FilenameParam(enforceNamespace, &o.FilenameOptions). Flatten() - if o.Local { - b = b.Local(f.ClientForMapping) - } else { + if !o.Local { b = b. LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, o.Resources...). Latest() + } else { + b = b.Local(f.ClientForMapping) } o.Infos, err = b.Do().Infos() diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 63b12814a37..4ddc30a04c2 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -149,7 +149,12 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st IncludeUninitialized(includeUninitialized). Flatten() - if o.Local { + if !o.Local { + builder = builder. + LabelSelectorParam(o.Selector). + ResourceTypeOrNameArgs(o.All, o.Resources...). + Latest() + } else { // if a --local flag was provided, and a resource was specified in the form // /, fail immediately as --local cannot query the api server // for the specified resource. @@ -158,11 +163,6 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st } builder = builder.Local(f.ClientForMapping) - } else { - builder = builder. - LabelSelectorParam(o.Selector). - ResourceTypeOrNameArgs(o.All, o.Resources...). - Latest() } o.Infos, err = builder.Do().Infos() diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index 383e64c07c5..a2ea3e4659e 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -151,7 +151,12 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args IncludeUninitialized(includeUninitialized). Flatten() - if o.Local { + if !o.Local { + builder = builder. + LabelSelectorParam(o.Selector). + ResourceTypeOrNameArgs(o.All, args...). + Latest() + } else { // if a --local flag was provided, and a resource was specified in the form // /, fail immediately as --local cannot query the api server // for the specified resource. @@ -160,11 +165,6 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args } builder = builder.Local(f.ClientForMapping) - } else { - builder = builder. - LabelSelectorParam(o.Selector). - ResourceTypeOrNameArgs(o.All, args...). - Latest() } o.Infos, err = builder.Do().Infos() diff --git a/pkg/kubectl/cmd/set/set_selector.go b/pkg/kubectl/cmd/set/set_selector.go index b242bd63457..c8873afed9f 100644 --- a/pkg/kubectl/cmd/set/set_selector.go +++ b/pkg/kubectl/cmd/set/set_selector.go @@ -135,7 +135,11 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ IncludeUninitialized(includeUninitialized). Flatten() - if o.local { + if !o.local { + o.builder = o.builder. + ResourceTypeOrNameArgs(o.all, o.resources...). + Latest() + } else { // if a --local flag was provided, and a resource was specified in the form // /, fail immediately as --local cannot query the api server // for the specified resource. @@ -144,10 +148,6 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ } o.builder = o.builder.Local(f.ClientForMapping) - } else { - o.builder = o.builder. - ResourceTypeOrNameArgs(o.all, o.resources...). - Latest() } o.PrintObject = func(obj runtime.Object) error { diff --git a/pkg/kubectl/cmd/set/set_subject.go b/pkg/kubectl/cmd/set/set_subject.go index b57bc5bbd6a..4a80fb613fd 100644 --- a/pkg/kubectl/cmd/set/set_subject.go +++ b/pkg/kubectl/cmd/set/set_subject.go @@ -133,7 +133,12 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] IncludeUninitialized(includeUninitialized). Flatten() - if o.Local { + if !o.Local { + builder = builder. + LabelSelectorParam(o.Selector). + ResourceTypeOrNameArgs(o.All, args...). + Latest() + } else { // if a --local flag was provided, and a resource was specified in the form // /, fail immediately as --local cannot query the api server // for the specified resource. @@ -142,11 +147,6 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] } builder = builder.Local(f.ClientForMapping) - } else { - builder = builder. - LabelSelectorParam(o.Selector). - ResourceTypeOrNameArgs(o.All, args...). - Latest() } o.Infos, err = builder.Do().Infos() diff --git a/pkg/kubectl/cmd/testing/BUILD b/pkg/kubectl/cmd/testing/BUILD index 90fe0a0872b..b46a4a5b660 100644 --- a/pkg/kubectl/cmd/testing/BUILD +++ b/pkg/kubectl/cmd/testing/BUILD @@ -32,7 +32,6 @@ go_library( "//vendor/k8s.io/api/core/v1: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/unstructured:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index 33f297eeb7a..633b447872f 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -29,7 +29,6 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -522,19 +521,6 @@ func (f *FakeFactory) NewBuilder() *resource.Builder { return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } -func (f *FakeFactory) NewUnstructuredBuilder() *resource.Builder { - mapper, typer, err := f.UnstructuredObject() - if err != nil { - cmdutil.CheckErr(err) - } - return resource.NewBuilder( - mapper, - f.CategoryExpander(), - typer, - resource.ClientMapperFunc(f.UnstructuredClientForMapping), - unstructured.UnstructuredJSONScheme) -} - func (f *FakeFactory) DefaultResourceFilterOptions(cmd *cobra.Command, withNamespace bool) *printers.PrintOptions { return &printers.PrintOptions{} } @@ -849,19 +835,6 @@ func (f *fakeAPIFactory) NewBuilder() *resource.Builder { return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } -func (f *fakeAPIFactory) NewUnstructuredBuilder() *resource.Builder { - mapper, typer, err := f.UnstructuredObject() - if err != nil { - cmdutil.CheckErr(err) - } - return resource.NewBuilder( - mapper, - f.CategoryExpander(), - typer, - resource.ClientMapperFunc(f.UnstructuredClientForMapping), - unstructured.UnstructuredJSONScheme) -} - func (f *fakeAPIFactory) SuggestedPodTemplateResources() []schema.GroupResource { return []schema.GroupResource{} } diff --git a/pkg/kubectl/cmd/util/editor/editoptions.go b/pkg/kubectl/cmd/util/editor/editoptions.go index 1a4d8e91b37..1fada70ae8f 100644 --- a/pkg/kubectl/cmd/util/editor/editoptions.go +++ b/pkg/kubectl/cmd/util/editor/editoptions.go @@ -107,12 +107,12 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args [] if err != nil { return err } - mapper, _, err := f.UnstructuredObject() + mapper, typer, err := f.UnstructuredObject() if err != nil { return err } - b := f.NewUnstructuredBuilder() + b := f.NewBuilder().Unstructured(f.UnstructuredClientForMapping, mapper, typer) if o.EditMode == NormalEditMode || o.EditMode == ApplyEditMode { // when do normal edit or apply edit we need to always retrieve the latest resource from server b = b.ResourceTypeOrNameArgs(true, args...).Latest() @@ -132,7 +132,7 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args [] o.updatedResultGetter = func(data []byte) *resource.Result { // resource builder to read objects from edited data - return f.NewUnstructuredBuilder(). + return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). Stream(bytes.NewReader(data), "edited-file"). IncludeUninitialized(includeUninitialized). ContinueOnError(). diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 4022ce3b002..037a0351a27 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -251,10 +251,9 @@ type BuilderFactory interface { PrintResourceInfoForCommand(cmd *cobra.Command, info *resource.Info, out io.Writer) error // PrintSuccess prints message after finishing mutating operations PrintSuccess(mapper meta.RESTMapper, shortOutput bool, out io.Writer, resource, name string, dryRun bool, operation string) - // One stop shopping for a structured Builder + // NewBuilder returns an object that assists in loading objects from both disk and the server + // and which implements the common patterns for CLI interactions with generic resources. NewBuilder() *resource.Builder - // One stop shopping for a unstructured Builder - NewUnstructuredBuilder() *resource.Builder // PluginLoader provides the implementation to be used to load cli plugins. PluginLoader() plugins.PluginLoader // PluginRunner provides the implementation to be used to run cli plugins. diff --git a/pkg/kubectl/cmd/util/factory_builder.go b/pkg/kubectl/cmd/util/factory_builder.go index 5cedb694c8e..611af741368 100644 --- a/pkg/kubectl/cmd/util/factory_builder.go +++ b/pkg/kubectl/cmd/util/factory_builder.go @@ -190,18 +190,6 @@ func (f *ring2Factory) NewBuilder() *resource.Builder { return resource.NewBuilder(mapper, categoryExpander, typer, clientMapperFunc, f.clientAccessFactory.Decoder(true)) } -// NewUnstructuredBuilder returns a new resource builder for unstructured api objects. -func (f *ring2Factory) NewUnstructuredBuilder() *resource.Builder { - clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.UnstructuredClientForMapping) - mapper, typer, err := f.objectMappingFactory.UnstructuredObject() - if err != nil { - CheckErr(err) - } - categoryExpander := f.objectMappingFactory.CategoryExpander() - - return resource.NewBuilder(mapper, categoryExpander, typer, clientMapperFunc, unstructured.UnstructuredJSONScheme) -} - // PluginLoader loads plugins from a path set by the KUBECTL_PLUGINS_PATH env var. // If this env var is not set, it defaults to // "~/.kube/plugins", plus diff --git a/pkg/kubectl/resource/BUILD b/pkg/kubectl/resource/BUILD index e6dd3e8b680..2df1069b41f 100644 --- a/pkg/kubectl/resource/BUILD +++ b/pkg/kubectl/resource/BUILD @@ -29,6 +29,7 @@ go_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/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured: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/runtime:go_default_library", diff --git a/pkg/kubectl/resource/builder.go b/pkg/kubectl/resource/builder.go index 205356dd046..3eafc896502 100644 --- a/pkg/kubectl/resource/builder.go +++ b/pkg/kubectl/resource/builder.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -171,6 +172,17 @@ func (b *Builder) Local(mapperFunc ClientMapperFunc) *Builder { return b } +// Unstructured updates the builder's ClientMapper, RESTMapper, +// ObjectTyper, and codec for working with unstructured api objects +func (b *Builder) Unstructured(mapperFunc ClientMapperFunc, mapper meta.RESTMapper, typer runtime.ObjectTyper) *Builder { + b.mapper.RESTMapper = mapper + b.mapper.ObjectTyper = typer + b.mapper.Decoder = unstructured.UnstructuredJSONScheme + b.mapper.ClientMapper = ClientMapperFunc(mapperFunc) + + return b +} + // URL accepts a number of URLs directly. func (b *Builder) URL(httpAttemptCount int, urls ...*url.URL) *Builder { for _, u := range urls {