diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index dd284fdca85..f1ed3d40ed4 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -113,33 +113,29 @@ state of the cluster through the apiserver and makes changes attempting to move current state towards the desired state. Examples of controllers that ship with Kubernetes today are the replication controller, endpoints controller, namespace controller, and serviceaccounts controller.`, - PersistentPreRun: func(*cobra.Command, []string) { + PersistentPreRunE: func(*cobra.Command, []string) error { // silence client-go warnings. // kube-controller-manager generically watches APIs (including deprecated ones), // and CI ensures it works properly against matching kube-apiserver versions. restclient.SetDefaultWarningHandler(restclient.NoWarnings{}) + return nil }, - Run: func(cmd *cobra.Command, args []string) { + RunE: func(cmd *cobra.Command, args []string) error { verflag.PrintAndExitIfRequested() // Activate logging as soon as possible, after that // show flags with the final logging configuration. if err := logsapi.ValidateAndApply(s.Logs, utilfeature.DefaultFeatureGate); err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) + return err } cliflag.PrintFlags(cmd.Flags()) c, err := s.Config(KnownControllers(), ControllersDisabledByDefault.List()) if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) + return err } - if err := Run(c.Complete(), wait.NeverStop); err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } + return Run(c.Complete(), wait.NeverStop) }, Args: func(cmd *cobra.Command, args []string) error { for _, arg := range args {