diff --git a/cmd/kubeadm/BUILD b/cmd/kubeadm/BUILD index a1de9a88fe7..eace674f7c8 100644 --- a/cmd/kubeadm/BUILD +++ b/cmd/kubeadm/BUILD @@ -18,7 +18,10 @@ go_library( name = "go_default_library", srcs = ["kubeadm.go"], importpath = "k8s.io/kubernetes/cmd/kubeadm", - deps = ["//cmd/kubeadm/app:go_default_library"], + deps = [ + "//cmd/kubeadm/app:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", + ], ) filegroup( diff --git a/cmd/kubeadm/app/cmd/phases/workflow/BUILD b/cmd/kubeadm/app/cmd/phases/workflow/BUILD index 01571c97a71..9c0ee582de8 100644 --- a/cmd/kubeadm/app/cmd/phases/workflow/BUILD +++ b/cmd/kubeadm/app/cmd/phases/workflow/BUILD @@ -10,6 +10,7 @@ go_library( importpath = "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow", visibility = ["//visibility:public"], deps = [ + "//cmd/kubeadm/app/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/cmd/kubeadm/app/cmd/phases/workflow/runner.go b/cmd/kubeadm/app/cmd/phases/workflow/runner.go index d98dd873ee0..f814d76a584 100644 --- a/cmd/kubeadm/app/cmd/phases/workflow/runner.go +++ b/cmd/kubeadm/app/cmd/phases/workflow/runner.go @@ -18,12 +18,13 @@ package workflow import ( "fmt" - "os" "strings" "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "k8s.io/kubernetes/cmd/kubeadm/app/util" ) // phaseSeparator defines the separator to be used when concatenating nested @@ -346,10 +347,7 @@ func (e *Runner) BindToCommand(cmd *cobra.Command) { // overrides the command triggering the Runner using the phaseCmd e.runCmd = cmd e.Options.FilterPhases = []string{phaseSelector} - if err := e.Run(args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } + util.CheckErr(e.Run(args)) }, } diff --git a/cmd/kubeadm/app/cmd/version.go b/cmd/kubeadm/app/cmd/version.go index e6f6675ec7f..e66f05af57a 100644 --- a/cmd/kubeadm/app/cmd/version.go +++ b/cmd/kubeadm/app/cmd/version.go @@ -62,7 +62,7 @@ func RunVersion(out io.Writer, cmd *cobra.Command) error { const flag = "output" of, err := cmd.Flags().GetString(flag) if err != nil { - klog.Fatalf("error accessing flag %s for command %s: %v", flag, cmd.Name(), err) + return errors.Wrapf(err, "error accessing flag %s for command %s", flag, cmd.Name()) } switch of { diff --git a/cmd/kubeadm/app/util/error.go b/cmd/kubeadm/app/util/error.go index e026f71ebc1..8757a3071a0 100644 --- a/cmd/kubeadm/app/util/error.go +++ b/cmd/kubeadm/app/util/error.go @@ -17,8 +17,10 @@ limitations under the License. package util import ( + "flag" "fmt" "os" + "strconv" "strings" errorsutil "k8s.io/apimachinery/pkg/util/errors" @@ -64,16 +66,35 @@ type preflightError interface { // checkErr formats a given error as a string and calls the passed handleErr // func with that string and an exit code. func checkErr(err error, handleErr func(string, int)) { + + var msg string + if err != nil { + msg = fmt.Sprintf("%s\nTo see the stack trace of this error execute with --v=5 or higher", err.Error()) + // check if the verbosity level in klog is high enough and print a stack trace. + f := flag.CommandLine.Lookup("v") + if f != nil { + // assume that the "v" flag contains a parseable Int32 as per klog's "Level" type alias, + // thus no error from ParseInt is handled here. + if v, e := strconv.ParseInt(f.Value.String(), 10, 32); e == nil { + // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md + // klog.V(5) - Trace level verbosity + if v > 4 { + msg = fmt.Sprintf("%+v", err) + } + } + } + } + switch err.(type) { case nil: return case preflightError: - handleErr(err.Error(), PreFlightExitCode) + handleErr(msg, PreFlightExitCode) case errorsutil.Aggregate: - handleErr(err.Error(), ValidationExitCode) + handleErr(msg, ValidationExitCode) default: - handleErr(err.Error(), DefaultErrorExitCode) + handleErr(msg, DefaultErrorExitCode) } } diff --git a/cmd/kubeadm/kubeadm.go b/cmd/kubeadm/kubeadm.go index addfdb84f46..6b23a45b9fc 100644 --- a/cmd/kubeadm/kubeadm.go +++ b/cmd/kubeadm/kubeadm.go @@ -17,13 +17,10 @@ limitations under the License. package main import ( - "os" - "k8s.io/kubernetes/cmd/kubeadm/app" + "k8s.io/kubernetes/cmd/kubeadm/app/util" ) func main() { - if err := app.Run(); err != nil { - os.Exit(1) - } + util.CheckErr(app.Run()) }