diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 8e06ff0f6f700..860f3d91e7157 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -138,18 +138,25 @@ func RunGet(f *Factory, out io.Writer, cmd *cobra.Command, args []string) { // the outermost object will be converted to the output-version version := util.OutputVersion(cmd, defaultVersion) - if len(version) == 0 { - // TODO: add a new ResourceBuilder mode for Object() that attempts to ensure the objects - // are in the appropriate version if one exists (and if not, use the best effort). - // TODO: ensure api-version is set with the default preferred api version by the client - // builder on initialization - version = latest.Version - } - printer = kubectl.NewVersionedPrinter(printer, api.Scheme, version) - obj, err := b.Flatten().Do().Object() + r := b.Flatten().Do() + obj, err := r.Object() checkErr(err) + // try conversion to all the possible versions + // TODO: simplify by adding a ResourceBuilder mode + versions := []string{version, latest.Version} + infos, _ := r.Infos() + for _, info := range infos { + versions = append(versions, info.Mapping.APIVersion) + } + + // TODO: add a new ResourceBuilder mode for Object() that attempts to ensure the objects + // are in the appropriate version if one exists (and if not, use the best effort). + // TODO: ensure api-version is set with the default preferred api version by the client + // builder on initialization + printer := kubectl.NewVersionedPrinter(printer, api.Scheme, versions...) + err = printer.PrintObj(obj, out) checkErr(err) return diff --git a/pkg/kubectl/resource_printer.go b/pkg/kubectl/resource_printer.go index ee2a385acd2b5..340c444ced025 100644 --- a/pkg/kubectl/resource_printer.go +++ b/pkg/kubectl/resource_printer.go @@ -32,6 +32,7 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/docker/docker/pkg/units" "github.com/ghodss/yaml" @@ -98,11 +99,11 @@ func (fn ResourcePrinterFunc) PrintObj(obj runtime.Object, w io.Writer) error { type VersionedPrinter struct { printer ResourcePrinter convertor runtime.ObjectConvertor - version string + version []string } // NewVersionedPrinter wraps a printer to convert objects to a known API version prior to printing. -func NewVersionedPrinter(printer ResourcePrinter, convertor runtime.ObjectConvertor, version string) ResourcePrinter { +func NewVersionedPrinter(printer ResourcePrinter, convertor runtime.ObjectConvertor, version ...string) ResourcePrinter { return &VersionedPrinter{ printer: printer, convertor: convertor, @@ -115,11 +116,20 @@ func (p *VersionedPrinter) PrintObj(obj runtime.Object, w io.Writer) error { if len(p.version) == 0 { return fmt.Errorf("no version specified, object cannot be converted") } - converted, err := p.convertor.ConvertToVersion(obj, p.version) - if err != nil { - return err + for _, version := range p.version { + if len(version) == 0 { + continue + } + converted, err := p.convertor.ConvertToVersion(obj, version) + if conversion.IsNotRegisteredError(err) { + continue + } + if err != nil { + return err + } + return p.printer.PrintObj(converted, w) } - return p.printer.PrintObj(converted, w) + return fmt.Errorf("the object cannot be converted to any of the versions: %v", p.version) } // JSONPrinter is an implementation of ResourcePrinter which outputs an object as JSON.