From 0164605d31041b655ef08a06f2b40d8bfe073e3b Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Mon, 14 May 2018 12:36:12 -0400 Subject: [PATCH] remove versioned printer --- pkg/kubectl/cmd/cmd_printing_test.go | 18 +++- pkg/kubectl/cmd/create/create.go | 12 +-- pkg/kubectl/cmd/create/create_clusterrole.go | 6 +- pkg/kubectl/cmd/create/create_role.go | 6 +- pkg/kubectl/cmd/get/get.go | 53 ++---------- pkg/kubectl/secret.go | 1 + pkg/kubectl/secret_test.go | 28 ++++++ pkg/printers/BUILD | 3 - pkg/printers/customcolumn_flags.go | 3 +- pkg/printers/internalversion/printers_test.go | 76 ++++++----------- pkg/printers/json_yaml_flags.go | 5 +- pkg/printers/versioned.go | 85 ------------------- 12 files changed, 95 insertions(+), 201 deletions(-) delete mode 100644 pkg/printers/versioned.go diff --git a/pkg/kubectl/cmd/cmd_printing_test.go b/pkg/kubectl/cmd/cmd_printing_test.go index 52b226af3e6..bf72094923d 100644 --- a/pkg/kubectl/cmd/cmd_printing_test.go +++ b/pkg/kubectl/cmd/cmd_printing_test.go @@ -56,17 +56,29 @@ func TestIllegalPackageSourceCheckerThroughPrintFlags(t *testing.T) { obj: internalPod(), }, { - name: "json printer: json printer is wrapped in a versioned printer - internal obj should be converted with no error", - expectInternalObjErr: false, + name: "json printer: object containing package path beginning with forbidden prefix is rejected", + expectInternalObjErr: true, output: "json", obj: internalPod(), }, { - name: "yaml printer: yaml printer is wrapped in a versioned printer - internal obj should be converted with no error", + name: "json printer: object containing package path with no forbidden prefix returns no error", expectInternalObjErr: false, + obj: externalPod(), + output: "json", + }, + { + name: "yaml printer: object containing package path beginning with forbidden prefix is rejected", + expectInternalObjErr: true, output: "yaml", obj: internalPod(), }, + { + name: "yaml printer: object containing package path with no forbidden prefix returns no error", + expectInternalObjErr: false, + obj: externalPod(), + output: "yaml", + }, } for _, tc := range testCases { diff --git a/pkg/kubectl/cmd/create/create.go b/pkg/kubectl/cmd/create/create.go index f60175301be..72fa60bd547 100644 --- a/pkg/kubectl/cmd/create/create.go +++ b/pkg/kubectl/cmd/create/create.go @@ -24,9 +24,9 @@ import ( "runtime" "strings" + "github.com/golang/glog" "github.com/spf13/cobra" - "github.com/golang/glog" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kruntime "k8s.io/apimachinery/pkg/runtime" @@ -40,6 +40,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/util/i18n" + "k8s.io/kubernetes/pkg/printers" ) type CreateOptions struct { @@ -350,7 +351,7 @@ type CreateSubcommandOptions struct { Mapper meta.RESTMapper DynamicClient dynamic.Interface - PrintObj func(obj kruntime.Object) error + PrintObj printers.ResourcePrinterFunc genericclioptions.IOStreams } @@ -381,8 +382,8 @@ func (o *CreateSubcommandOptions) Complete(f cmdutil.Factory, cmd *cobra.Command return err } - o.PrintObj = func(obj kruntime.Object) error { - return printer.PrintObj(obj, o.Out) + o.PrintObj = func(obj kruntime.Object, out io.Writer) error { + return printer.PrintObj(obj, out) } o.Namespace, o.EnforceNamespace, err = f.DefaultNamespace() @@ -426,6 +427,7 @@ func (o *CreateSubcommandOptions) Run() error { } asUnstructured := &unstructured.Unstructured{} + if err := legacyscheme.Scheme.Convert(obj, asUnstructured, nil); err != nil { return err } @@ -445,5 +447,5 @@ func (o *CreateSubcommandOptions) Run() error { } } - return o.PrintObj(obj) + return o.PrintObj(obj, o.Out) } diff --git a/pkg/kubectl/cmd/create/create_clusterrole.go b/pkg/kubectl/cmd/create/create_clusterrole.go index b4a860092c9..e87e771f120 100644 --- a/pkg/kubectl/cmd/create/create_clusterrole.go +++ b/pkg/kubectl/cmd/create/create_clusterrole.go @@ -23,6 +23,7 @@ import ( "github.com/spf13/cobra" rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" @@ -156,7 +157,10 @@ func (c *CreateClusterRoleOptions) Validate() error { } func (c *CreateClusterRoleOptions) RunCreateRole() error { - clusterRole := &rbacv1.ClusterRole{} + clusterRole := &rbacv1.ClusterRole{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: rbacv1.SchemeGroupVersion.String(), Kind: "ClusterRole"}, + } clusterRole.Name = c.Name rules, err := generateResourcePolicyRules(c.Mapper, c.Verbs, c.Resources, c.ResourceNames, c.NonResourceURLs) if err != nil { diff --git a/pkg/kubectl/cmd/create/create_role.go b/pkg/kubectl/cmd/create/create_role.go index 2f857200cdd..53243761dc0 100644 --- a/pkg/kubectl/cmd/create/create_role.go +++ b/pkg/kubectl/cmd/create/create_role.go @@ -24,6 +24,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" @@ -299,7 +300,10 @@ func (o *CreateRoleOptions) validateResource() error { } func (o *CreateRoleOptions) RunCreateRole() error { - role := &rbacv1.Role{} + role := &rbacv1.Role{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: rbacv1.SchemeGroupVersion.String(), Kind: "Role"}, + } role.Name = o.Name rules, err := generateResourcePolicyRules(o.Mapper, o.Verbs, o.Resources, o.ResourceNames, []string{}) if err != nil { diff --git a/pkg/kubectl/cmd/get/get.go b/pkg/kubectl/cmd/get/get.go index 8bed7793e67..9b70dcb09b2 100644 --- a/pkg/kubectl/cmd/get/get.go +++ b/pkg/kubectl/cmd/get/get.go @@ -21,7 +21,6 @@ import ( "fmt" "io" "net/url" - "strings" "github.com/golang/glog" "github.com/spf13/cobra" @@ -42,7 +41,6 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -420,6 +418,13 @@ func (o *GetOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []string) e lastMapping = mapping } + // ensure a versioned object is passed to the custom-columns printer + // if we are using OpenAPI columns to print + if o.PrintWithOpenAPICols { + printer.PrintObj(info.Object, w) + continue + } + internalObj, err := legacyscheme.Scheme.ConvertToVersion(info.Object, info.Mapping.GroupVersionKind.GroupKind().WithVersion(runtime.APIVersionInternal).GroupVersion()) if err != nil { // if there's an error, try to print what you have (mirrors old behavior). @@ -733,47 +738,3 @@ func shouldGetNewPrinterForMapping(printer printers.ResourcePrinter, lastMapping func cmdSpecifiesOutputFmt(cmd *cobra.Command) bool { return cmdutil.GetFlagString(cmd, "output") != "" } - -// outputOptsForMappingFromOpenAPI looks for the output format metatadata in the -// openapi schema and modifies the passed print options for the mapping if found. -func updatePrintOptionsForOpenAPI(f cmdutil.Factory, mapping *meta.RESTMapping, printOpts *printers.PrintOptions) bool { - - // user has not specified any output format, check if OpenAPI has - // default specification to print this resource type - api, err := f.OpenAPISchema() - if err != nil { - // Error getting schema - return false - } - // Found openapi metadata for this resource - schema := api.LookupResource(mapping.GroupVersionKind) - if schema == nil { - // Schema not found, return empty columns - return false - } - - columns, found := openapi.GetPrintColumns(schema.GetExtensions()) - if !found { - // Extension not found, return empty columns - return false - } - - return outputOptsFromStr(columns, printOpts) -} - -// outputOptsFromStr parses the print-column metadata and generates printer.OutputOptions object. -func outputOptsFromStr(columnStr string, printOpts *printers.PrintOptions) bool { - if columnStr == "" { - return false - } - parts := strings.SplitN(columnStr, "=", 2) - if len(parts) < 2 { - return false - } - - printOpts.OutputFormatType = parts[0] - printOpts.OutputFormatArgument = parts[1] - printOpts.AllowMissingKeys = true - - return true -} diff --git a/pkg/kubectl/secret.go b/pkg/kubectl/secret.go index 04c5ced232e..9a0ff5281d4 100644 --- a/pkg/kubectl/secret.go +++ b/pkg/kubectl/secret.go @@ -130,6 +130,7 @@ func (s SecretGeneratorV1) StructuredGenerate() (runtime.Object, error) { return nil, err } secret := &v1.Secret{} + secret.SetGroupVersionKind(v1.SchemeGroupVersion.WithKind("Secret")) secret.Name = s.Name secret.Data = map[string][]byte{} if len(s.Type) > 0 { diff --git a/pkg/kubectl/secret_test.go b/pkg/kubectl/secret_test.go index 15f3db0b4ff..43dd411a208 100644 --- a/pkg/kubectl/secret_test.go +++ b/pkg/kubectl/secret_test.go @@ -37,6 +37,8 @@ func TestSecretGenerate(t *testing.T) { "name": "foo", }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, @@ -50,6 +52,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo-949tdgdkgg", }, @@ -63,6 +67,8 @@ func TestSecretGenerate(t *testing.T) { "type": "my-type", }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, @@ -78,6 +84,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo-dg474f9t76", }, @@ -92,6 +100,8 @@ func TestSecretGenerate(t *testing.T) { "from-literal": []string{"key1=value1", "key2=value2"}, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, @@ -109,6 +119,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo-tf72c228m4", }, @@ -146,6 +158,8 @@ func TestSecretGenerate(t *testing.T) { "from-literal": []string{"key1==value1"}, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, @@ -162,6 +176,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "foo-fdcc8tkhh5", }, @@ -178,6 +194,8 @@ func TestSecretGenerate(t *testing.T) { "from-env-file": "file.env", }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "valid_env", }, @@ -196,6 +214,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "valid_env-bkb2m2965h", }, @@ -217,6 +237,8 @@ func TestSecretGenerate(t *testing.T) { "from-env-file": "file.env", }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "getenv", }, @@ -239,6 +261,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "getenv-m7kg2khdb4", }, @@ -272,6 +296,8 @@ func TestSecretGenerate(t *testing.T) { "from-env-file": "file.env", }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "with_spaces", }, @@ -289,6 +315,8 @@ func TestSecretGenerate(t *testing.T) { "append-hash": true, }, expected: &v1.Secret{ + // this is ok because we know exactly how we want to be serialized + TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"}, ObjectMeta: metav1.ObjectMeta{ Name: "with_spaces-4488d5b57d", }, diff --git a/pkg/printers/BUILD b/pkg/printers/BUILD index e40d3a4fd8b..5aca734a201 100644 --- a/pkg/printers/BUILD +++ b/pkg/printers/BUILD @@ -24,14 +24,11 @@ go_library( "tabwriter.go", "template.go", "template_flags.go", - "versioned.go", ], importpath = "k8s.io/kubernetes/pkg/printers", deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/kubectl/scheme:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/printers/customcolumn_flags.go b/pkg/printers/customcolumn_flags.go index 13843f07806..920835f64cd 100644 --- a/pkg/printers/customcolumn_flags.go +++ b/pkg/printers/customcolumn_flags.go @@ -23,7 +23,6 @@ import ( "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/scheme" ) @@ -84,7 +83,7 @@ func (f *CustomColumnsPrintFlags) ToPrinter(templateFormat string) (ResourcePrin } p, err := NewCustomColumnsPrinterFromSpec(templateValue, decoder, f.NoHeaders) - return NewVersionedPrinter(p, legacyscheme.Scheme, legacyscheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...), err + return p, err } // AddFlags receives a *cobra.Command reference and binds diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index b8f001d8764..cfecaa21105 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -78,27 +78,6 @@ func (in *TestStruct) DeepCopyObject() runtime.Object { panic("never called") } -func TestVersionedPrinter(t *testing.T) { - original := &TestPrintType{Data: "value"} - p := printers.NewVersionedPrinter( - printers.ResourcePrinterFunc(func(obj runtime.Object, w io.Writer) error { - if obj == original { - t.Fatalf("object should not be identical: %#v", obj) - } - if obj.(*TestPrintType).Data != "value" { - t.Fatalf("object was not converted: %#v", obj) - } - return nil - }), - legacyscheme.Scheme, - legacyscheme.Scheme, - schema.GroupVersion{Group: "", Version: "v1"}, - ) - if err := p.PrintObj(original, nil); err != nil { - t.Errorf("unexpected error: %v", err) - } -} - func TestPrintUnstructuredObject(t *testing.T) { obj := &unstructured.Unstructured{ Object: map[string]interface{}{ @@ -438,15 +417,15 @@ func TestNamePrinter(t *testing.T) { func TestTemplateStrings(t *testing.T) { // This unit tests the "exists" function as well as the template from update.sh table := map[string]struct { - pod api.Pod + pod v1.Pod expect string }{ - "nilInfo": {api.Pod{}, "false"}, - "emptyInfo": {api.Pod{Status: api.PodStatus{ContainerStatuses: []api.ContainerStatus{}}}, "false"}, + "nilInfo": {v1.Pod{}, "false"}, + "emptyInfo": {v1.Pod{Status: v1.PodStatus{ContainerStatuses: []v1.ContainerStatus{}}}, "false"}, "fooExists": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ + v1.Pod{ + Status: v1.PodStatus{ + ContainerStatuses: []v1.ContainerStatus{ { Name: "foo", }, @@ -456,9 +435,9 @@ func TestTemplateStrings(t *testing.T) { "false", }, "barExists": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ + v1.Pod{ + Status: v1.PodStatus{ + ContainerStatuses: []v1.ContainerStatus{ { Name: "bar", }, @@ -468,9 +447,9 @@ func TestTemplateStrings(t *testing.T) { "false", }, "bothExist": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ + v1.Pod{ + Status: v1.PodStatus{ + ContainerStatuses: []v1.ContainerStatus{ { Name: "foo", }, @@ -483,16 +462,16 @@ func TestTemplateStrings(t *testing.T) { "false", }, "barValid": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ + v1.Pod{ + Status: v1.PodStatus{ + ContainerStatuses: []v1.ContainerStatus{ { Name: "foo", }, { Name: "bar", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ + State: v1.ContainerState{ + Running: &v1.ContainerStateRunning{ StartedAt: metav1.Time{}, }, }, @@ -503,21 +482,21 @@ func TestTemplateStrings(t *testing.T) { "false", }, "bothValid": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ + v1.Pod{ + Status: v1.PodStatus{ + ContainerStatuses: []v1.ContainerStatus{ { Name: "foo", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ + State: v1.ContainerState{ + Running: &v1.ContainerStateRunning{ StartedAt: metav1.Time{}, }, }, }, { Name: "bar", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ + State: v1.ContainerState{ + Running: &v1.ContainerStateRunning{ StartedAt: metav1.Time{}, }, }, @@ -530,13 +509,11 @@ func TestTemplateStrings(t *testing.T) { } // The point of this test is to verify that the below template works. tmpl := `{{if (exists . "status" "containerStatuses")}}{{range .status.containerStatuses}}{{if (and (eq .name "foo") (exists . "state" "running"))}}true{{end}}{{end}}{{end}}` - p, err := printers.NewGoTemplatePrinter([]byte(tmpl)) + printer, err := printers.NewGoTemplatePrinter([]byte(tmpl)) if err != nil { t.Fatalf("tmpl fail: %v", err) } - printer := printers.NewVersionedPrinter(p, legacyscheme.Scheme, legacyscheme.Scheme, schema.GroupVersion{Group: "", Version: "v1"}) - for name, item := range table { buffer := &bytes.Buffer{} err = printer.PrintObj(&item.pod, buffer) @@ -568,19 +545,16 @@ func TestPrinters(t *testing.T) { if err != nil { t.Fatal(err) } - templatePrinter = printers.NewVersionedPrinter(templatePrinter, legacyscheme.Scheme, legacyscheme.Scheme, v1.SchemeGroupVersion) templatePrinter2, err = printers.NewGoTemplatePrinter([]byte("{{len .items}}")) if err != nil { t.Fatal(err) } - templatePrinter2 = printers.NewVersionedPrinter(templatePrinter2, legacyscheme.Scheme, legacyscheme.Scheme, v1.SchemeGroupVersion) jsonpathPrinter, err = printers.NewJSONPathPrinter("{.metadata.name}") if err != nil { t.Fatal(err) } - jsonpathPrinter = printers.NewVersionedPrinter(jsonpathPrinter, legacyscheme.Scheme, legacyscheme.Scheme, v1.SchemeGroupVersion) genericPrinters := map[string]printers.ResourcePrinter{ "json": &printers.JSONPrinter{}, diff --git a/pkg/printers/json_yaml_flags.go b/pkg/printers/json_yaml_flags.go index 158cd20e669..26a4a09aa74 100644 --- a/pkg/printers/json_yaml_flags.go +++ b/pkg/printers/json_yaml_flags.go @@ -22,7 +22,6 @@ import ( "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/runtime" - kubectlscheme "k8s.io/kubernetes/pkg/kubectl/scheme" ) // JSONYamlPrintFlags provides default flags necessary for json/yaml printing. @@ -49,9 +48,7 @@ func (f *JSONYamlPrintFlags) ToPrinter(outputFormat string) (ResourcePrinter, er return nil, NoCompatiblePrinterError{Options: f, OutputFormat: &outputFormat} } - // wrap the printer in a versioning printer that understands when to convert and when not to convert - return NewVersionedPrinter(printer, f.Scheme, f.Scheme.(runtime.ObjectTyper), kubectlscheme.Scheme.PrioritizedVersionsAllGroups()...), nil - + return printer, nil } // AddFlags receives a *cobra.Command reference and binds diff --git a/pkg/printers/versioned.go b/pkg/printers/versioned.go deleted file mode 100644 index c2951a419e7..00000000000 --- a/pkg/printers/versioned.go +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package printers - -import ( - "fmt" - "io" - - "github.com/golang/glog" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// VersionedPrinter takes runtime objects and ensures they are converted to a given API version -// prior to being passed to a nested printer. -type VersionedPrinter struct { - printer ResourcePrinter - converter runtime.ObjectConvertor - typer runtime.ObjectTyper - versions []schema.GroupVersion -} - -// NewVersionedPrinter wraps a printer to convert objects to a known API version prior to printing. -func NewVersionedPrinter(printer ResourcePrinter, converter runtime.ObjectConvertor, typer runtime.ObjectTyper, versions ...schema.GroupVersion) ResourcePrinter { - return &VersionedPrinter{ - printer: printer, - converter: converter, - typer: typer, - versions: versions, - } -} - -// PrintObj implements ResourcePrinter -func (p *VersionedPrinter) PrintObj(obj runtime.Object, w io.Writer) error { - // if we're unstructured, no conversion necessary - if _, ok := obj.(*unstructured.Unstructured); ok { - return p.printer.PrintObj(obj, w) - } - - // if we're already external, no conversion necessary - gvks, _, err := p.typer.ObjectKinds(obj) - if err != nil { - glog.V(1).Infof("error determining type for %T, using passed object: %v", obj, err) - return p.printer.PrintObj(obj, w) - } - needsConversion := false - for _, gvk := range gvks { - if len(gvk.Version) == 0 || gvk.Version == runtime.APIVersionInternal { - needsConversion = true - } - } - - if !needsConversion { - // We might be an external type, but have empty kind/apiVersion fields. Ensure they are populated before printing. - if obj.GetObjectKind().GroupVersionKind().Empty() { - obj = obj.DeepCopyObject() - obj.GetObjectKind().SetGroupVersionKind(gvks[0]) - } - return p.printer.PrintObj(obj, w) - } - - if len(p.versions) == 0 { - return fmt.Errorf("no version specified, object cannot be converted") - } - converted, err := p.converter.ConvertToVersion(obj, schema.GroupVersions(p.versions)) - if err != nil { - return err - } - return p.printer.PrintObj(converted, w) -}