From a87b82c0ad3f060494214f59f94c832bb3134f22 Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Mon, 16 Jul 2018 14:27:20 +0800 Subject: [PATCH 1/3] fix error binding of edit output format --- pkg/kubectl/cmd/apply_edit_last_applied.go | 2 +- pkg/kubectl/cmd/create/create.go | 6 +++--- pkg/kubectl/cmd/util/editor/editoptions.go | 10 ++++------ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/pkg/kubectl/cmd/apply_edit_last_applied.go b/pkg/kubectl/cmd/apply_edit_last_applied.go index e4700989ce9..585998bf414 100644 --- a/pkg/kubectl/cmd/apply_edit_last_applied.go +++ b/pkg/kubectl/cmd/apply_edit_last_applied.go @@ -76,10 +76,10 @@ func NewCmdApplyEditLastApplied(f cmdutil.Factory, ioStreams genericclioptions.I // bind flag structs o.RecordFlags.AddFlags(cmd) + o.PrintFlags.AddFlags(cmd) usage := "to use to edit the resource" cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, usage) - cmd.Flags().StringVarP(&o.Output, "output", "o", o.Output, "Output format. One of: yaml|json.") cmd.Flags().BoolVar(&o.WindowsLineEndings, "windows-line-endings", o.WindowsLineEndings, "Defaults to the line ending native to your platform.") cmdutil.AddIncludeUninitializedFlag(cmd) diff --git a/pkg/kubectl/cmd/create/create.go b/pkg/kubectl/cmd/create/create.go index a6bb8b03b8e..e72b6d0796a 100644 --- a/pkg/kubectl/cmd/create/create.go +++ b/pkg/kubectl/cmd/create/create.go @@ -209,7 +209,7 @@ func (o *CreateOptions) RunCreate(f cmdutil.Factory, cmd *cobra.Command) error { } if o.EditBeforeCreate { - return RunEditOnCreate(f, o.RecordFlags, o.IOStreams, cmd, &o.FilenameOptions) + return RunEditOnCreate(f, o.PrintFlags, o.RecordFlags, o.IOStreams, cmd, &o.FilenameOptions) } schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { @@ -298,13 +298,13 @@ func (o *CreateOptions) raw(f cmdutil.Factory) error { return nil } -func RunEditOnCreate(f cmdutil.Factory, recordFlags *genericclioptions.RecordFlags, ioStreams genericclioptions.IOStreams, cmd *cobra.Command, options *resource.FilenameOptions) error { +func RunEditOnCreate(f cmdutil.Factory, printFlags *genericclioptions.PrintFlags, recordFlags *genericclioptions.RecordFlags, ioStreams genericclioptions.IOStreams, cmd *cobra.Command, options *resource.FilenameOptions) error { editOptions := editor.NewEditOptions(editor.EditBeforeCreateMode, ioStreams) editOptions.FilenameOptions = *options editOptions.ValidateOptions = cmdutil.ValidateOptions{ EnableValidation: cmdutil.GetFlagBool(cmd, "validate"), } - editOptions.Output = cmdutil.GetFlagString(cmd, "output") + editOptions.PrintFlags = printFlags editOptions.ApplyAnnotation = cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag) editOptions.RecordFlags = recordFlags diff --git a/pkg/kubectl/cmd/util/editor/editoptions.go b/pkg/kubectl/cmd/util/editor/editoptions.go index f2d2920b98a..351951f7d5c 100644 --- a/pkg/kubectl/cmd/util/editor/editoptions.go +++ b/pkg/kubectl/cmd/util/editor/editoptions.go @@ -60,7 +60,6 @@ type EditOptions struct { PrintFlags *genericclioptions.PrintFlags ToPrinter func(string) (printers.ResourcePrinter, error) - Output string OutputPatch bool WindowsLineEndings bool @@ -95,7 +94,6 @@ func NewEditOptions(editMode EditMode, ioStreams genericclioptions.IOStreams) *E Recorder: genericclioptions.NoopRecorder{}, IOStreams: ioStreams, - Output: "yaml", } } @@ -118,12 +116,12 @@ func (o *EditOptions) Complete(f cmdutil.Factory, args []string, cmd *cobra.Comm if o.EditMode != NormalEditMode && o.EditMode != EditBeforeCreateMode && o.EditMode != ApplyEditMode { return fmt.Errorf("unsupported edit mode %q", o.EditMode) } - if o.Output != "" { - if o.Output != "yaml" && o.Output != "json" { - return fmt.Errorf("invalid output format %s, only yaml|json supported", o.Output) + if *o.PrintFlags.OutputFormat != "" { + if *o.PrintFlags.OutputFormat != "yaml" && *o.PrintFlags.OutputFormat != "json" { + return fmt.Errorf("invalid output format %s, only yaml|json supported", *o.PrintFlags.OutputFormat) } } - o.editPrinterOptions = getPrinter(o.Output) + o.editPrinterOptions = getPrinter(*o.PrintFlags.OutputFormat) if o.OutputPatch && o.EditMode != NormalEditMode { return fmt.Errorf("the edit mode doesn't support output the patch") From 5e79a25e0c3489aae75c9d02ff2587715c07b980 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Mon, 16 Jul 2018 11:21:07 -0400 Subject: [PATCH 2/3] add support for "success" output for edit command Adds support for the "success" printer in the "edit" command, while ensuring outputFormat constraints for the in-editor printer. --- pkg/kubectl/cmd/util/editor/editoptions.go | 83 +++++++++++-------- .../genericclioptions/json_yaml_flags.go | 3 + pkg/kubectl/genericclioptions/name_flags.go | 3 + 3 files changed, 55 insertions(+), 34 deletions(-) diff --git a/pkg/kubectl/cmd/util/editor/editoptions.go b/pkg/kubectl/cmd/util/editor/editoptions.go index 351951f7d5c..9aa0f0211bf 100644 --- a/pkg/kubectl/cmd/util/editor/editoptions.go +++ b/pkg/kubectl/cmd/util/editor/editoptions.go @@ -89,6 +89,16 @@ func NewEditOptions(editMode EditMode, ioStreams genericclioptions.IOStreams) *E PrintFlags: genericclioptions.NewPrintFlags("edited").WithTypeSetter(scheme.Scheme), + editPrinterOptions: &editPrinterOptions{ + // create new editor-specific PrintFlags, with all + // output flags disabled, except json / yaml + printFlags: (&genericclioptions.PrintFlags{ + JSONYamlPrintFlags: genericclioptions.NewJSONYamlPrintFlags(), + }).WithDefaultOutput("yaml"), + ext: ".yaml", + addHeader: true, + }, + WindowsLineEndings: goruntime.GOOS == "windows", Recorder: genericclioptions.NoopRecorder{}, @@ -98,9 +108,42 @@ func NewEditOptions(editMode EditMode, ioStreams genericclioptions.IOStreams) *E } type editPrinterOptions struct { - printer printers.ResourcePrinter - ext string - addHeader bool + printFlags *genericclioptions.PrintFlags + ext string + addHeader bool +} + +func (e *editPrinterOptions) Complete(fromPrintFlags *genericclioptions.PrintFlags) error { + if e.printFlags == nil { + return fmt.Errorf("missing PrintFlags in editor printer options") + } + + // bind output format from existing printflags + if fromPrintFlags != nil && len(*fromPrintFlags.OutputFormat) > 0 { + e.printFlags.OutputFormat = fromPrintFlags.OutputFormat + } + + // prevent a commented header at the top of the user's + // default editor if presenting contents as json. + if *e.printFlags.OutputFormat == "json" { + e.addHeader = false + e.ext = ".json" + return nil + } + + // we default to yaml if check above is false, as only json or yaml are supported + e.addHeader = true + e.ext = ".yaml" + return nil +} + +func (e *editPrinterOptions) PrintObj(obj runtime.Object, out io.Writer) error { + p, err := e.printFlags.ToPrinter() + if err != nil { + return err + } + + return p.PrintObj(obj, out) } // Complete completes all the required options @@ -116,12 +159,8 @@ func (o *EditOptions) Complete(f cmdutil.Factory, args []string, cmd *cobra.Comm if o.EditMode != NormalEditMode && o.EditMode != EditBeforeCreateMode && o.EditMode != ApplyEditMode { return fmt.Errorf("unsupported edit mode %q", o.EditMode) } - if *o.PrintFlags.OutputFormat != "" { - if *o.PrintFlags.OutputFormat != "yaml" && *o.PrintFlags.OutputFormat != "json" { - return fmt.Errorf("invalid output format %s, only yaml|json supported", *o.PrintFlags.OutputFormat) - } - } - o.editPrinterOptions = getPrinter(*o.PrintFlags.OutputFormat) + + o.editPrinterOptions.Complete(o.PrintFlags) if o.OutputPatch && o.EditMode != NormalEditMode { return fmt.Errorf("the edit mode doesn't support output the patch") @@ -223,7 +262,7 @@ func (o *EditOptions) Run() error { } if !containsError { - if err := o.editPrinterOptions.printer.PrintObj(originalObj, w); err != nil { + if err := o.editPrinterOptions.PrintObj(originalObj, w); err != nil { return preservedFile(err, results.file, o.ErrOut) } original = buf.Bytes() @@ -507,30 +546,6 @@ func encodeToJson(obj runtime.Unstructured) ([]byte, error) { return js, nil } -func getPrinter(format string) *editPrinterOptions { - switch format { - case "json": - return &editPrinterOptions{ - printer: &printers.JSONPrinter{}, - ext: ".json", - addHeader: false, - } - case "yaml": - return &editPrinterOptions{ - printer: &printers.YAMLPrinter{}, - ext: ".yaml", - addHeader: true, - } - default: - // if format is not specified, use yaml as default - return &editPrinterOptions{ - printer: &printers.YAMLPrinter{}, - ext: ".yaml", - addHeader: true, - } - } -} - func (o *EditOptions) visitToPatch(originalInfos []*resource.Info, patchVisitor resource.Visitor, results *editResults) error { err := patchVisitor.Visit(func(info *resource.Info, incomingErr error) error { editObjUID, err := meta.NewAccessor().UID(info.Object) diff --git a/pkg/kubectl/genericclioptions/json_yaml_flags.go b/pkg/kubectl/genericclioptions/json_yaml_flags.go index 8205f5191d1..f133dd399ab 100644 --- a/pkg/kubectl/genericclioptions/json_yaml_flags.go +++ b/pkg/kubectl/genericclioptions/json_yaml_flags.go @@ -25,6 +25,9 @@ import ( ) func (f *JSONYamlPrintFlags) AllowedFormats() []string { + if f == nil { + return []string{} + } return []string{"json", "yaml"} } diff --git a/pkg/kubectl/genericclioptions/name_flags.go b/pkg/kubectl/genericclioptions/name_flags.go index 13c714554f8..8da378f391f 100644 --- a/pkg/kubectl/genericclioptions/name_flags.go +++ b/pkg/kubectl/genericclioptions/name_flags.go @@ -41,6 +41,9 @@ func (f *NamePrintFlags) Complete(successTemplate string) error { } func (f *NamePrintFlags) AllowedFormats() []string { + if f == nil { + return []string{} + } return []string{"name"} } From 71299558c18563cb249bafb2ac99c2c45b151648 Mon Sep 17 00:00:00 2001 From: Chao Wang Date: Wed, 18 Jul 2018 15:41:38 +0800 Subject: [PATCH 3/3] update testcase for edit --- .../testdata/edit/testcase-apply-edit-last-applied/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubectl/cmd/testdata/edit/testcase-apply-edit-last-applied/test.yaml b/pkg/kubectl/cmd/testdata/edit/testcase-apply-edit-last-applied/test.yaml index 73d8fd98b25..106bfb963c4 100755 --- a/pkg/kubectl/cmd/testdata/edit/testcase-apply-edit-last-applied/test.yaml +++ b/pkg/kubectl/cmd/testdata/edit/testcase-apply-edit-last-applied/test.yaml @@ -6,7 +6,7 @@ args: outputFormat: yaml namespace: myproject expectedStdout: -- service/svc1 edited +- 'targetPort: 92' expectedExitCode: 0 steps: - type: request