From f39fe2056df3d44ffbe66954433741eddbb6ba1b Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Tue, 13 Oct 2015 11:36:22 -0700 Subject: [PATCH] Keep Flatten() and format output earlier in kubectl get --- pkg/kubectl/cmd/get.go | 18 +++++++++++++++--- pkg/kubectl/resource_printer.go | 17 ++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 2b434cb0b0..536aff9780 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -19,8 +19,10 @@ package cmd import ( "fmt" "io" + "text/tabwriter" "github.com/spf13/cobra" + "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/resource" @@ -220,13 +222,23 @@ func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string } // use the default printer for each object + printer = nil + var lastMapping *meta.RESTMapping + w := tabwriter.NewWriter(out, kubectl.TabwriterMinWidth, kubectl.TabwriterWidth, kubectl.TabwriterPadding, kubectl.TabwriterPadChar, kubectl.TabwriterFlags) + defer w.Flush() return b.Flatten().Do().Visit(func(r *resource.Info, err error) error { if err != nil { return err } - printer, err := f.PrinterForMapping(cmd, r.Mapping, allNamespaces) - if err != nil { - return err + if printer == nil || lastMapping == nil || r.Mapping == nil || r.Mapping.Resource != lastMapping.Resource { + printer, err = f.PrinterForMapping(cmd, r.Mapping, allNamespaces) + if err != nil { + return err + } + lastMapping = r.Mapping + } + if _, found := printer.(*kubectl.HumanReadablePrinter); found { + return printer.PrintObj(r.Object, w) } return printer.PrintObj(r.Object, out) }) diff --git a/pkg/kubectl/resource_printer.go b/pkg/kubectl/resource_printer.go index b90384090d..75d2b1716e 100644 --- a/pkg/kubectl/resource_printer.go +++ b/pkg/kubectl/resource_printer.go @@ -46,11 +46,11 @@ import ( ) const ( - tabwriterMinWidth = 10 - tabwriterWidth = 4 - tabwriterPadding = 3 - tabwriterPadChar = ' ' - tabwriterFlags = 0 + TabwriterMinWidth = 10 + TabwriterWidth = 4 + TabwriterPadding = 3 + TabwriterPadChar = ' ' + TabwriterFlags = 0 ) // GetPrinter takes a format type, an optional format argument. It will return true @@ -1477,8 +1477,11 @@ func formatWideHeaders(wide bool, t reflect.Type) []string { // PrintObj prints the obj in a human-friendly format according to the type of the obj. func (h *HumanReadablePrinter) PrintObj(obj runtime.Object, output io.Writer) error { - w := tabwriter.NewWriter(output, tabwriterMinWidth, tabwriterWidth, tabwriterPadding, tabwriterPadChar, tabwriterFlags) - defer w.Flush() + w, found := output.(*tabwriter.Writer) + if !found { + w = tabwriter.NewWriter(output, TabwriterMinWidth, TabwriterWidth, TabwriterPadding, TabwriterPadChar, TabwriterFlags) + defer w.Flush() + } t := reflect.TypeOf(obj) if handler := h.handlerMap[t]; handler != nil { if !h.noHeaders && t != h.lastType {