Enumerate all versions when looking for an output conversion

Ensures that all objects can be printed, even if they don't
match output-version (because they are only implemented in
a newer API version).
This commit is contained in:
Clayton Coleman 2015-03-03 22:18:15 -05:00
parent a52b0f2619
commit b799e8cd3a
2 changed files with 32 additions and 15 deletions

View File

@ -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

View File

@ -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.