From 420dd9bf667585cc516e25909c21a4c7ed7797c7 Mon Sep 17 00:00:00 2001 From: David Eads Date: Wed, 16 May 2018 14:19:21 -0400 Subject: [PATCH] move type setting into an optional layer above normal printing --- pkg/kubectl/cmd/annotate.go | 4 +- pkg/kubectl/cmd/apply.go | 3 +- pkg/kubectl/cmd/apply_set_last_applied.go | 4 +- pkg/kubectl/cmd/auth/BUILD | 1 + pkg/kubectl/cmd/auth/reconcile.go | 3 +- pkg/kubectl/cmd/autoscale.go | 3 +- pkg/kubectl/cmd/certificates.go | 5 +- pkg/kubectl/cmd/clusterinfo_dump.go | 4 +- pkg/kubectl/cmd/cmd_printing_test.go | 3 +- pkg/kubectl/cmd/config/flags.go | 16 ++-- pkg/kubectl/cmd/convert.go | 2 +- pkg/kubectl/cmd/create/flags.go | 16 ++-- pkg/kubectl/cmd/drain.go | 7 +- pkg/kubectl/cmd/drain_test.go | 2 +- pkg/kubectl/cmd/expose.go | 3 +- pkg/kubectl/cmd/get/get_flags.go | 4 +- pkg/kubectl/cmd/label.go | 4 +- pkg/kubectl/cmd/patch.go | 3 +- pkg/kubectl/cmd/replace.go | 3 +- pkg/kubectl/cmd/rollingupdate.go | 3 +- pkg/kubectl/cmd/rollout/BUILD | 1 + pkg/kubectl/cmd/rollout/rollout_pause.go | 3 +- pkg/kubectl/cmd/rollout/rollout_resume.go | 3 +- pkg/kubectl/cmd/rollout/rollout_undo.go | 3 +- pkg/kubectl/cmd/run.go | 2 +- pkg/kubectl/cmd/run_test.go | 4 +- pkg/kubectl/cmd/scale.go | 3 +- pkg/kubectl/cmd/set/BUILD | 1 - pkg/kubectl/cmd/set/set_env.go | 3 +- pkg/kubectl/cmd/set/set_env_test.go | 18 +--- pkg/kubectl/cmd/set/set_image.go | 3 +- pkg/kubectl/cmd/set/set_image_test.go | 26 +---- pkg/kubectl/cmd/set/set_resources.go | 3 +- pkg/kubectl/cmd/set/set_resources_test.go | 21 +--- pkg/kubectl/cmd/set/set_selector.go | 3 +- pkg/kubectl/cmd/set/set_serviceaccount.go | 3 +- .../cmd/set/set_serviceaccount_test.go | 30 +----- pkg/kubectl/cmd/set/set_subject.go | 3 +- pkg/kubectl/cmd/taint.go | 3 +- pkg/kubectl/cmd/util/editor/BUILD | 1 - pkg/kubectl/cmd/util/editor/editoptions.go | 3 +- pkg/printers/BUILD | 1 + pkg/printers/flags.go | 19 ++-- pkg/printers/internalversion/printers_test.go | 48 ++++------ pkg/printers/json_yaml_flags.go | 7 +- pkg/printers/json_yaml_flags_test.go | 8 +- pkg/printers/name.go | 26 ++--- pkg/printers/name_flags.go | 9 +- pkg/printers/name_flags_test.go | 5 +- pkg/printers/typesetter.go | 95 +++++++++++++++++++ 50 files changed, 239 insertions(+), 212 deletions(-) create mode 100644 pkg/printers/typesetter.go diff --git a/pkg/kubectl/cmd/annotate.go b/pkg/kubectl/cmd/annotate.go index cdeb95ef4c..755a4d7956 100644 --- a/pkg/kubectl/cmd/annotate.go +++ b/pkg/kubectl/cmd/annotate.go @@ -31,12 +31,12 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/json" - "k8s.io/kubernetes/pkg/api/legacyscheme" "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/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -111,7 +111,7 @@ var ( func NewAnnotateOptions(ioStreams genericclioptions.IOStreams) *AnnotateOptions { return &AnnotateOptions{ - PrintFlags: printers.NewPrintFlags("annotated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("annotated").WithTypeSetter(scheme.Scheme), RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index 1860150c1a..e93caf5372 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -42,7 +42,6 @@ import ( "k8s.io/client-go/dynamic" scaleclient "k8s.io/client-go/scale" oapi "k8s.io/kube-openapi/pkg/util/proto" - "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/kubectl" @@ -132,7 +131,7 @@ func NewApplyOptions(ioStreams genericclioptions.IOStreams) *ApplyOptions { return &ApplyOptions{ RecordFlags: genericclioptions.NewRecordFlags(), DeleteFlags: NewDeleteFlags("that contains the configuration to apply"), - PrintFlags: printers.NewPrintFlags("created", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("created").WithTypeSetter(scheme.Scheme), Overwrite: true, OpenApiPatch: true, diff --git a/pkg/kubectl/cmd/apply_set_last_applied.go b/pkg/kubectl/cmd/apply_set_last_applied.go index f7b6e8773a..c6643af2da 100644 --- a/pkg/kubectl/cmd/apply_set_last_applied.go +++ b/pkg/kubectl/cmd/apply_set_last_applied.go @@ -26,13 +26,13 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/kubernetes/pkg/api/legacyscheme" "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/editor" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -83,7 +83,7 @@ var ( func NewSetLastAppliedOptions(ioStreams genericclioptions.IOStreams) *SetLastAppliedOptions { return &SetLastAppliedOptions{ - PrintFlags: printers.NewPrintFlags("configured", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("configured").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } } diff --git a/pkg/kubectl/cmd/auth/BUILD b/pkg/kubectl/cmd/auth/BUILD index 7d6a163f88..a56b7c5c59 100644 --- a/pkg/kubectl/cmd/auth/BUILD +++ b/pkg/kubectl/cmd/auth/BUILD @@ -26,6 +26,7 @@ go_library( "//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/genericclioptions:go_default_library", "//pkg/kubectl/genericclioptions/resource:go_default_library", + "//pkg/kubectl/scheme:go_default_library", "//pkg/printers:go_default_library", "//pkg/registry/rbac/reconciliation:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/kubectl/cmd/auth/reconcile.go b/pkg/kubectl/cmd/auth/reconcile.go index 7e9a476981..fd82e2ccdc 100644 --- a/pkg/kubectl/cmd/auth/reconcile.go +++ b/pkg/kubectl/cmd/auth/reconcile.go @@ -30,6 +30,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/printers" "k8s.io/kubernetes/pkg/registry/rbac/reconciliation" ) @@ -63,7 +64,7 @@ var ( func NewReconcileOptions(ioStreams genericclioptions.IOStreams) *ReconcileOptions { return &ReconcileOptions{ FilenameOptions: &resource.FilenameOptions{}, - PrintFlags: printers.NewPrintFlags("reconciled", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("reconciled").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } } diff --git a/pkg/kubectl/cmd/autoscale.go b/pkg/kubectl/cmd/autoscale.go index 81bef6cb22..e9c0708ca5 100644 --- a/pkg/kubectl/cmd/autoscale.go +++ b/pkg/kubectl/cmd/autoscale.go @@ -32,6 +32,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -82,7 +83,7 @@ type AutoscaleOptions struct { func NewAutoscaleOptions(ioStreams genericclioptions.IOStreams) *AutoscaleOptions { return &AutoscaleOptions{ - PrintFlags: printers.NewPrintFlags("autoscaled", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("autoscaled").WithTypeSetter(scheme.Scheme), FilenameOptions: &resource.FilenameOptions{}, RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, diff --git a/pkg/kubectl/cmd/certificates.go b/pkg/kubectl/cmd/certificates.go index e7534f7edf..08648ee850 100644 --- a/pkg/kubectl/cmd/certificates.go +++ b/pkg/kubectl/cmd/certificates.go @@ -30,6 +30,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" @@ -99,7 +100,7 @@ func (o *CertificateOptions) Validate() error { func NewCmdCertificateApprove(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { options := CertificateOptions{ - PrintFlags: printers.NewPrintFlags("approved", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("approved").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } cmd := &cobra.Command{ @@ -156,7 +157,7 @@ func (o *CertificateOptions) RunCertificateApprove(force bool) error { func NewCmdCertificateDeny(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { options := CertificateOptions{ - PrintFlags: printers.NewPrintFlags("denied", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("denied").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } cmd := &cobra.Command{ diff --git a/pkg/kubectl/cmd/clusterinfo_dump.go b/pkg/kubectl/cmd/clusterinfo_dump.go index e263c3ec14..11efb49fd9 100644 --- a/pkg/kubectl/cmd/clusterinfo_dump.go +++ b/pkg/kubectl/cmd/clusterinfo_dump.go @@ -26,13 +26,13 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/polymorphichelpers" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -57,7 +57,7 @@ type ClusterInfoDumpOptions struct { // NewCmdCreateSecret groups subcommands to create various types of secrets func NewCmdClusterInfoDump(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { o := &ClusterInfoDumpOptions{ - PrintFlags: printers.NewPrintFlags("", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } diff --git a/pkg/kubectl/cmd/cmd_printing_test.go b/pkg/kubectl/cmd/cmd_printing_test.go index bf72094923..4f0948b0d8 100644 --- a/pkg/kubectl/cmd/cmd_printing_test.go +++ b/pkg/kubectl/cmd/cmd_printing_test.go @@ -23,7 +23,6 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/printers" @@ -82,7 +81,7 @@ func TestIllegalPackageSourceCheckerThroughPrintFlags(t *testing.T) { } for _, tc := range testCases { - printFlags := printers.NewPrintFlags("succeeded", legacyscheme.Scheme) + printFlags := printers.NewPrintFlags("succeeded").WithTypeSetter(scheme.Scheme) printFlags.OutputFormat = &tc.output printer, err := printFlags.ToPrinter() diff --git a/pkg/kubectl/cmd/config/flags.go b/pkg/kubectl/cmd/config/flags.go index 0473f9c041..d9ed0b8bd2 100644 --- a/pkg/kubectl/cmd/config/flags.go +++ b/pkg/kubectl/cmd/config/flags.go @@ -31,6 +31,8 @@ type kubectlConfigPrintFlags struct { NamePrintFlags *printers.NamePrintFlags TemplateFlags *printers.KubeTemplatePrintFlags + TypeSetter *printers.TypeSetterPrinter + OutputFormat *string } @@ -45,15 +47,15 @@ func (f *kubectlConfigPrintFlags) ToPrinter() (printers.ResourcePrinter, error) } if p, err := f.JSONYamlPrintFlags.ToPrinter(outputFormat); !printers.IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetter.WrapToPrinter(p, err) } if p, err := f.NamePrintFlags.ToPrinter(outputFormat); !printers.IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetter.WrapToPrinter(p, err) } if p, err := f.TemplateFlags.ToPrinter(outputFormat); !printers.IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetter.WrapToPrinter(p, err) } return nil, printers.NoCompatiblePrinterError{Options: f} @@ -75,14 +77,16 @@ func (f *kubectlConfigPrintFlags) WithDefaultOutput(output string) *kubectlConfi return f } -func newKubeConfigPrintFlags(scheme runtime.ObjectConvertor) *kubectlConfigPrintFlags { +func newKubeConfigPrintFlags(scheme runtime.ObjectTyper) *kubectlConfigPrintFlags { outputFormat := "" return &kubectlConfigPrintFlags{ OutputFormat: &outputFormat, - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(), + NamePrintFlags: printers.NewNamePrintFlags(""), TemplateFlags: printers.NewKubeTemplatePrintFlags(), + + TypeSetter: printers.NewTypeSetter(scheme), } } diff --git a/pkg/kubectl/cmd/convert.go b/pkg/kubectl/cmd/convert.go index 66f4027877..c6148c3394 100644 --- a/pkg/kubectl/cmd/convert.go +++ b/pkg/kubectl/cmd/convert.go @@ -103,7 +103,7 @@ type ConvertOptions struct { func NewConvertOptions(ioStreams genericclioptions.IOStreams) *ConvertOptions { return &ConvertOptions{ - PrintFlags: printers.NewPrintFlags("converted", scheme.Scheme).WithDefaultOutput("yaml"), + PrintFlags: printers.NewPrintFlags("converted").WithTypeSetter(scheme.Scheme).WithDefaultOutput("yaml"), local: true, IOStreams: ioStreams, } diff --git a/pkg/kubectl/cmd/create/flags.go b/pkg/kubectl/cmd/create/flags.go index 5d4133bab9..f0ee0c608f 100644 --- a/pkg/kubectl/cmd/create/flags.go +++ b/pkg/kubectl/cmd/create/flags.go @@ -31,6 +31,8 @@ type PrintFlags struct { NamePrintFlags *printers.NamePrintFlags TemplateFlags *printers.KubeTemplatePrintFlags + TypeSetter *printers.TypeSetterPrinter + OutputFormat *string } @@ -45,15 +47,15 @@ func (f *PrintFlags) ToPrinter() (printers.ResourcePrinter, error) { } if p, err := f.JSONYamlPrintFlags.ToPrinter(outputFormat); !printers.IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetter.WrapToPrinter(p, err) } if p, err := f.NamePrintFlags.ToPrinter(outputFormat); !printers.IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetter.WrapToPrinter(p, err) } if p, err := f.TemplateFlags.ToPrinter(outputFormat); !printers.IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetter.WrapToPrinter(p, err) } return nil, printers.NoCompatiblePrinterError{Options: f} @@ -69,14 +71,16 @@ func (f *PrintFlags) AddFlags(cmd *cobra.Command) { } } -func NewPrintFlags(operation string, scheme runtime.ObjectConvertor) *PrintFlags { +func NewPrintFlags(operation string, scheme runtime.ObjectTyper) *PrintFlags { outputFormat := "" return &PrintFlags{ OutputFormat: &outputFormat, - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme), - NamePrintFlags: printers.NewNamePrintFlags(operation, scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(), + NamePrintFlags: printers.NewNamePrintFlags(operation), TemplateFlags: printers.NewKubeTemplatePrintFlags(), + + TypeSetter: printers.NewTypeSetter(scheme), } } diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 3ae1bd0adb..e895bf4dfe 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -41,6 +41,7 @@ import ( "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/kubernetes/pkg/api/legacyscheme" @@ -107,7 +108,7 @@ var ( func NewCmdCordon(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { options := &DrainOptions{ - PrintFlags: printers.NewPrintFlags("cordoned", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("cordoned").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } @@ -139,7 +140,7 @@ var ( func NewCmdUncordon(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { options := &DrainOptions{ - PrintFlags: printers.NewPrintFlags("uncordoned", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("uncordoned").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } @@ -195,7 +196,7 @@ var ( func NewDrainOptions(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *DrainOptions { return &DrainOptions{ - PrintFlags: printers.NewPrintFlags("drained", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("drained").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, backOff: clockwork.NewRealClock(), diff --git a/pkg/kubectl/cmd/drain_test.go b/pkg/kubectl/cmd/drain_test.go index 55713f12ab..80bf4cb10f 100644 --- a/pkg/kubectl/cmd/drain_test.go +++ b/pkg/kubectl/cmd/drain_test.go @@ -834,7 +834,7 @@ func TestDeletePods(t *testing.T) { defer tf.Cleanup() o := DrainOptions{ - PrintFlags: printers.NewPrintFlags("drained", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("drained").WithTypeSetter(scheme.Scheme), } o.Out = os.Stdout diff --git a/pkg/kubectl/cmd/expose.go b/pkg/kubectl/cmd/expose.go index 23fd797364..b35ceba428 100644 --- a/pkg/kubectl/cmd/expose.go +++ b/pkg/kubectl/cmd/expose.go @@ -36,6 +36,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -110,7 +111,7 @@ type ExposeServiceOptions struct { func NewExposeServiceOptions(ioStreams genericclioptions.IOStreams) *ExposeServiceOptions { return &ExposeServiceOptions{ RecordFlags: genericclioptions.NewRecordFlags(), - PrintFlags: printers.NewPrintFlags("exposed", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("exposed").WithTypeSetter(scheme.Scheme), Recorder: genericclioptions.NoopRecorder{}, IOStreams: ioStreams, diff --git a/pkg/kubectl/cmd/get/get_flags.go b/pkg/kubectl/cmd/get/get_flags.go index dedb1792d6..3a7f828b80 100644 --- a/pkg/kubectl/cmd/get/get_flags.go +++ b/pkg/kubectl/cmd/get/get_flags.go @@ -161,8 +161,8 @@ func NewGetPrintFlags(scheme runtime.ObjectConvertor) *PrintFlags { OutputFormat: &outputFormat, NoHeaders: &noHeaders, - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(), + NamePrintFlags: printers.NewNamePrintFlags(""), TemplateFlags: printers.NewKubeTemplatePrintFlags(), HumanReadableFlags: NewHumanPrintFlags(), CustomColumnsFlags: printers.NewCustomColumnsPrintFlags(), diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index d1abca4778..383c1696f4 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -32,13 +32,13 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -115,7 +115,7 @@ func NewLabelOptions(ioStreams genericclioptions.IOStreams) *LabelOptions { RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, - PrintFlags: printers.NewPrintFlags("labeled", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("labeled").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } diff --git a/pkg/kubectl/cmd/patch.go b/pkg/kubectl/cmd/patch.go index 47f0a9127b..c75e889749 100644 --- a/pkg/kubectl/cmd/patch.go +++ b/pkg/kubectl/cmd/patch.go @@ -33,7 +33,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" @@ -99,7 +98,7 @@ func NewPatchOptions(ioStreams genericclioptions.IOStreams) *PatchOptions { return &PatchOptions{ RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, - PrintFlags: printers.NewPrintFlags("patched", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("patched").WithTypeSetter(scheme.Scheme), IOStreams: ioStreams, } } diff --git a/pkg/kubectl/cmd/replace.go b/pkg/kubectl/cmd/replace.go index 8639035135..88c689c3be 100644 --- a/pkg/kubectl/cmd/replace.go +++ b/pkg/kubectl/cmd/replace.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -97,7 +96,7 @@ func NewReplaceOptions(streams genericclioptions.IOStreams) *ReplaceOptions { // we only support "-o name" for this command, so only register the name printer PrintFlags: &printers.PrintFlags{ OutputFormat: &outputFormat, - NamePrintFlags: printers.NewNamePrintFlags("replaced", legacyscheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("replaced"), }, DeleteFlags: NewDeleteFlags("to use to replace the resource."), diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index 2b55b988ad..395a912df2 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -38,6 +38,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/kubectl/validation" @@ -114,7 +115,7 @@ type RollingUpdateOptions struct { func NewRollingUpdateOptions(streams genericclioptions.IOStreams) *RollingUpdateOptions { return &RollingUpdateOptions{ - PrintFlags: printers.NewPrintFlags("rolling updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("rolling updated").WithTypeSetter(scheme.Scheme), FilenameOptions: &resource.FilenameOptions{}, DeploymentKey: "deployment", Timeout: timeout, diff --git a/pkg/kubectl/cmd/rollout/BUILD b/pkg/kubectl/cmd/rollout/BUILD index a49016ade4..6bbdbf1f8f 100644 --- a/pkg/kubectl/cmd/rollout/BUILD +++ b/pkg/kubectl/cmd/rollout/BUILD @@ -26,6 +26,7 @@ go_library( "//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/genericclioptions:go_default_library", "//pkg/kubectl/genericclioptions/resource:go_default_library", + "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/printers:go_default_library", "//pkg/util/interrupt:go_default_library", diff --git a/pkg/kubectl/cmd/rollout/rollout_pause.go b/pkg/kubectl/cmd/rollout/rollout_pause.go index d288598bb4..907439bd93 100644 --- a/pkg/kubectl/cmd/rollout/rollout_pause.go +++ b/pkg/kubectl/cmd/rollout/rollout_pause.go @@ -29,6 +29,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -63,7 +64,7 @@ var ( func NewCmdRolloutPause(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command { o := &PauseConfig{ - PrintFlags: printers.NewPrintFlags("paused", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("paused").WithTypeSetter(scheme.Scheme), IOStreams: streams, } diff --git a/pkg/kubectl/cmd/rollout/rollout_resume.go b/pkg/kubectl/cmd/rollout/rollout_resume.go index 4e512dfaba..030262fa18 100644 --- a/pkg/kubectl/cmd/rollout/rollout_resume.go +++ b/pkg/kubectl/cmd/rollout/rollout_resume.go @@ -29,6 +29,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -61,7 +62,7 @@ var ( func NewCmdRolloutResume(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command { o := &ResumeConfig{ - PrintFlags: printers.NewPrintFlags("resumed", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("resumed").WithTypeSetter(scheme.Scheme), IOStreams: streams, } diff --git a/pkg/kubectl/cmd/rollout/rollout_undo.go b/pkg/kubectl/cmd/rollout/rollout_undo.go index f4b9d19b08..e78252d96f 100644 --- a/pkg/kubectl/cmd/rollout/rollout_undo.go +++ b/pkg/kubectl/cmd/rollout/rollout_undo.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" ) @@ -64,7 +65,7 @@ var ( func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command { o := &UndoOptions{ - PrintFlags: printers.NewPrintFlags("", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("").WithTypeSetter(scheme.Scheme), ToRevision: int64(0), } diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index 8a3f2a33b6..b824d2273a 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -127,7 +127,7 @@ type RunOptions struct { func NewRunOptions(streams genericclioptions.IOStreams) *RunOptions { return &RunOptions{ - PrintFlags: printers.NewPrintFlags("created", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("created").WithTypeSetter(scheme.Scheme), DeleteFlags: NewDeleteFlags("to use to replace the resource."), RecordFlags: genericclioptions.NewRecordFlags(), diff --git a/pkg/kubectl/cmd/run_test.go b/pkg/kubectl/cmd/run_test.go index 9b6eedc13d..c41a8c9234 100644 --- a/pkg/kubectl/cmd/run_test.go +++ b/pkg/kubectl/cmd/run_test.go @@ -198,7 +198,7 @@ func TestRunArgsFollowDashRules(t *testing.T) { cmd.Flags().Set("image", "nginx") cmd.Flags().Set("generator", "run/v1") - printFlags := printers.NewPrintFlags("created", legacyscheme.Scheme) + printFlags := printers.NewPrintFlags("created").WithTypeSetter(scheme.Scheme) printer, err := printFlags.ToPrinter() if err != nil { t.Errorf("unexpected error: %v", err) @@ -366,7 +366,7 @@ func TestGenerateService(t *testing.T) { }), } - printFlags := printers.NewPrintFlags("created", legacyscheme.Scheme) + printFlags := printers.NewPrintFlags("created").WithTypeSetter(scheme.Scheme) printer, err := printFlags.ToPrinter() if err != nil { t.Errorf("unexpected error: %v", err) diff --git a/pkg/kubectl/cmd/scale.go b/pkg/kubectl/cmd/scale.go index 0d8c9c93b0..7f4e321794 100644 --- a/pkg/kubectl/cmd/scale.go +++ b/pkg/kubectl/cmd/scale.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion" "k8s.io/kubernetes/pkg/kubectl" @@ -101,7 +100,7 @@ func NewScaleOptions(ioStreams genericclioptions.IOStreams) *ScaleOptions { // we only support "-o name" for this command, so only register the name printer PrintFlags: &printers.PrintFlags{ OutputFormat: &outputFormat, - NamePrintFlags: printers.NewNamePrintFlags("scaled", legacyscheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("scaled"), }, RecordFlags: genericclioptions.NewRecordFlags(), CurrentReplicas: -1, diff --git a/pkg/kubectl/cmd/set/BUILD b/pkg/kubectl/cmd/set/BUILD index 8f8c394832..161f7ac79a 100644 --- a/pkg/kubectl/cmd/set/BUILD +++ b/pkg/kubectl/cmd/set/BUILD @@ -19,7 +19,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/set", visibility = ["//build/visible_to:pkg_kubectl_cmd_set_CONSUMERS"], deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/templates:go_default_library", diff --git a/pkg/kubectl/cmd/set/set_env.go b/pkg/kubectl/cmd/set/set_env.go index 4d0da5f657..90f2f22f92 100644 --- a/pkg/kubectl/cmd/set/set_env.go +++ b/pkg/kubectl/cmd/set/set_env.go @@ -30,7 +30,6 @@ import ( "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" envutil "k8s.io/kubernetes/pkg/kubectl/cmd/util/env" @@ -127,7 +126,7 @@ type EnvOptions struct { // pod templates are selected by default and allowing environment to be overwritten func NewEnvOptions(streams genericclioptions.IOStreams) *EnvOptions { return &EnvOptions{ - PrintFlags: printers.NewPrintFlags("env updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("env updated").WithTypeSetter(scheme.Scheme), ContainerSelector: "*", Overwrite: true, diff --git a/pkg/kubectl/cmd/set/set_env_test.go b/pkg/kubectl/cmd/set/set_env_test.go index 8563d6141e..67eb342db4 100644 --- a/pkg/kubectl/cmd/set/set_env_test.go +++ b/pkg/kubectl/cmd/set/set_env_test.go @@ -63,11 +63,7 @@ func TestSetEnvLocal(t *testing.T) { streams, _, buf, bufErr := genericclioptions.NewTestIOStreams() opts := NewEnvOptions(streams) - opts.PrintFlags = &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - OutputFormat: &outputFormat, - } + opts.PrintFlags = printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme) opts.FilenameOptions = resource.FilenameOptions{ Filenames: []string{"../../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"}, } @@ -105,11 +101,7 @@ func TestSetMultiResourcesEnvLocal(t *testing.T) { outputFormat := "name" streams, _, buf, bufErr := genericclioptions.NewTestIOStreams() opts := NewEnvOptions(streams) - opts.PrintFlags = &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - OutputFormat: &outputFormat, - } + opts.PrintFlags = printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme) opts.FilenameOptions = resource.FilenameOptions{ Filenames: []string{"../../../../test/fixtures/pkg/kubectl/cmd/set/multi-resource-yaml.yaml"}, } @@ -491,11 +483,7 @@ func TestSetEnvRemote(t *testing.T) { outputFormat := "yaml" streams := genericclioptions.NewTestIOStreamsDiscard() opts := NewEnvOptions(streams) - opts.PrintFlags = &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - OutputFormat: &outputFormat, - } + opts.PrintFlags = printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme) opts.Local = false opts.IOStreams = streams err := opts.Complete(tf, NewCmdEnv(tf, streams), input.args) diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 91c7fc4e1b..76dd52646b 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" @@ -88,7 +87,7 @@ var ( func NewImageOptions(streams genericclioptions.IOStreams) *SetImageOptions { return &SetImageOptions{ - PrintFlags: printers.NewPrintFlags("image updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("image updated").WithTypeSetter(scheme.Scheme), RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, diff --git a/pkg/kubectl/cmd/set/set_image_test.go b/pkg/kubectl/cmd/set/set_image_test.go index a5f29d58f5..50cf1e3b1d 100644 --- a/pkg/kubectl/cmd/set/set_image_test.go +++ b/pkg/kubectl/cmd/set/set_image_test.go @@ -70,12 +70,7 @@ func TestImageLocal(t *testing.T) { cmd.Flags().Set("local", "true") opts := SetImageOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), FilenameOptions: resource.FilenameOptions{ Filenames: []string{"../../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"}}, Local: true, @@ -97,10 +92,7 @@ func TestImageLocal(t *testing.T) { } func TestSetImageValidation(t *testing.T) { - printFlags := &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - } + printFlags := printers.NewPrintFlags("").WithTypeSetter(scheme.Scheme) testCases := []struct { name string @@ -191,12 +183,7 @@ func TestSetMultiResourcesImageLocal(t *testing.T) { cmd.Flags().Set("local", "true") opts := SetImageOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), FilenameOptions: resource.FilenameOptions{ Filenames: []string{"../../../../test/fixtures/pkg/kubectl/cmd/set/multi-resource-yaml.yaml"}}, Local: true, @@ -583,12 +570,7 @@ func TestSetImageRemote(t *testing.T) { cmd := NewCmdImage(tf, streams) cmd.Flags().Set("output", outputFormat) opts := SetImageOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), Local: false, IOStreams: streams, diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index 0e5c24ae41..0fd6bc5b31 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -95,7 +94,7 @@ type SetResourcesOptions struct { // pod templates are selected by default. func NewResourcesOptions(streams genericclioptions.IOStreams) *SetResourcesOptions { return &SetResourcesOptions{ - PrintFlags: printers.NewPrintFlags("resource requirements updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("resource requirements updated").WithTypeSetter(scheme.Scheme), RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, diff --git a/pkg/kubectl/cmd/set/set_resources_test.go b/pkg/kubectl/cmd/set/set_resources_test.go index e0e7ac7ba8..cea402abd7 100644 --- a/pkg/kubectl/cmd/set/set_resources_test.go +++ b/pkg/kubectl/cmd/set/set_resources_test.go @@ -70,12 +70,7 @@ func TestResourcesLocal(t *testing.T) { cmd.Flags().Set("local", "true") opts := SetResourcesOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), FilenameOptions: resource.FilenameOptions{ Filenames: []string{"../../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"}}, Local: true, @@ -124,12 +119,7 @@ func TestSetMultiResourcesLimitsLocal(t *testing.T) { cmd.Flags().Set("local", "true") opts := SetResourcesOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), FilenameOptions: resource.FilenameOptions{ Filenames: []string{"../../../../test/fixtures/pkg/kubectl/cmd/set/multi-resource-yaml.yaml"}}, Local: true, @@ -504,12 +494,7 @@ func TestSetResourcesRemote(t *testing.T) { cmd := NewCmdResources(tf, streams) cmd.Flags().Set("output", outputFormat) opts := SetResourcesOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), Limits: "cpu=200m,memory=512Mi", ContainerSelector: "*", diff --git a/pkg/kubectl/cmd/set/set_selector.go b/pkg/kubectl/cmd/set/set_selector.go index bede6cc1ca..5ed87e22ac 100644 --- a/pkg/kubectl/cmd/set/set_selector.go +++ b/pkg/kubectl/cmd/set/set_selector.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" @@ -80,7 +79,7 @@ var ( func NewSelectorOptions(streams genericclioptions.IOStreams) *SetSelectorOptions { return &SetSelectorOptions{ - PrintFlags: printers.NewPrintFlags("selector updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("selector updated").WithTypeSetter(scheme.Scheme), RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, diff --git a/pkg/kubectl/cmd/set/set_serviceaccount.go b/pkg/kubectl/cmd/set/set_serviceaccount.go index 114eb8db25..d06184ddee 100644 --- a/pkg/kubectl/cmd/set/set_serviceaccount.go +++ b/pkg/kubectl/cmd/set/set_serviceaccount.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" @@ -80,7 +79,7 @@ type SetServiceAccountOptions struct { func NewSetServiceAccountOptions(streams genericclioptions.IOStreams) *SetServiceAccountOptions { return &SetServiceAccountOptions{ - PrintFlags: printers.NewPrintFlags("serviceaccount updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("serviceaccount updated").WithTypeSetter(scheme.Scheme), RecordFlags: genericclioptions.NewRecordFlags(), Recorder: genericclioptions.NoopRecorder{}, diff --git a/pkg/kubectl/cmd/set/set_serviceaccount_test.go b/pkg/kubectl/cmd/set/set_serviceaccount_test.go index c579cac391..a4ca865866 100644 --- a/pkg/kubectl/cmd/set/set_serviceaccount_test.go +++ b/pkg/kubectl/cmd/set/set_serviceaccount_test.go @@ -90,12 +90,7 @@ func TestSetServiceAccountLocal(t *testing.T) { cmd.Flags().Set("local", "true") testapi.Default = testapi.Groups[input.apiGroup] saConfig := SetServiceAccountOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), fileNameOptions: resource.FilenameOptions{ Filenames: []string{input.yaml}}, local: true, @@ -133,12 +128,7 @@ func TestSetServiceAccountMultiLocal(t *testing.T) { cmd.Flags().Set("output", outputFormat) cmd.Flags().Set("local", "true") opts := SetServiceAccountOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), fileNameOptions: resource.FilenameOptions{ Filenames: []string{"../../../../test/fixtures/pkg/kubectl/cmd/set/multi-resource-yaml.yaml"}}, local: true, @@ -375,12 +365,7 @@ func TestSetServiceAccountRemote(t *testing.T) { cmd := NewCmdServiceAccount(tf, streams) cmd.Flags().Set("output", outputFormat) saConfig := SetServiceAccountOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), local: false, IOStreams: streams, @@ -422,13 +407,8 @@ func TestServiceAccountValidation(t *testing.T) { cmd := NewCmdServiceAccount(tf, streams) saConfig := &SetServiceAccountOptions{ - PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), - - OutputFormat: &outputFormat, - }, - IOStreams: streams, + PrintFlags: printers.NewPrintFlags("").WithDefaultOutput(outputFormat).WithTypeSetter(scheme.Scheme), + IOStreams: streams, } err := saConfig.Complete(tf, cmd, input.args) assert.EqualError(t, err, input.errorString) diff --git a/pkg/kubectl/cmd/set/set_subject.go b/pkg/kubectl/cmd/set/set_subject.go index a833845174..ce55ea7630 100644 --- a/pkg/kubectl/cmd/set/set_subject.go +++ b/pkg/kubectl/cmd/set/set_subject.go @@ -27,7 +27,6 @@ import ( "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -83,7 +82,7 @@ type SubjectOptions struct { func NewSubjectOptions(streams genericclioptions.IOStreams) *SubjectOptions { return &SubjectOptions{ - PrintFlags: printers.NewPrintFlags("subjects updated", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("subjects updated").WithTypeSetter(scheme.Scheme), IOStreams: streams, } diff --git a/pkg/kubectl/cmd/taint.go b/pkg/kubectl/cmd/taint.go index d5210d541c..af626ad1b0 100644 --- a/pkg/kubectl/cmd/taint.go +++ b/pkg/kubectl/cmd/taint.go @@ -35,6 +35,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" taintutils "k8s.io/kubernetes/pkg/util/taints" @@ -86,7 +87,7 @@ var ( func NewCmdTaint(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command { options := &TaintOptions{ - PrintFlags: printers.NewPrintFlags("tainted", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("tainted").WithTypeSetter(scheme.Scheme), IOStreams: streams, } diff --git a/pkg/kubectl/cmd/util/editor/BUILD b/pkg/kubectl/cmd/util/editor/BUILD index c22f03b8b6..2a0e78cf35 100644 --- a/pkg/kubectl/cmd/util/editor/BUILD +++ b/pkg/kubectl/cmd/util/editor/BUILD @@ -15,7 +15,6 @@ go_library( "//build/visible_to:pkg_kubectl_cmd_util_editor_CONSUMERS", ], deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/kubectl:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", diff --git a/pkg/kubectl/cmd/util/editor/editoptions.go b/pkg/kubectl/cmd/util/editor/editoptions.go index e300364b56..a9c9251c2f 100644 --- a/pkg/kubectl/cmd/util/editor/editoptions.go +++ b/pkg/kubectl/cmd/util/editor/editoptions.go @@ -42,7 +42,6 @@ import ( "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -89,7 +88,7 @@ func NewEditOptions(editMode EditMode, ioStreams genericclioptions.IOStreams) *E EditMode: editMode, - PrintFlags: printers.NewPrintFlags("edited", legacyscheme.Scheme), + PrintFlags: printers.NewPrintFlags("edited").WithTypeSetter(scheme.Scheme), WindowsLineEndings: goruntime.GOOS == "windows", diff --git a/pkg/printers/BUILD b/pkg/printers/BUILD index 5aca734a20..cf60c45f98 100644 --- a/pkg/printers/BUILD +++ b/pkg/printers/BUILD @@ -24,6 +24,7 @@ go_library( "tabwriter.go", "template.go", "template_flags.go", + "typesetter.go", ], importpath = "k8s.io/kubernetes/pkg/printers", deps = [ diff --git a/pkg/printers/flags.go b/pkg/printers/flags.go index e143f4f591..83bbc228a6 100644 --- a/pkg/printers/flags.go +++ b/pkg/printers/flags.go @@ -21,7 +21,6 @@ import ( "strings" "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/runtime" ) @@ -75,6 +74,8 @@ type PrintFlags struct { JSONYamlPrintFlags *JSONYamlPrintFlags NamePrintFlags *NamePrintFlags + TypeSetterPrinter *TypeSetterPrinter + OutputFormat *string } @@ -90,13 +91,13 @@ func (f *PrintFlags) ToPrinter() (ResourcePrinter, error) { if f.JSONYamlPrintFlags != nil { if p, err := f.JSONYamlPrintFlags.ToPrinter(outputFormat); !IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetterPrinter.WrapToPrinter(p, err) } } if f.NamePrintFlags != nil { if p, err := f.NamePrintFlags.ToPrinter(outputFormat); !IsNoCompatiblePrinterError(err) { - return p, err + return f.TypeSetterPrinter.WrapToPrinter(p, err) } } @@ -118,14 +119,20 @@ func (f *PrintFlags) WithDefaultOutput(output string) *PrintFlags { return f } -func NewPrintFlags(operation string, scheme runtime.ObjectConvertor) *PrintFlags { +// WithTypeSetter sets a wrapper than will surround the returned printer with a printer to type resources +func (f *PrintFlags) WithTypeSetter(scheme *runtime.Scheme) *PrintFlags { + f.TypeSetterPrinter = NewTypeSetter(scheme) + return f +} + +func NewPrintFlags(operation string) *PrintFlags { outputFormat := "" return &PrintFlags{ OutputFormat: &outputFormat, - JSONYamlPrintFlags: NewJSONYamlPrintFlags(scheme), - NamePrintFlags: NewNamePrintFlags(operation, scheme), + JSONYamlPrintFlags: NewJSONYamlPrintFlags(), + NamePrintFlags: NewNamePrintFlags(operation), } } diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index cfecaa2110..2c6a1c3c57 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -59,6 +59,7 @@ func init() { } var testData = TestStruct{ + TypeMeta: metav1.TypeMeta{APIVersion: "foo/bar", Kind: "TestStruct"}, Key: "testValue", Map: map[string]int{"TestSubkey": 1}, StringList: []string{"a", "b", "c"}, @@ -232,6 +233,7 @@ func testPrinter(t *testing.T, printer printers.ResourcePrinter, unmarshalFunc f } obj := &v1.Pod{ + TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Pod"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"}, } buf.Reset() @@ -253,11 +255,11 @@ func testPrinter(t *testing.T, printer printers.ResourcePrinter, unmarshalFunc f } func TestYAMLPrinter(t *testing.T) { - testPrinter(t, &printers.YAMLPrinter{}, yaml.Unmarshal) + testPrinter(t, printers.NewTypeSetter(legacyscheme.Scheme).ToPrinter(&printers.YAMLPrinter{}), yaml.Unmarshal) } func TestJSONPrinter(t *testing.T) { - testPrinter(t, &printers.JSONPrinter{}, json.Unmarshal) + testPrinter(t, printers.NewTypeSetter(legacyscheme.Scheme).ToPrinter(&printers.JSONPrinter{}), json.Unmarshal) } func TestFormatResourceName(t *testing.T) { @@ -363,38 +365,27 @@ func TestNamePrinter(t *testing.T) { }, "pod/foo\n"}, "List": { - &v1.List{ - TypeMeta: metav1.TypeMeta{ - Kind: "List", + &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "kind": "List", + "apiVersion": "v1", }, - Items: []runtime.RawExtension{ + Items: []unstructured.Unstructured{ { - Object: &v1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - }, - }, - }, - { - Object: &unstructured.Unstructured{ - Object: map[string]interface{}{ - "kind": "Pod", - "apiVersion": "v1", - "metadata": map[string]interface{}{ - "name": "bar", - }, + Object: map[string]interface{}{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": map[string]interface{}{ + "name": "bar", }, }, }, }, }, - "pod/foo\npod/bar\n"}, + "pod/bar\n"}, } - printFlags := printers.NewPrintFlags("", legacyscheme.Scheme).WithDefaultOutput("name") + printFlags := printers.NewPrintFlags("").WithTypeSetter(legacyscheme.Scheme).WithDefaultOutput("name") printer, err := printFlags.ToPrinter() if err != nil { t.Fatalf("unexpected err: %v", err) @@ -557,14 +548,11 @@ func TestPrinters(t *testing.T) { } genericPrinters := map[string]printers.ResourcePrinter{ - "json": &printers.JSONPrinter{}, - "yaml": &printers.YAMLPrinter{}, + "json": printers.NewTypeSetter(legacyscheme.Scheme).ToPrinter(&printers.JSONPrinter{}), + "yaml": printers.NewTypeSetter(legacyscheme.Scheme).ToPrinter(&printers.YAMLPrinter{}), "template": templatePrinter, "template2": templatePrinter2, "jsonpath": jsonpathPrinter, - "name": &printers.NamePrinter{ - Typer: legacyscheme.Scheme, - }, } objects := map[string]runtime.Object{ "pod": &v1.Pod{ObjectMeta: om("pod")}, diff --git a/pkg/printers/json_yaml_flags.go b/pkg/printers/json_yaml_flags.go index 26a4a09aa7..3176e4aae2 100644 --- a/pkg/printers/json_yaml_flags.go +++ b/pkg/printers/json_yaml_flags.go @@ -20,15 +20,12 @@ import ( "strings" "github.com/spf13/cobra" - - "k8s.io/apimachinery/pkg/runtime" ) // JSONYamlPrintFlags provides default flags necessary for json/yaml printing. // Given the following flag values, a printer can be requested that knows // how to handle printing based on these values. type JSONYamlPrintFlags struct { - Scheme runtime.ObjectConvertor } // ToPrinter receives an outputFormat and returns a printer capable of @@ -57,6 +54,6 @@ func (f *JSONYamlPrintFlags) AddFlags(c *cobra.Command) {} // NewJSONYamlPrintFlags returns flags associated with // yaml or json printing, with default values set. -func NewJSONYamlPrintFlags(scheme runtime.ObjectConvertor) *JSONYamlPrintFlags { - return &JSONYamlPrintFlags{Scheme: scheme} +func NewJSONYamlPrintFlags() *JSONYamlPrintFlags { + return &JSONYamlPrintFlags{} } diff --git a/pkg/printers/json_yaml_flags_test.go b/pkg/printers/json_yaml_flags_test.go index 3fe8aee410..2582b8c089 100644 --- a/pkg/printers/json_yaml_flags_test.go +++ b/pkg/printers/json_yaml_flags_test.go @@ -23,12 +23,14 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/printers" ) func TestPrinterSupportsExpectedJSONYamlFormats(t *testing.T) { - testObject := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + testObject := &v1.Pod{ + TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Pod"}, + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + } testCases := []struct { name string @@ -60,7 +62,7 @@ func TestPrinterSupportsExpectedJSONYamlFormats(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - printFlags := printers.JSONYamlPrintFlags{Scheme: legacyscheme.Scheme} + printFlags := printers.JSONYamlPrintFlags{} p, err := printFlags.ToPrinter(tc.outputFormat) if tc.expectNoMatch { diff --git a/pkg/printers/name.go b/pkg/printers/name.go index ba6b6905e6..5aa694bfa9 100644 --- a/pkg/printers/name.go +++ b/pkg/printers/name.go @@ -37,8 +37,6 @@ type NamePrinter struct { // took place on an object, to be included in the // finalized "successful" message. Operation string - - Typer runtime.ObjectTyper } // PrintObj is an implementation of ResourcePrinter.PrintObj which decodes the object @@ -52,6 +50,13 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { } if meta.IsListType(obj) { + // we allow unstructured lists for now because they always contain the GVK information. We should chase down + // callers and stop them from passing unflattened lists + // TODO chase the caller that is setting this and remove it. + if _, ok := obj.(*unstructured.UnstructuredList); !ok { + return fmt.Errorf("list types are not supported by name printing: %T", obj) + } + items, err := meta.ExtractList(obj) if err != nil { return err @@ -64,6 +69,10 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { return nil } + if obj.GetObjectKind().GroupVersionKind().Empty() { + return fmt.Errorf("missing apiVersion or kind; try GetObjectKind().SetGroupVersionKind() if you know the type") + } + name := "" if acc, err := meta.Accessor(obj); err == nil { if n := acc.GetName(); len(n) > 0 { @@ -71,10 +80,10 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { } } - return printObj(w, name, p.Operation, p.ShortOutput, GetObjectGroupKind(obj, p.Typer)) + return printObj(w, name, p.Operation, p.ShortOutput, GetObjectGroupKind(obj)) } -func GetObjectGroupKind(obj runtime.Object, typer runtime.ObjectTyper) schema.GroupKind { +func GetObjectGroupKind(obj runtime.Object) schema.GroupKind { if obj == nil { return schema.GroupKind{Kind: ""} } @@ -83,15 +92,6 @@ func GetObjectGroupKind(obj runtime.Object, typer runtime.ObjectTyper) schema.Gr return groupVersionKind.GroupKind() } - if gvks, _, err := typer.ObjectKinds(obj); err == nil { - for _, gvk := range gvks { - if len(gvk.Kind) == 0 { - continue - } - return gvk.GroupKind() - } - } - if uns, ok := obj.(*unstructured.Unstructured); ok { if len(uns.GroupVersionKind().Kind) > 0 { return uns.GroupVersionKind().GroupKind() diff --git a/pkg/printers/name_flags.go b/pkg/printers/name_flags.go index dc9e4ac404..1f8aad188c 100644 --- a/pkg/printers/name_flags.go +++ b/pkg/printers/name_flags.go @@ -21,18 +21,12 @@ import ( "strings" "github.com/spf13/cobra" - - "k8s.io/apimachinery/pkg/runtime" - - "k8s.io/kubernetes/pkg/kubectl/scheme" ) // NamePrintFlags provides default flags necessary for printing // a resource's fully-qualified Kind.group/name, or a successful // message about that resource if an Operation is provided. type NamePrintFlags struct { - Scheme runtime.ObjectConvertor - // Operation describes the name of the action that // took place on an object, to be included in the // finalized "successful" message. @@ -51,7 +45,6 @@ func (f *NamePrintFlags) Complete(successTemplate string) error { func (f *NamePrintFlags) ToPrinter(outputFormat string) (ResourcePrinter, error) { namePrinter := &NamePrinter{ Operation: f.Operation, - Typer: scheme.Scheme, } outputFormat = strings.ToLower(outputFormat) @@ -72,7 +65,7 @@ func (f *NamePrintFlags) AddFlags(c *cobra.Command) {} // NewNamePrintFlags returns flags associated with // --name printing, with default values set. -func NewNamePrintFlags(operation string, scheme runtime.ObjectConvertor) *NamePrintFlags { +func NewNamePrintFlags(operation string) *NamePrintFlags { return &NamePrintFlags{ Operation: operation, } diff --git a/pkg/printers/name_flags_test.go b/pkg/printers/name_flags_test.go index ed8d7529f6..5b2267c505 100644 --- a/pkg/printers/name_flags_test.go +++ b/pkg/printers/name_flags_test.go @@ -27,7 +27,10 @@ import ( ) func TestNamePrinterSupportsExpectedFormats(t *testing.T) { - testObject := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + testObject := &v1.Pod{ + TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Pod"}, + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + } testCases := []struct { name string diff --git a/pkg/printers/typesetter.go b/pkg/printers/typesetter.go new file mode 100644 index 0000000000..8d2d9b56ec --- /dev/null +++ b/pkg/printers/typesetter.go @@ -0,0 +1,95 @@ +/* +Copyright 2018 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" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// TypeSetterPrinter is an implementation of ResourcePrinter wraps another printer with types set on the objects +type TypeSetterPrinter struct { + Delegate ResourcePrinter + + Typer runtime.ObjectTyper +} + +// NewTypeSetter constructs a wrapping printer with required params +func NewTypeSetter(typer runtime.ObjectTyper) *TypeSetterPrinter { + return &TypeSetterPrinter{Typer: typer} +} + +// PrintObj is an implementation of ResourcePrinter.PrintObj which sets type information on the obj for the duration +// of printing. It is NOT threadsafe. +func (p *TypeSetterPrinter) PrintObj(obj runtime.Object, w io.Writer) error { + if obj == nil { + return p.Delegate.PrintObj(obj, w) + } + if !obj.GetObjectKind().GroupVersionKind().Empty() { + return p.Delegate.PrintObj(obj, w) + } + + // we were empty coming in, make sure we're empty going out. This makes the call thread-unsafe + defer func() { + obj.GetObjectKind().SetGroupVersionKind(schema.GroupVersionKind{}) + }() + + gvks, _, err := p.Typer.ObjectKinds(obj) + if err != nil { + // printers wrapped by us expect to find the type information present + return fmt.Errorf("missing apiVersion or kind and cannot assign it; %v", err) + } + + for _, gvk := range gvks { + if len(gvk.Kind) == 0 { + continue + } + if len(gvk.Version) == 0 || gvk.Version == runtime.APIVersionInternal { + continue + } + obj.GetObjectKind().SetGroupVersionKind(gvk) + break + } + + return p.Delegate.PrintObj(obj, w) +} + +// ToPrinter returns a printer (not threadsafe!) that has been wrapped +func (p *TypeSetterPrinter) ToPrinter(delegate ResourcePrinter) ResourcePrinter { + if p == nil { + return delegate + } + + p.Delegate = delegate + return p +} + +// WrapToPrinter wraps the common ToPrinter method +func (p *TypeSetterPrinter) WrapToPrinter(delegate ResourcePrinter, err error) (ResourcePrinter, error) { + if err != nil { + return delegate, err + } + if p == nil { + return delegate, nil + } + + p.Delegate = delegate + return p, nil +}