Skip to content

Commit

Permalink
Enumerate all versions when looking for an output conversion
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
smarterclayton committed Mar 4, 2015
1 parent a52b0f2 commit b799e8c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 15 deletions.
25 changes: 16 additions & 9 deletions pkg/kubectl/cmd/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 16 additions & 6 deletions pkg/kubectl/resource_printer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand All @@ -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.
Expand Down

0 comments on commit b799e8c

Please sign in to comment.