From dac09311b848a621a485c3ad5f08d500c6fe334f Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Wed, 27 Apr 2016 13:54:15 -0700 Subject: [PATCH] Add support for labelling 3rd party objects --- pkg/kubectl/cmd/annotate.go | 2 +- pkg/kubectl/cmd/label.go | 2 +- pkg/kubectl/cmd/util/helpers.go | 13 +++++++ pkg/kubectl/cmd/util/helpers_test.go | 52 ++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/pkg/kubectl/cmd/annotate.go b/pkg/kubectl/cmd/annotate.go index b2e4e3051d..50d0806e4e 100644 --- a/pkg/kubectl/cmd/annotate.go +++ b/pkg/kubectl/cmd/annotate.go @@ -210,7 +210,7 @@ func (o AnnotateOptions) RunAnnotate() error { return err } - obj, err := info.Mapping.ConvertToVersion(info.Object, info.Mapping.GroupVersionKind.GroupVersion()) + obj, err := cmdutil.MaybeConvertObject(info.Object, info.Mapping.GroupVersionKind.GroupVersion(), info.Mapping) if err != nil { return err } diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index 8d87b91396..ee8ade2e46 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -237,7 +237,7 @@ func RunLabel(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri } outputObj = info.Object } else { - obj, err := info.Mapping.ConvertToVersion(info.Object, info.Mapping.GroupVersionKind.GroupVersion()) + obj, err := cmdutil.MaybeConvertObject(info.Object, info.Mapping.GroupVersionKind.GroupVersion(), info.Mapping) if err != nil { return err } diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index d65841e2f3..0bd5d74b59 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apimachinery/registered" + "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/kubectl" @@ -594,3 +595,15 @@ func ParsePairs(pairArgs []string, pairType string, supportRemove bool) (newPair return } + +// MaybeConvertObject attempts to convert an object to a specific group/version. If the object is +// a third party resource it is simply passed through. +func MaybeConvertObject(obj runtime.Object, gv unversioned.GroupVersion, converter runtime.ObjectConvertor) (runtime.Object, error) { + switch obj.(type) { + case *extensions.ThirdPartyResourceData: + // conversion is not supported for 3rd party objects + return obj, nil + default: + return converter.ConvertToVersion(obj, gv) + } +} diff --git a/pkg/kubectl/cmd/util/helpers_test.go b/pkg/kubectl/cmd/util/helpers_test.go index 95c68070d9..2e2ec7353f 100644 --- a/pkg/kubectl/cmd/util/helpers_test.go +++ b/pkg/kubectl/cmd/util/helpers_test.go @@ -31,6 +31,8 @@ import ( "k8s.io/kubernetes/pkg/api/testapi" apitesting "k8s.io/kubernetes/pkg/api/testing" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -302,3 +304,53 @@ func TestDumpReaderToFile(t *testing.T) { t.Fatalf("Wrong file content %s != %s", testString, stringData) } } + +func TestMaybeConvert(t *testing.T) { + tests := []struct { + input runtime.Object + gv unversioned.GroupVersion + expected runtime.Object + }{ + { + input: &api.Pod{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + }, + gv: unversioned.GroupVersion{Group: "", Version: "v1"}, + expected: &v1.Pod{ + TypeMeta: unversioned.TypeMeta{ + APIVersion: "v1", + Kind: "Pod", + }, + ObjectMeta: v1.ObjectMeta{ + Name: "foo", + }, + }, + }, + { + input: &extensions.ThirdPartyResourceData{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + Data: []byte("this is some data"), + }, + expected: &extensions.ThirdPartyResourceData{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + Data: []byte("this is some data"), + }, + }, + } + + for _, test := range tests { + obj, err := MaybeConvertObject(test.input, test.gv, testapi.Default.Converter()) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if !reflect.DeepEqual(test.expected, obj) { + t.Errorf("expected:\n%#v\nsaw:\n%#v\n", test.expected, obj) + } + } +}