From 7cdb0eb89f204be1250fc4e3352da5361ede9fb0 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Sun, 19 Feb 2017 17:37:48 -0500 Subject: [PATCH] NamePrinter should not hardcode scheme --- pkg/printers/internalversion/printers_test.go | 6 ++-- pkg/printers/name.go | 30 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 8905c8bdafe..55e5a98158f 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -131,7 +131,7 @@ func TestPrinter(t *testing.T) { {"test jsonpath", "jsonpath", "{.metadata.name}", podTest, []schema.GroupVersion{v1.SchemeGroupVersion}, "foo"}, {"test jsonpath list", "jsonpath", "{.items[*].metadata.name}", podListTest, []schema.GroupVersion{v1.SchemeGroupVersion}, "foo bar"}, {"test jsonpath empty list", "jsonpath", "{.items[*].metadata.name}", emptyListTest, []schema.GroupVersion{v1.SchemeGroupVersion}, ""}, - {"test name", "name", "", podTest, []schema.GroupVersion{v1.SchemeGroupVersion}, "pod/foo\n"}, + {"test name", "name", "", podTest, []schema.GroupVersion{v1.SchemeGroupVersion}, "pods/foo\n"}, {"emits versioned objects", "template", "{{.kind}}", testapi, []schema.GroupVersion{v1.SchemeGroupVersion}, "Pod"}, } for _, test := range printerTests { @@ -342,7 +342,7 @@ func TestNamePrinter(t *testing.T) { Name: "foo", }, }, - "pod/foo\n"}, + "pods/foo\n"}, "List": { &v1.List{ TypeMeta: metav1.TypeMeta{ @@ -357,7 +357,7 @@ func TestNamePrinter(t *testing.T) { }, }, }, - "pod/foo\npod/bar\n"}, + "pods/foo\npods/bar\n"}, } printer, _, _ := printers.GetStandardPrinter("name", "", false, false, api.Registry.RESTMapper(api.Registry.EnabledVersions()...), api.Scheme, []runtime.Decoder{api.Codecs.UniversalDecoder(), unstructured.UnstructuredJSONScheme}) for name, item := range tests { diff --git a/pkg/printers/name.go b/pkg/printers/name.go index 192eed4d941..22d2ba1707d 100644 --- a/pkg/printers/name.go +++ b/pkg/printers/name.go @@ -21,15 +21,15 @@ import ( "io" "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" utilerrors "k8s.io/apimachinery/pkg/util/errors" ) // NamePrinter is an implementation of ResourcePrinter which outputs "resource/name" pair of an object. type NamePrinter struct { - Decoder runtime.Decoder - Typer runtime.ObjectTyper + Decoders []runtime.Decoder + Typer runtime.ObjectTyper + Mapper meta.RESTMapper } func (p *NamePrinter) AfterPrint(w io.Writer, res string) error { @@ -44,7 +44,7 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { if err != nil { return err } - if errs := runtime.DecodeList(items, p.Decoder, unstructured.UnstructuredJSONScheme); len(errs) > 0 { + if errs := runtime.DecodeList(items, p.Decoders...); len(errs) > 0 { return utilerrors.NewAggregate(errs) } for _, obj := range items { @@ -62,22 +62,24 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { } } - if kind := obj.GetObjectKind().GroupVersionKind(); len(kind.Kind) == 0 { - // this is the old code. It's unnecessary on decoded external objects, but on internal objects - // you may have to do it. Tests are definitely calling it with internals and I'm not sure who else - // is + kind := obj.GetObjectKind().GroupVersionKind() + if len(kind.Kind) == 0 { if gvks, _, err := p.Typer.ObjectKinds(obj); err == nil { - // TODO: this is wrong, it assumes that meta knows about all Kinds - should take a RESTMapper - _, resource := meta.KindToResource(gvks[0]) - fmt.Fprintf(w, "%s/%s\n", resource.Resource, name) + for _, gvk := range gvks { + if mappings, err := p.Mapper.RESTMappings(gvk.GroupKind(), gvk.Version); err == nil && len(mappings) > 0 { + fmt.Fprintf(w, "%s/%s\n", mappings[0].Resource, name) + } + } } else { fmt.Fprintf(w, "/%s\n", name) } } else { - // TODO: this is wrong, it assumes that meta knows about all Kinds - should take a RESTMapper - _, resource := meta.KindToResource(kind) - fmt.Fprintf(w, "%s/%s\n", resource.Resource, name) + if mappings, err := p.Mapper.RESTMappings(kind.GroupKind(), kind.Version); err == nil && len(mappings) > 0 { + fmt.Fprintf(w, "%s/%s\n", mappings[0].Resource, name) + } else { + fmt.Fprintf(w, "/%s\n", name) + } } return nil