mirror of https://github.com/k3s-io/k3s
Merge pull request #9803 from satnam6502/execessive
Improve error output of kubectl updatepull/6/head
commit
3505fb48a3
|
@ -48,7 +48,7 @@ func NewCmdUpdate(f *cmdutil.Factory, out io.Writer) *cobra.Command {
|
||||||
Example: update_example,
|
Example: update_example,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
err := RunUpdate(f, out, cmd, args, filenames)
|
err := RunUpdate(f, out, cmd, args, filenames)
|
||||||
cmdutil.CheckErr(err)
|
cmdutil.CheckCustomErr("Update failed", err)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
usage := "Filename, directory, or URL to file to use to update the resource."
|
usage := "Filename, directory, or URL to file to use to update the resource."
|
||||||
|
|
|
@ -83,6 +83,58 @@ func checkErr(err error, handleErr func(string)) {
|
||||||
handleErr(msg)
|
handleErr(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckCustomErr is like CheckErr except a custom prefix error
|
||||||
|
// string may be provied to help produce more specific error messages.
|
||||||
|
// For example, for the update failed case this function could be called
|
||||||
|
// with:
|
||||||
|
// cmdutil.CheckCustomErr("Update failed", err)
|
||||||
|
// This function supresses the detailed output that is produced by CheckErr
|
||||||
|
// and specifically the field is erased and the error message has the details
|
||||||
|
// of the spec removed. Unfortunately, what starts off as a detail message is
|
||||||
|
// a sperate field ends up being concatentated into one string which contains
|
||||||
|
// the spec and the detail string. To avoid significant refactoring of the error
|
||||||
|
// data structures we just extract the required detail string by looking for it
|
||||||
|
// after "}': " which is horrible but expedient.
|
||||||
|
func CheckCustomErr(customPrefix string, err error) {
|
||||||
|
checkCustomErr(customPrefix, err, fatal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkCustomErr(customPrefix string, err error, handleErr func(string)) {
|
||||||
|
if err == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if errors.IsInvalid(err) {
|
||||||
|
details := err.(*errors.StatusError).Status().Details
|
||||||
|
for i := range details.Causes {
|
||||||
|
c := &details.Causes[i]
|
||||||
|
s := strings.Split(c.Message, "}': ")
|
||||||
|
if len(s) == 2 {
|
||||||
|
c.Message =
|
||||||
|
s[1]
|
||||||
|
c.Field = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prefix := fmt.Sprintf("%s", customPrefix)
|
||||||
|
errs := statusCausesToAggrError(details.Causes)
|
||||||
|
handleErr(MultilineError(prefix, errs))
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle multiline errors
|
||||||
|
if clientcmd.IsConfigurationInvalid(err) {
|
||||||
|
handleErr(MultilineError("Error in configuration: ", err))
|
||||||
|
}
|
||||||
|
if agg, ok := err.(utilerrors.Aggregate); ok && len(agg.Errors()) > 0 {
|
||||||
|
handleErr(MultipleErrors("", agg.Errors()))
|
||||||
|
}
|
||||||
|
|
||||||
|
msg, ok := StandardErrorMessage(err)
|
||||||
|
if !ok {
|
||||||
|
msg = fmt.Sprintf("error: %s\n", err.Error())
|
||||||
|
}
|
||||||
|
handleErr(msg)
|
||||||
|
}
|
||||||
|
|
||||||
func statusCausesToAggrError(scs []api.StatusCause) utilerrors.Aggregate {
|
func statusCausesToAggrError(scs []api.StatusCause) utilerrors.Aggregate {
|
||||||
errs := make([]error, len(scs))
|
errs := make([]error, len(scs))
|
||||||
for i, sc := range scs {
|
for i, sc := range scs {
|
||||||
|
|
Loading…
Reference in New Issue