From d036686185192e58bc38d16093117fba25f4ab62 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Tue, 16 May 2017 17:52:51 -0400 Subject: [PATCH] fix --local flag for `kubectl set` commands --- hack/make-rules/test-cmd-util.sh | 18 +++++++ pkg/kubectl/cmd/annotate.go | 25 +++++++--- pkg/kubectl/cmd/apply.go | 10 ++-- pkg/kubectl/cmd/apply_set_last_applied.go | 10 ++-- pkg/kubectl/cmd/apply_view_last_applied.go | 13 +++-- pkg/kubectl/cmd/attach.go | 4 +- pkg/kubectl/cmd/autoscale.go | 6 +-- pkg/kubectl/cmd/certificates.go | 4 +- pkg/kubectl/cmd/clusterinfo.go | 3 +- pkg/kubectl/cmd/cmd_test.go | 16 +++--- pkg/kubectl/cmd/convert.go | 13 ++--- pkg/kubectl/cmd/create.go | 13 +++-- pkg/kubectl/cmd/create_role.go | 2 +- pkg/kubectl/cmd/delete.go | 11 ++-- pkg/kubectl/cmd/describe.go | 5 +- pkg/kubectl/cmd/drain.go | 2 +- pkg/kubectl/cmd/expose.go | 6 +-- pkg/kubectl/cmd/get.go | 20 +++++--- pkg/kubectl/cmd/label.go | 19 +++++-- pkg/kubectl/cmd/logs.go | 13 ++--- pkg/kubectl/cmd/patch.go | 14 +++++- pkg/kubectl/cmd/replace.go | 17 +++++-- pkg/kubectl/cmd/rollingupdate.go | 8 +-- pkg/kubectl/cmd/rollout/rollout_history.go | 4 +- pkg/kubectl/cmd/rollout/rollout_pause.go | 2 +- pkg/kubectl/cmd/rollout/rollout_resume.go | 2 +- pkg/kubectl/cmd/rollout/rollout_status.go | 4 +- pkg/kubectl/cmd/rollout/rollout_undo.go | 2 +- pkg/kubectl/cmd/run.go | 7 ++- pkg/kubectl/cmd/scale.go | 4 +- pkg/kubectl/cmd/set/set_image.go | 8 +-- pkg/kubectl/cmd/set/set_resources.go | 7 +-- pkg/kubectl/cmd/set/set_selector.go | 14 +++--- pkg/kubectl/cmd/set/set_subject.go | 5 +- pkg/kubectl/cmd/stop.go | 4 +- pkg/kubectl/cmd/taint.go | 5 +- pkg/kubectl/cmd/testing/BUILD | 1 + pkg/kubectl/cmd/testing/fake.go | 45 +++++++++++++---- pkg/kubectl/cmd/util/editor/editoptions.go | 6 ++- pkg/kubectl/cmd/util/factory.go | 10 ++-- pkg/kubectl/cmd/util/factory_builder.go | 58 ++++++++++++++++++---- pkg/kubectl/cmd/util/printing.go | 4 +- 42 files changed, 293 insertions(+), 151 deletions(-) diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 138318f36f9..4833f87e283 100644 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -1848,6 +1848,24 @@ run_recursive_resources_tests() { kube::test::get_object_assert pods "{{range.items}}{{${labels_field}.status}}:{{end}}" 'replaced:replaced:' kube::test::if_has_string "${output_message}" 'error validating data: kind not set' + + ### Convert deployment YAML file locally without affecting the live deployment. + # Pre-condition: no deployments exist + kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" '' + # Command + # Create a deployment (revision 1) + kubectl create -f hack/testdata/deployment-revision1.yaml "${kube_flags[@]}" + kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx:' + kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + # Command + output_message=$(kubectl convert --local -f hack/testdata/deployment-revision1.yaml --output-version=apps/v1beta1 -o go-template='{{ .apiVersion }}' "${kube_flags[@]}") + echo $output_message + # Post-condition: apiVersion is still extensions/v1beta1 in the live deployment, but command output is the new value + kube::test::get_object_assert 'deployment nginx' "{{ .apiVersion }}" 'extensions/v1beta1' + kube::test::if_has_string "${output_message}" "apps/v1beta1" + # Clean up + kubectl delete deployment nginx "${kube_flags[@]}" + ## Convert multiple busybox PODs recursively from directory of YAML files # Pre-condition: busybox0 & busybox1 PODs exist kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'busybox0:busybox1:' diff --git a/pkg/kubectl/cmd/annotate.go b/pkg/kubectl/cmd/annotate.go index e053c4d1af6..ed36be72385 100644 --- a/pkg/kubectl/cmd/annotate.go +++ b/pkg/kubectl/cmd/annotate.go @@ -27,7 +27,6 @@ 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/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/json" @@ -186,11 +185,12 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro changeCause := f.Command(cmd, false) - mapper, typer, err := f.UnstructuredObject() + builder, err := f.NewUnstructuredBuilder(!o.local) if err != nil { return err } - b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + + b := builder. ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). @@ -223,10 +223,13 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro } var outputObj runtime.Object - obj, err := cmdutil.MaybeConvertObject(info.Object, info.Mapping.GroupVersionKind.GroupVersion(), info.Mapping) + var obj runtime.Object + + obj, err = cmdutil.MaybeConvertObject(info.Object, info.Mapping.GroupVersionKind.GroupVersion(), info.Mapping) if err != nil { return err } + if o.dryrun || o.local { if err := o.updateAnnotations(obj); err != nil { return err @@ -271,8 +274,18 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro return err } } - if o.outputFormat != "" { - return f.PrintObject(cmd, mapper, outputObj, o.out) + + var mapper meta.RESTMapper + if o.local { + mapper, _ = f.Object() + } else { + mapper, _, err = f.UnstructuredObject() + if err != nil { + return err + } + } + if len(o.outputFormat) > 0 { + return f.PrintObject(cmd, o.local, mapper, outputObj, o.out) } cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, o.dryrun, "annotated") return nil diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index 7b8ccb76a96..604eddad2bf 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "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" @@ -193,7 +192,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti return err } - mapper, typer, err := f.UnstructuredObject() + mapper, _, err := f.UnstructuredObject() if err != nil { return err } @@ -205,7 +204,12 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti } } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r := builder. 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 6f7ccbf4a84..c86e90c6e5e 100644 --- a/pkg/kubectl/cmd/apply_set_last_applied.go +++ b/pkg/kubectl/cmd/apply_set_last_applied.go @@ -27,7 +27,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" apijson "k8s.io/apimachinery/pkg/util/json" @@ -127,13 +126,18 @@ func (o *SetLastAppliedOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) } func (o *SetLastAppliedOptions) Validate(f cmdutil.Factory, cmd *cobra.Command) error { - r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r := builder. 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 1461a143a83..033da8b9d94 100644 --- a/pkg/kubectl/cmd/apply_view_last_applied.go +++ b/pkg/kubectl/cmd/apply_view_last_applied.go @@ -24,7 +24,6 @@ import ( "github.com/ghodss/yaml" "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -83,17 +82,17 @@ func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Co } func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) error { - mapper, typer, err := f.UnstructuredObject() - if err != nil { - return err - } - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r := builder. NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). ResourceTypeOrNameArgs(enforceNamespace, args...). diff --git a/pkg/kubectl/cmd/attach.go b/pkg/kubectl/cmd/attach.go index ecf42ae9d84..bdb3f352def 100644 --- a/pkg/kubectl/cmd/attach.go +++ b/pkg/kubectl/cmd/attach.go @@ -34,7 +34,6 @@ import ( coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/util/i18n" ) @@ -144,8 +143,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [ return cmdutil.UsageError(cmd, err.Error()) } - mapper, typer := f.Object() - builder := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + builder := f.NewBuilder(true). NamespaceParam(namespace).DefaultNamespace() switch len(argsIn) { diff --git a/pkg/kubectl/cmd/autoscale.go b/pkg/kubectl/cmd/autoscale.go index ac6cb539cdd..4d0fadf1e9c 100644 --- a/pkg/kubectl/cmd/autoscale.go +++ b/pkg/kubectl/cmd/autoscale.go @@ -91,7 +91,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s } mapper, typer := f.Object() - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). FilenameParam(enforceNamespace, options). @@ -162,7 +162,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s object = hpa.Object } if cmdutil.GetDryRunFlag(cmd) { - return f.PrintObject(cmd, mapper, object, out) + return f.PrintObject(cmd, false, mapper, object, out) } if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), hpa, f.JSONEncoder()); err != nil { @@ -176,7 +176,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s count++ if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, mapper, object, out) + return f.PrintObject(cmd, false, mapper, object, out) } cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, cmdutil.GetDryRunFlag(cmd), "autoscaled") diff --git a/pkg/kubectl/cmd/certificates.go b/pkg/kubectl/cmd/certificates.go index 6ae7f66897a..2f3b57ba3d4 100644 --- a/pkg/kubectl/cmd/certificates.go +++ b/pkg/kubectl/cmd/certificates.go @@ -162,12 +162,12 @@ func (options *CertificateOptions) RunCertificateDeny(f cmdutil.Factory, out io. func (options *CertificateOptions) modifyCertificateCondition(f cmdutil.Factory, out io.Writer, modify func(csr *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, string)) error { var found int - mapper, typer := f.Object() + mapper, _ := f.Object() c, err := f.ClientSet() if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). ContinueOnError(). FilenameParam(false, &options.FilenameOptions). ResourceNames("certificatesigningrequest", options.csrNames...). diff --git a/pkg/kubectl/cmd/clusterinfo.go b/pkg/kubectl/cmd/clusterinfo.go index e03c34708c7..ab4ddcd8995 100644 --- a/pkg/kubectl/cmd/clusterinfo.go +++ b/pkg/kubectl/cmd/clusterinfo.go @@ -65,14 +65,13 @@ func RunClusterInfo(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error } printService(out, "Kubernetes master", client.Host) - mapper, typer := f.Object() cmdNamespace := cmdutil.GetFlagString(cmd, "namespace") if cmdNamespace == "" { cmdNamespace = metav1.NamespaceSystem } // TODO use generalized labels once they are implemented (#341) - b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + b := f.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). SelectorParam("kubernetes.io/cluster-service=true"). ResourceTypeOrNameArgs(false, []string{"services"}...). diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index 6922269f577..5ad282e0e73 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -197,7 +197,7 @@ func Example_printReplicationControllerWithNamespace() { }, } mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) + err := f.PrintObject(cmd, false, mapper, ctrl, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -252,7 +252,7 @@ func Example_printMultiContainersReplicationControllerWithWide() { }, } mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) + err := f.PrintObject(cmd, false, mapper, ctrl, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -306,7 +306,7 @@ func Example_printReplicationController() { }, } mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) + err := f.PrintObject(cmd, false, mapper, ctrl, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -349,7 +349,7 @@ func Example_printPodWithWideFormat() { }, } mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, pod, os.Stdout) + err := f.PrintObject(cmd, false, mapper, pod, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -395,7 +395,7 @@ func Example_printPodWithShowLabels() { }, } mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, pod, os.Stdout) + err := f.PrintObject(cmd, false, mapper, pod, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -519,7 +519,7 @@ func Example_printPodHideTerminated() { } for _, pod := range filteredPodList { mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, pod, os.Stdout) + err := f.PrintObject(cmd, false, mapper, pod, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -547,7 +547,7 @@ func Example_printPodShowAll() { cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) podList := newAllPhasePodList() mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, podList, os.Stdout) + err := f.PrintObject(cmd, false, mapper, podList, os.Stdout) if err != nil { fmt.Printf("Unexpected error: %v", err) } @@ -622,7 +622,7 @@ func Example_printServiceWithNamespacesAndLabels() { ld := strings.NewLineDelimiter(os.Stdout, "|") defer ld.Flush() mapper, _ := f.Object() - err := f.PrintObject(cmd, mapper, svc, ld) + err := f.PrintObject(cmd, false, mapper, svc, ld) if err != nil { fmt.Printf("Unexpected error: %v", err) } diff --git a/pkg/kubectl/cmd/convert.go b/pkg/kubectl/cmd/convert.go index 4eaf41d0e64..b6737573107 100644 --- a/pkg/kubectl/cmd/convert.go +++ b/pkg/kubectl/cmd/convert.go @@ -19,7 +19,6 @@ package cmd import ( "fmt" "io" - "os" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" @@ -127,14 +126,8 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C } // build the builder - mapper, typer := f.Object() - clientMapper := resource.ClientMapperFunc(f.ClientForMapping) - - if o.local { - fmt.Fprintln(os.Stderr, "running in local mode...") - o.builder = resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.DisabledClientForMapping{ClientMapper: clientMapper}, f.Decoder(true)) - } else { - o.builder = resource.NewBuilder(mapper, f.CategoryExpander(), typer, clientMapper, f.Decoder(true)) + o.builder = f.NewBuilder(!o.local) + if !o.local { schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) if err != nil { return err @@ -164,7 +157,7 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C cmd.Flags().Set("output", outputFormat) } o.encoder = f.JSONEncoder() - o.printer, err = f.PrinterForCommand(cmd, nil, printers.PrintOptions{}) + o.printer, err = f.PrinterForCommand(cmd, o.local, nil, printers.PrintOptions{}) if err != nil { return err } diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index e48554c0ddc..bfec15bc8c6 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -23,7 +23,6 @@ import ( "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" @@ -125,11 +124,17 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt return err } - mapper, typer, err := f.UnstructuredObject() + mapper, _, err := f.UnstructuredObject() if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r := builder. Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -290,5 +295,5 @@ func RunCreateSubcommand(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, o return nil } - return f.PrintObject(cmd, mapper, obj, out) + return f.PrintObject(cmd, false, mapper, obj, out) } diff --git a/pkg/kubectl/cmd/create_role.go b/pkg/kubectl/cmd/create_role.go index 0baf88ee9bc..a1eb9c3091e 100644 --- a/pkg/kubectl/cmd/create_role.go +++ b/pkg/kubectl/cmd/create_role.go @@ -199,7 +199,7 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args } c.PrintObject = func(obj runtime.Object) error { - return f.PrintObject(cmd, c.Mapper, obj, c.Out) + return f.PrintObject(cmd, false, c.Mapper, obj, c.Out) } clientSet, err := f.ClientSet() diff --git a/pkg/kubectl/cmd/delete.go b/pkg/kubectl/cmd/delete.go index 7c438a7bf44..e43ff2889ec 100644 --- a/pkg/kubectl/cmd/delete.go +++ b/pkg/kubectl/cmd/delete.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "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/util/wait" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" @@ -170,12 +169,18 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args } // Set up client based support. - mapper, typer, err := f.UnstructuredObject() + mapper, _, err := f.UnstructuredObject() if err != nil { return err } + + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + o.Mapper = mapper - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + r := builder. ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). diff --git a/pkg/kubectl/cmd/describe.go b/pkg/kubectl/cmd/describe.go index 810ec83b151..ee8b6bd9cfa 100644 --- a/pkg/kubectl/cmd/describe.go +++ b/pkg/kubectl/cmd/describe.go @@ -115,11 +115,12 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a return cmdutil.UsageError(cmd, "Required resource not specified.") } - mapper, typer, err := f.UnstructuredObject() + builder, err := f.NewUnstructuredBuilder(true) if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + + r := builder. ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). FilenameParam(enforceNamespace, options). diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 3e3e68b7359..a27cbea28df 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -215,7 +215,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { return err } - r := o.Factory.NewBuilder(). + r := o.Factory.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). ResourceNames("node", args[0]). Do() diff --git a/pkg/kubectl/cmd/expose.go b/pkg/kubectl/cmd/expose.go index 4e74ac0c222..2314044094b 100644 --- a/pkg/kubectl/cmd/expose.go +++ b/pkg/kubectl/cmd/expose.go @@ -127,7 +127,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri } mapper, typer := f.Object() - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). FilenameParam(enforceNamespace, options). @@ -255,7 +255,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri info.Refresh(object, true) if cmdutil.GetDryRunFlag(cmd) { if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, mapper, object, out) + return f.PrintObject(cmd, false, mapper, object, out) } cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, true, "exposed") return nil @@ -271,7 +271,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri } if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, mapper, object, out) + return f.PrintObject(cmd, false, mapper, object, out) } cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, false, "exposed") diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 9da7e674eee..f7ee34826f6 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -168,10 +168,11 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ selector := cmdutil.GetFlagString(cmd, "selector") allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces") showKind := cmdutil.GetFlagBool(cmd, "show-kind") - mapper, typer, err := f.UnstructuredObject() + builder, err := f.NewUnstructuredBuilder(true) if err != nil { return err } + cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err @@ -201,7 +202,12 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ // handle watch separately since we cannot watch multiple resource types isWatch, isWatchOnly := cmdutil.GetFlagBool(cmd, "watch"), cmdutil.GetFlagBool(cmd, "watch-only") if isWatch || isWatchOnly { - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r := builder. NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). FilenameParam(enforceNamespace, &options.FilenameOptions). SelectorParam(selector). @@ -210,7 +216,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ SingleResourceType(). Latest(). Do() - err := r.Err() + err = r.Err() if err != nil { return err } @@ -226,7 +232,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ } info := infos[0] mapping := info.ResourceMapping() - printer, err := f.PrinterForMapping(cmd, nil, mapping, allNamespaces) + printer, err := f.PrinterForMapping(cmd, false, nil, mapping, allNamespaces) if err != nil { return err } @@ -291,7 +297,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ return nil } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + r := builder. NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). FilenameParam(enforceNamespace, &options.FilenameOptions). SelectorParam(selector). @@ -306,7 +312,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ return err } - printer, err := f.PrinterForCommand(cmd, nil, printers.PrintOptions{}) + printer, err := f.PrinterForCommand(cmd, false, nil, printers.PrintOptions{}) if err != nil { return err } @@ -455,7 +461,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ outputOpts, _ = outputOptsForMappingFromOpenAPI(f, cmdutil.GetOpenAPICacheDir(cmd), mapping) } - printer, err = f.PrinterForMapping(cmd, outputOpts, mapping, allNamespaces) + printer, err = f.PrinterForMapping(cmd, false, outputOpts, mapping, allNamespaces) if err != nil { if !errs.Has(err.Error()) { errs.Insert(err.Error()) diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index 012ca753810..d9568e6c7fb 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -28,7 +28,6 @@ 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/runtime" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -181,11 +180,12 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { changeCause := f.Command(cmd, false) - mapper, typer, err := f.UnstructuredObject() + builder, err := f.NewUnstructuredBuilder(!o.local) if err != nil { return err } - b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + + b := builder. ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). @@ -220,6 +220,7 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { if err != nil { return err } + dataChangeMsg = "labeled" outputObj = info.Object } else { obj := info.Object @@ -275,8 +276,18 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { return err } } + + var mapper meta.RESTMapper + if o.local { + mapper, _ = f.Object() + } else { + mapper, _, err = f.UnstructuredObject() + if err != nil { + return err + } + } if o.outputFormat != "" { - return f.PrintObject(cmd, mapper, outputObj, o.out) + return f.PrintObject(cmd, o.local, mapper, outputObj, o.out) } cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, o.dryrun, dataChangeMsg) return nil diff --git a/pkg/kubectl/cmd/logs.go b/pkg/kubectl/cmd/logs.go index 3f06f03e55c..d52f13f2ce6 100644 --- a/pkg/kubectl/cmd/logs.go +++ b/pkg/kubectl/cmd/logs.go @@ -32,7 +32,6 @@ import ( "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/util/i18n" ) @@ -75,10 +74,9 @@ type LogsOptions struct { ResourceArg string Options runtime.Object - Mapper meta.RESTMapper - Typer runtime.ObjectTyper - ClientMapper resource.ClientMapper - Decoder runtime.Decoder + Mapper meta.RESTMapper + Typer runtime.ObjectTyper + Decoder runtime.Decoder Object runtime.Object GetPodTimeout time.Duration @@ -181,7 +179,6 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm } o.Options = logOptions o.LogsForObject = f.LogsForObject - o.ClientMapper = resource.ClientMapperFunc(f.ClientForMapping) o.Out = out if len(selector) != 0 { @@ -196,10 +193,8 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm } } - mapper, typer := f.Object() - decoder := f.Decoder(true) if o.Object == nil { - builder := resource.NewBuilder(mapper, f.CategoryExpander(), typer, o.ClientMapper, decoder). + builder := f.NewBuilder(true). NamespaceParam(o.Namespace).DefaultNamespace(). SingleResourceType() if o.ResourceArg != "" { diff --git a/pkg/kubectl/cmd/patch.go b/pkg/kubectl/cmd/patch.go index b9c06842b63..96a0b6d3852 100644 --- a/pkg/kubectl/cmd/patch.go +++ b/pkg/kubectl/cmd/patch.go @@ -149,11 +149,14 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin return fmt.Errorf("unable to parse %q: %v", patch, err) } - mapper, typer, err := f.UnstructuredObject() + // TODO: fix --local to work with thirdpartyresources without making use of the discovery client. + // https://github.com/kubernetes/kubernetes/issues/46722 + builder, err := f.NewUnstructuredBuilder(true) if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + + r := builder. ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &options.FilenameOptions). @@ -220,6 +223,10 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin if len(options.OutputFormat) > 0 && options.OutputFormat != "name" { return cmdutil.PrintResourceInfoForCommand(cmd, info, f, out) } + mapper, _, err := f.UnstructuredObject() + if err != nil { + return err + } cmdutil.PrintSuccess(mapper, options.OutputFormat == "name", out, info.Mapping.Resource, info.Name, false, dataChangedMsg) return nil } @@ -230,14 +237,17 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin if err != nil { return err } + originalPatchedObjJS, err := getPatchedJSON(patchType, originalObjJS, patchBytes, mapping.GroupVersionKind, api.Scheme) if err != nil { return err } + targetObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, originalPatchedObjJS) if err != nil { return err } + // TODO: if we ever want to go generic, this allows a clean -o yaml without trying to print columns or anything // rawExtension := &runtime.Unknown{ // Raw: originalPatchedObjJS, diff --git a/pkg/kubectl/cmd/replace.go b/pkg/kubectl/cmd/replace.go index 47be6f3f12b..32183579c7c 100644 --- a/pkg/kubectl/cmd/replace.go +++ b/pkg/kubectl/cmd/replace.go @@ -120,11 +120,17 @@ func RunReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str return fmt.Errorf("--timeout must have --force specified") } - mapper, typer, err := f.UnstructuredObject() + mapper, _, err := f.UnstructuredObject() if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r := builder. Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -244,7 +250,12 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s }) }) - r = resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). + builder, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } + + r = builder. Schema(schema). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index 5e1240b39d3..af0625bd27e 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -199,7 +199,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args return err } - request := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + request := f.NewBuilder(true). Schema(schema). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}). @@ -328,10 +328,10 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args oldRcData.WriteString(oldRc.Name) newRcData.WriteString(newRc.Name) } else { - if err := f.PrintObject(cmd, mapper, oldRc, oldRcData); err != nil { + if err := f.PrintObject(cmd, false, mapper, oldRc, oldRcData); err != nil { return err } - if err := f.PrintObject(cmd, mapper, newRc, newRcData); err != nil { + if err := f.PrintObject(cmd, false, mapper, newRc, newRcData); err != nil { return err } } @@ -376,7 +376,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args return err } if outputFormat != "" { - return f.PrintObject(cmd, mapper, newRc, out) + return f.PrintObject(cmd, false, mapper, newRc, out) } cmdutil.PrintSuccess(mapper, false, out, "replicationcontrollers", oldName, dryrun, message) return nil diff --git a/pkg/kubectl/cmd/rollout/rollout_history.go b/pkg/kubectl/cmd/rollout/rollout_history.go index 8b697d3dc44..20785d4a890 100644 --- a/pkg/kubectl/cmd/rollout/rollout_history.go +++ b/pkg/kubectl/cmd/rollout/rollout_history.go @@ -74,14 +74,12 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str return fmt.Errorf("revision must be a positive integer: %v", revision) } - mapper, typer := f.Object() - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, options). ResourceTypeOrNameArgs(true, args...). diff --git a/pkg/kubectl/cmd/rollout/rollout_pause.go b/pkg/kubectl/cmd/rollout/rollout_pause.go index 8454e89d7a7..b436305f99d 100644 --- a/pkg/kubectl/cmd/rollout/rollout_pause.go +++ b/pkg/kubectl/cmd/rollout/rollout_pause.go @@ -111,7 +111,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i return err } - r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). ResourceTypeOrNameArgs(true, args...). diff --git a/pkg/kubectl/cmd/rollout/rollout_resume.go b/pkg/kubectl/cmd/rollout/rollout_resume.go index d22050532cf..e5560082586 100644 --- a/pkg/kubectl/cmd/rollout/rollout_resume.go +++ b/pkg/kubectl/cmd/rollout/rollout_resume.go @@ -109,7 +109,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out return err } - r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). ResourceTypeOrNameArgs(true, args...). diff --git a/pkg/kubectl/cmd/rollout/rollout_status.go b/pkg/kubectl/cmd/rollout/rollout_status.go index a740da9a0f2..744d9e6f2b4 100644 --- a/pkg/kubectl/cmd/rollout/rollout_status.go +++ b/pkg/kubectl/cmd/rollout/rollout_status.go @@ -77,14 +77,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri return cmdutil.UsageError(cmd, "Required resource not specified.") } - mapper, typer := f.Object() - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err } - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, options). ResourceTypeOrNameArgs(true, args...). diff --git a/pkg/kubectl/cmd/rollout/rollout_undo.go b/pkg/kubectl/cmd/rollout/rollout_undo.go index 678503982e7..0614d0f0dd3 100644 --- a/pkg/kubectl/cmd/rollout/rollout_undo.go +++ b/pkg/kubectl/cmd/rollout/rollout_undo.go @@ -110,7 +110,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io return err } - r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). ResourceTypeOrNameArgs(true, args...). diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index 831fea073dd..1c361df94d3 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -331,8 +331,7 @@ func Run(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobr if err != nil { return err } - _, typer := f.Object() - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + r := f.NewBuilder(true). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace(). ResourceNames(mapping.Resource, name). @@ -379,7 +378,7 @@ func Run(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobr outputFormat := cmdutil.GetFlagString(cmd, "output") if outputFormat != "" || cmdutil.GetDryRunFlag(cmd) { - return f.PrintObject(cmd, mapper, obj, cmdOut) + return f.PrintObject(cmd, false, mapper, obj, cmdOut) } cmdutil.PrintSuccess(mapper, false, cmdOut, mapping.Resource, args[0], cmdutil.GetDryRunFlag(cmd), "created") return nil @@ -556,7 +555,7 @@ func generateService(f cmdutil.Factory, cmd *cobra.Command, args []string, servi } if cmdutil.GetFlagString(cmd, "output") != "" || cmdutil.GetDryRunFlag(cmd) { - err := f.PrintObject(cmd, mapper, obj, out) + err := f.PrintObject(cmd, false, mapper, obj, out) if err != nil { return err } diff --git a/pkg/kubectl/cmd/scale.go b/pkg/kubectl/cmd/scale.go index 20aae2fe8e0..fab49e44a2f 100644 --- a/pkg/kubectl/cmd/scale.go +++ b/pkg/kubectl/cmd/scale.go @@ -98,8 +98,8 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin return err } - mapper, typer := f.Object() - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + mapper, _ := f.Object() + r := f.NewBuilder(true). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, options). diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 2379e14a56d..74daefc3449 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -54,7 +54,7 @@ type ImageOptions struct { Cmd *cobra.Command ResolveImage func(in string) (string, error) - PrintObject func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error + PrintObject func(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error) Resources []string ContainerImages map[string]string @@ -137,7 +137,7 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st return err } - builder := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + builder := f.NewBuilder(!o.Local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). @@ -227,7 +227,7 @@ func (o *ImageOptions) Run() error { } if o.PrintObject != nil && (o.Local || o.DryRun) { - return o.PrintObject(o.Cmd, o.Mapper, info.Object, o.Out) + return o.PrintObject(o.Cmd, o.Local, o.Mapper, info.Object, o.Out) } // patch the change @@ -250,7 +250,7 @@ func (o *ImageOptions) Run() error { info.Refresh(obj, true) if len(o.Output) > 0 { - return o.PrintObject(o.Cmd, o.Mapper, obj, o.Out) + return o.PrintObject(o.Cmd, o.Local, o.Mapper, obj, o.Out) } cmdutil.PrintSuccess(o.Mapper, o.ShortOutput, o.Out, info.Mapping.Resource, info.Name, o.DryRun, "image updated") } diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index ba0b8e1081a..25a0518cfbc 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -81,7 +81,7 @@ type ResourcesOptions struct { Requests string ResourceRequirements api.ResourceRequirements - PrintObject func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error + PrintObject func(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error) Resources []string } @@ -141,12 +141,13 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args return err } - builder := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + builder := f.NewBuilder(!o.Local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). //FilenameParam(enforceNamespace, o.Filenames...). FilenameParam(enforceNamespace, &o.FilenameOptions). Flatten() + if !o.Local { builder = builder. SelectorParam(o.Selector). @@ -223,7 +224,7 @@ func (o *ResourcesOptions) Run() error { } if o.Local || cmdutil.GetDryRunFlag(o.Cmd) { - return o.PrintObject(o.Cmd, o.Mapper, info.Object, o.Out) + return o.PrintObject(o.Cmd, o.Local, o.Mapper, info.Object, o.Out) } obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) diff --git a/pkg/kubectl/cmd/set/set_selector.go b/pkg/kubectl/cmd/set/set_selector.go index 4f7c2b5acff..3cbb8597077 100644 --- a/pkg/kubectl/cmd/set/set_selector.go +++ b/pkg/kubectl/cmd/set/set_selector.go @@ -117,14 +117,20 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ o.mapper = mapper o.encoder = f.JSONEncoder() - o.builder = f.NewBuilder(). + o.builder = f.NewBuilder(!o.local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.fileOptions). Flatten() + if !o.local { + o.builder = o.builder. + ResourceTypeOrNameArgs(o.all, o.resources...). + Latest() + } + o.PrintObject = func(obj runtime.Object) error { - return f.PrintObject(cmd, mapper, obj, o.out) + return f.PrintObject(cmd, o.local, mapper, obj, o.out) } o.ClientForMapping = func(mapping *meta.RESTMapping) (resource.RESTClient, error) { return f.ClientForMapping(mapping) @@ -147,10 +153,6 @@ func (o *SelectorOptions) Validate() error { // RunSelector executes the command. func (o *SelectorOptions) RunSelector() error { - if !o.local { - o.builder = o.builder.ResourceTypeOrNameArgs(o.all, o.resources...). - Latest() - } r := o.builder.Do() err := r.Err() if err != nil { diff --git a/pkg/kubectl/cmd/set/set_subject.go b/pkg/kubectl/cmd/set/set_subject.go index 2ab3fc11c27..7b3b28badff 100644 --- a/pkg/kubectl/cmd/set/set_subject.go +++ b/pkg/kubectl/cmd/set/set_subject.go @@ -115,7 +115,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] o.ShortOutput = cmdutil.GetFlagString(cmd, "output") == "name" o.DryRun = cmdutil.GetDryRunFlag(cmd) o.PrintObject = func(mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { - return f.PrintObject(cmd, mapper, obj, out) + return f.PrintObject(cmd, o.Local, mapper, obj, out) } cmdNamespace, enforceNamespace, err := f.DefaultNamespace() @@ -123,11 +123,12 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] return err } - builder := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + builder := f.NewBuilder(!o.Local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). Flatten() + if !o.Local { builder = builder. SelectorParam(o.Selector). diff --git a/pkg/kubectl/cmd/stop.go b/pkg/kubectl/cmd/stop.go index 34c4d2ad7ee..51293472c66 100644 --- a/pkg/kubectl/cmd/stop.go +++ b/pkg/kubectl/cmd/stop.go @@ -83,8 +83,8 @@ func RunStop(f cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer return err } - mapper, typer := f.Object() - r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + mapper, _ := f.Object() + r := f.NewBuilder(true). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). ResourceTypeOrNameArgs(false, args...). diff --git a/pkg/kubectl/cmd/taint.go b/pkg/kubectl/cmd/taint.go index 4b98205cf9c..58d39d6528b 100644 --- a/pkg/kubectl/cmd/taint.go +++ b/pkg/kubectl/cmd/taint.go @@ -246,8 +246,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com if o.taintsToAdd, o.taintsToRemove, err = parseTaints(taintArgs); err != nil { return cmdutil.UsageError(cmd, err.Error()) } - mapper, typer := f.Object() - o.builder = resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). + o.builder = f.NewBuilder(true). ContinueOnError(). NamespaceParam(namespace).DefaultNamespace() if o.selector != "" { @@ -373,7 +372,7 @@ func (o TaintOptions) RunTaint() error { mapper, _ := o.f.Object() outputFormat := cmdutil.GetFlagString(o.cmd, "output") if outputFormat != "" { - return o.f.PrintObject(o.cmd, mapper, outputObj, o.out) + return o.f.PrintObject(o.cmd, false, mapper, outputObj, o.out) } cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, false, operation) diff --git a/pkg/kubectl/cmd/testing/BUILD b/pkg/kubectl/cmd/testing/BUILD index 7688a37df4b..edc93c205ea 100644 --- a/pkg/kubectl/cmd/testing/BUILD +++ b/pkg/kubectl/cmd/testing/BUILD @@ -29,6 +29,7 @@ go_library( "//vendor/github.com/spf13/pflag: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 797902741e3..48b5d52550e 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -29,6 +29,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/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -337,7 +338,7 @@ func (f *FakeFactory) Describer(*meta.RESTMapping) (printers.Describer, error) { return f.tf.Describer, f.tf.Err } -func (f *FakeFactory) PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { +func (f *FakeFactory) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { return f.tf.Printer, f.tf.Err } @@ -457,18 +458,31 @@ func (f *FakeFactory) BindFlags(flags *pflag.FlagSet) { func (f *FakeFactory) BindExternalFlags(flags *pflag.FlagSet) { } -func (f *FakeFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { +func (f *FakeFactory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { return nil } -func (f *FakeFactory) PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { +func (f *FakeFactory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { return f.tf.Printer, f.tf.Err } -func (f *FakeFactory) NewBuilder() *resource.Builder { +func (f *FakeFactory) NewBuilder(allowRemoteCalls bool) *resource.Builder { return nil } +func (f *FakeFactory) NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) { + if !allowRemoteCalls { + return f.NewBuilder(allowRemoteCalls), nil + } + + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return nil, err + } + + return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme), nil +} + func (f *FakeFactory) DefaultResourceFilterOptions(cmd *cobra.Command, withNamespace bool) *printers.PrintOptions { return &printers.PrintOptions{} } @@ -618,7 +632,7 @@ func (f *fakeAPIFactory) UnstructuredClientForMapping(m *meta.RESTMapping) (reso return f.tf.UnstructuredClient, f.tf.Err } -func (f *fakeAPIFactory) PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { +func (f *fakeAPIFactory) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { return f.tf.Printer, f.tf.Err } @@ -681,7 +695,7 @@ func (f *fakeAPIFactory) Generators(cmdName string) map[string]kubectl.Generator return cmdutil.DefaultGenerators(cmdName) } -func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { +func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { gvks, _, err := api.Scheme.ObjectKinds(obj) if err != nil { return err @@ -692,23 +706,36 @@ func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, return err } - printer, err := f.PrinterForMapping(cmd, nil, mapping, false) + printer, err := f.PrinterForMapping(cmd, isLocal, nil, mapping, false) if err != nil { return err } return printer.PrintObj(obj, out) } -func (f *fakeAPIFactory) PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { +func (f *fakeAPIFactory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { return f.tf.Printer, f.tf.Err } -func (f *fakeAPIFactory) NewBuilder() *resource.Builder { +func (f *fakeAPIFactory) NewBuilder(allowRemoteCalls bool) *resource.Builder { mapper, typer := f.Object() return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } +func (f *fakeAPIFactory) NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) { + if !allowRemoteCalls { + return f.NewBuilder(allowRemoteCalls), nil + } + + mapper, typer, err := f.UnstructuredObject() + if err != nil { + return nil, err + } + + return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme), nil +} + 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 96a0bca9dfd..df4b88b631b 100644 --- a/pkg/kubectl/cmd/util/editor/editoptions.go +++ b/pkg/kubectl/cmd/util/editor/editoptions.go @@ -104,7 +104,11 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args [] if err != nil { return err } - b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme) + + b, err := f.NewUnstructuredBuilder(true) + if err != nil { + return err + } 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() diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index d8edee96d68..05014de60d4 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -233,16 +233,18 @@ type BuilderFactory interface { // are declared on the command (see AddPrinterFlags). Returns a printer, or an error if a printer // could not be found. // TODO: Break the dependency on cmd here. - PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) + PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) // PrinterForMapping returns a printer suitable for displaying the provided resource type. // Requires that printer flags have been added to cmd (see AddPrinterFlags). // Returns a printer, true if the printer is generic (is not internal), or // an error if a printer could not be found. - PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) + PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) // PrintObject prints an api object given command line flags to modify the output format - PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error + PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error // One stop shopping for a Builder - NewBuilder() *resource.Builder + NewBuilder(allowRemoteCalls bool) *resource.Builder + // Resource builder for working with unstructured objects + NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) // 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 25451f4c611..52967300ca2 100644 --- a/pkg/kubectl/cmd/util/factory_builder.go +++ b/pkg/kubectl/cmd/util/factory_builder.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/kubectl/plugins" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/printers" @@ -48,10 +49,19 @@ func NewBuilderFactory(clientAccessFactory ClientAccessFactory, objectMappingFac return f } -func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { - mapper, typer, err := f.objectMappingFactory.UnstructuredObject() - if err != nil { - return nil, err +func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { + var mapper meta.RESTMapper + var typer runtime.ObjectTyper + var err error + + if isLocal { + mapper = api.Registry.RESTMapper() + typer = api.Scheme + } else { + mapper, typer, err = f.objectMappingFactory.UnstructuredObject() + if err != nil { + return nil, err + } } // TODO: used by the custom column implementation and the name implementation, break this dependency decoders := []runtime.Decoder{f.clientAccessFactory.Decoder(true), unstructured.UnstructuredJSONScheme} @@ -59,7 +69,7 @@ func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, outputOpts *printer return PrinterForCommand(cmd, outputOpts, mapper, typer, encoder, decoders, options) } -func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { +func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { // Some callers do not have "label-columns" so we can't use the GetFlagStringSlice() helper columnLabel, err := cmd.Flags().GetStringSlice("label-columns") if err != nil { @@ -76,7 +86,7 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printer ColumnLabels: columnLabel, } - printer, err := f.PrinterForCommand(cmd, outputOpts, options) + printer, err := f.PrinterForCommand(cmd, isLocal, outputOpts, options) if err != nil { return nil, err } @@ -108,7 +118,7 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printer return printer, nil } -func (f *ring2Factory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { +func (f *ring2Factory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { // try to get a typed object _, typer := f.objectMappingFactory.Object() gvks, _, err := typer.ObjectKinds(obj) @@ -132,18 +142,46 @@ func (f *ring2Factory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, o return err } - printer, err := f.PrinterForMapping(cmd, nil, mapping, false) + printer, err := f.PrinterForMapping(cmd, isLocal, nil, mapping, false) if err != nil { return err } return printer.PrintObj(obj, out) } -func (f *ring2Factory) NewBuilder() *resource.Builder { +// NewBuilder returns a new resource builder. +// Receives a bool flag and avoids remote calls if set to false +func (f *ring2Factory) NewBuilder(allowRemoteCalls bool) *resource.Builder { + var clientMapper resource.ClientMapper + clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping) + mapper, typer := f.objectMappingFactory.Object() categoryExpander := f.objectMappingFactory.CategoryExpander() - return resource.NewBuilder(mapper, categoryExpander, typer, resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping), f.clientAccessFactory.Decoder(true)) + if allowRemoteCalls { + clientMapper = clientMapperFunc + } else { + clientMapper = resource.DisabledClientForMapping{ClientMapper: clientMapperFunc} + } + + return resource.NewBuilder(mapper, categoryExpander, typer, clientMapper, f.clientAccessFactory.Decoder(true)) +} + +func (f *ring2Factory) NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) { + if !allowRemoteCalls { + return f.NewBuilder(allowRemoteCalls), nil + } + + clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.UnstructuredClientForMapping) + + mapper, typer, err := f.objectMappingFactory.UnstructuredObject() + if err != nil { + return nil, err + } + + categoryExpander := f.objectMappingFactory.CategoryExpander() + return resource.NewBuilder(mapper, categoryExpander, typer, clientMapperFunc, unstructured.UnstructuredJSONScheme), nil + } // PluginLoader loads plugins from a path set by the KUBECTL_PLUGINS_PATH env var. diff --git a/pkg/kubectl/cmd/util/printing.go b/pkg/kubectl/cmd/util/printing.go index 8e2c0785fff..93cbf36c847 100644 --- a/pkg/kubectl/cmd/util/printing.go +++ b/pkg/kubectl/cmd/util/printing.go @@ -129,12 +129,12 @@ func PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, m // object passed is non-generic, it attempts to print the object using a HumanReadablePrinter. // Requires that printer flags have been added to cmd (see AddPrinterFlags). func PrintResourceInfoForCommand(cmd *cobra.Command, info *resource.Info, f Factory, out io.Writer) error { - printer, err := f.PrinterForCommand(cmd, nil, printers.PrintOptions{}) + printer, err := f.PrinterForCommand(cmd, false, nil, printers.PrintOptions{}) if err != nil { return err } if !printer.IsGeneric() { - printer, err = f.PrinterForMapping(cmd, nil, nil, false) + printer, err = f.PrinterForMapping(cmd, false, nil, nil, false) if err != nil { return err }