From b41b53122aac9c1ba7ac941039232238f49ac90f Mon Sep 17 00:00:00 2001 From: feihujiang Date: Tue, 23 Jun 2015 20:26:27 +0800 Subject: [PATCH] =?UTF-8?q?Add=20source=20in=20=E2=80=9Cerror=20from=20ser?= =?UTF-8?q?ver=E2=80=9D=20message=20when=20using=20kubectl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/kubectl/cmd/create.go | 4 ++-- pkg/kubectl/cmd/delete.go | 6 +++--- pkg/kubectl/cmd/update.go | 4 ++-- pkg/kubectl/cmd/util/helpers.go | 15 +++++++++++++++ pkg/kubectl/resource/mapper.go | 1 + pkg/kubectl/resource/visitor.go | 3 +++ 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index 44f78bbb3be..653649b2553 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -97,11 +97,11 @@ func RunCreate(f *cmdutil.Factory, out io.Writer, filenames util.StringList) err err = r.Visit(func(info *resource.Info) error { data, err := info.Mapping.Codec.Encode(info.Object) if err != nil { - return err + return cmdutil.AddSourceToErr("creating", info.Source, err) } obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, data) if err != nil { - return err + return cmdutil.AddSourceToErr("creating", info.Source, err) } count++ info.Refresh(obj, true) diff --git a/pkg/kubectl/cmd/delete.go b/pkg/kubectl/cmd/delete.go index 55b0e1b8270..8780ae2bb7a 100644 --- a/pkg/kubectl/cmd/delete.go +++ b/pkg/kubectl/cmd/delete.go @@ -122,14 +122,14 @@ func ReapResult(r *resource.Result, f *cmdutil.Factory, out io.Writer, isDefault if kubectl.IsNoSuchReaperError(err) && isDefaultDelete { return deleteResource(info, out) } - return err + return cmdutil.AddSourceToErr("reaping", info.Source, err) } var options *api.DeleteOptions if gracePeriod >= 0 { options = api.NewDeleteOptions(int64(gracePeriod)) } if _, err := reaper.Stop(info.Namespace, info.Name, timeout, options); err != nil { - return err + return cmdutil.AddSourceToErr("stopping", info.Source, err) } fmt.Fprintf(out, "%s/%s\n", info.Mapping.Resource, info.Name) return nil @@ -163,7 +163,7 @@ func DeleteResult(r *resource.Result, out io.Writer, ignoreNotFound bool) error func deleteResource(info *resource.Info, out io.Writer) error { if err := resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name); err != nil { - return err + return cmdutil.AddSourceToErr("deleting", info.Source, err) } fmt.Fprintf(out, "%s/%s\n", info.Mapping.Resource, info.Name) return nil diff --git a/pkg/kubectl/cmd/update.go b/pkg/kubectl/cmd/update.go index e68f7dd20e1..84378040afc 100644 --- a/pkg/kubectl/cmd/update.go +++ b/pkg/kubectl/cmd/update.go @@ -111,11 +111,11 @@ func RunUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str return r.Visit(func(info *resource.Info) error { data, err := info.Mapping.Codec.Encode(info.Object) if err != nil { - return err + return cmdutil.AddSourceToErr("updating", info.Source, err) } obj, err := resource.NewHelper(info.Client, info.Mapping).Update(info.Namespace, info.Name, true, data) if err != nil { - return err + return cmdutil.AddSourceToErr("updating", info.Source, err) } info.Refresh(obj, true) printObjectSpecificMessage(obj, out) diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index b4e9a6aa8c2..7bde9c1b11e 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -48,6 +48,21 @@ type debugError interface { DebugError() (msg string, args []interface{}) } +// AddSourceToErr adds handleResourcePrefix and source string to error message. +// verb is the string like "creating", "deleting" etc. +// souce is the filename or URL to the template file(*.json or *.yaml), or stdin to use to handle the resource. +func AddSourceToErr(verb string, source string, err error) error { + if source != "" { + if statusError, ok := err.(*errors.StatusError); ok { + status := statusError.Status() + status.Message = fmt.Sprintf("error when %s %q: %v", verb, source, status.Message) + return &errors.StatusError{status} + } + return fmt.Errorf("error when %s %q: %v", verb, source, err) + } + return err +} + // CheckErr prints a user friendly error to STDERR and exits with a non-zero // exit code. Unrecognized errors will be printed with an "error: " prefix. // diff --git a/pkg/kubectl/resource/mapper.go b/pkg/kubectl/resource/mapper.go index a613d1c5978..e8a1d6184c9 100644 --- a/pkg/kubectl/resource/mapper.go +++ b/pkg/kubectl/resource/mapper.go @@ -69,6 +69,7 @@ func (m *Mapper) InfoForData(data []byte, source string) (*Info, error) { Client: client, Namespace: namespace, Name: name, + Source: source, Object: obj, ResourceVersion: resourceVersion, diff --git a/pkg/kubectl/resource/visitor.go b/pkg/kubectl/resource/visitor.go index 6149cc33e88..194305fc184 100644 --- a/pkg/kubectl/resource/visitor.go +++ b/pkg/kubectl/resource/visitor.go @@ -66,6 +66,9 @@ type Info struct { Namespace string Name string + // Optional, Source is the filename or URL to template file (.json or .yaml), + // or stdin to use to handle the resource + Source string // Optional, this is the most recent value returned by the server if available runtime.Object // Optional, this is the most recent resource version the server knows about for