From 155fb9f4be946cc0e189c6a1b22fd70bafc221f9 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Mon, 29 Aug 2016 22:27:22 -0700 Subject: [PATCH] improve some error messages. --- pkg/kubectl/cmd/exec.go | 12 ++++++++---- pkg/kubectl/cmd/logs.go | 10 +++++++--- pkg/kubectl/cmd/scale.go | 13 ++++++++----- pkg/kubectl/resource/builder.go | 17 ++++++++++++++++- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/pkg/kubectl/cmd/exec.go b/pkg/kubectl/cmd/exec.go index b8dee1e5024..6ea11723103 100644 --- a/pkg/kubectl/cmd/exec.go +++ b/pkg/kubectl/cmd/exec.go @@ -48,6 +48,10 @@ var ( kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il`) ) +const ( + execUsageStr = "expected 'exec [arg1] [arg2] ... [argN]'.\n and are required parameter for the exec command" +) + func NewCmdExec(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command { options := &ExecOptions{ StreamOptions: StreamOptions{ @@ -135,19 +139,19 @@ type ExecOptions struct { func (p *ExecOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, argsIn []string, argsLenAtDash int) error { // Let kubectl exec follow rules for `--`, see #13004 issue if len(p.PodName) == 0 && (len(argsIn) == 0 || argsLenAtDash == 0) { - return cmdutil.UsageError(cmd, "POD is required for exec") + return cmdutil.UsageError(cmd, execUsageStr) } if len(p.PodName) != 0 { - printDeprecationWarning("exec POD", "-p POD") + printDeprecationWarning("exec ", "-p ") if len(argsIn) < 1 { - return cmdutil.UsageError(cmd, "COMMAND is required for exec") + return cmdutil.UsageError(cmd, execUsageStr) } p.Command = argsIn } else { p.PodName = argsIn[0] p.Command = argsIn[1:] if len(p.Command) < 1 { - return cmdutil.UsageError(cmd, "COMMAND is required for exec") + return cmdutil.UsageError(cmd, execUsageStr) } } diff --git a/pkg/kubectl/cmd/logs.go b/pkg/kubectl/cmd/logs.go index ef4f62ff987..e4290919f83 100644 --- a/pkg/kubectl/cmd/logs.go +++ b/pkg/kubectl/cmd/logs.go @@ -53,6 +53,10 @@ var ( kubectl logs --since=1h nginx`) ) +const ( + logsUsageStr = "expected 'exec [container-name]'.\n is a required parameter for the logs command" +) + type LogsOptions struct { Namespace string ResourceArg string @@ -111,17 +115,17 @@ func (o *LogsOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Com containerName := cmdutil.GetFlagString(cmd, "container") switch len(args) { case 0: - return cmdutil.UsageError(cmd, "POD is required for logs") + return cmdutil.UsageError(cmd, logsUsageStr) case 1: o.ResourceArg = args[0] case 2: if cmd.Flag("container").Changed { - return cmdutil.UsageError(cmd, "only one of -c, [CONTAINER] arg is allowed") + return cmdutil.UsageError(cmd, "only one of -c or an inline [CONTAINER] arg is allowed") } o.ResourceArg = args[0] containerName = args[1] default: - return cmdutil.UsageError(cmd, "logs POD [-c CONTAINER]") + return cmdutil.UsageError(cmd, logsUsageStr) } var err error o.Namespace, _, err = f.DefaultNamespace() diff --git a/pkg/kubectl/cmd/scale.go b/pkg/kubectl/cmd/scale.go index b1ec4e6d295..b02ffb73bef 100644 --- a/pkg/kubectl/cmd/scale.go +++ b/pkg/kubectl/cmd/scale.go @@ -101,11 +101,6 @@ func RunScale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri printDeprecationWarning("scale", "resize") } - count := cmdutil.GetFlagInt(cmd, "replicas") - if count < 0 { - return cmdutil.UsageError(cmd, "--replicas=COUNT is required, and COUNT must be greater than or equal to 0") - } - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { return err @@ -120,10 +115,18 @@ func RunScale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri Flatten(). Do() err = r.Err() + if resource.IsUsageError(err) { + return cmdutil.UsageError(cmd, err.Error()) + } if err != nil { return err } + count := cmdutil.GetFlagInt(cmd, "replicas") + if count < 0 { + return cmdutil.UsageError(cmd, "The --replicas= flag is required, and must be greater than or equal to 0") + } + infos := []*resource.Info{} err = r.Visit(func(info *resource.Info, err error) error { if err == nil { diff --git a/pkg/kubectl/resource/builder.go b/pkg/kubectl/resource/builder.go index a5fadcfe9b7..41fc1a8b515 100644 --- a/pkg/kubectl/resource/builder.go +++ b/pkg/kubectl/resource/builder.go @@ -78,6 +78,21 @@ type Builder struct { schema validation.Schema } +var missingResourceError = fmt.Errorf(`You must provide one or more resources by argument or filename. +Example resource specifications include: + '-f rsrc.yaml' + '--filename=rsrc.json' + 'pods my-pod' + 'services'`) + +// TODO: expand this to include other errors. +func IsUsageError(err error) bool { + if err == nil { + return false + } + return err == missingResourceError +} + type resourceTuple struct { Resource string Name string @@ -700,7 +715,7 @@ func (b *Builder) visitorResult() *Result { if len(b.resources) != 0 { return &Result{err: fmt.Errorf("resource(s) were provided, but no name, label selector, or --all flag specified")} } - return &Result{err: fmt.Errorf("you must provide one or more resources by argument or filename (%s)", strings.Join(InputExtensions, "|"))} + return &Result{err: missingResourceError} } // Do returns a Result object with a Visitor for the resources identified by the Builder.