From d7ddcca231612c618dce4e9895478167d397cbd7 Mon Sep 17 00:00:00 2001 From: David Eads Date: Wed, 17 Jan 2018 13:41:01 -0500 Subject: [PATCH] low hanging fruit for using cobra commands --- cmd/cloud-controller-manager/BUILD | 2 - cmd/cloud-controller-manager/app/BUILD | 2 +- .../app/controllermanager.go | 20 ++++--- .../controller-manager.go | 25 +++++---- cmd/hyperkube/BUILD | 2 - cmd/hyperkube/kube-aggregator.go | 52 ------------------- cmd/hyperkube/main.go | 1 - cmd/kube-apiserver/BUILD | 3 -- cmd/kube-apiserver/apiserver.go | 23 ++++---- cmd/kube-apiserver/app/BUILD | 2 +- cmd/kube-apiserver/app/server.go | 12 ++++- .../controller-manager.go | 4 ++ cmd/kube-proxy/proxy.go | 4 ++ cmd/kube-scheduler/BUILD | 1 + cmd/kube-scheduler/app/server.go | 3 +- cmd/kube-scheduler/scheduler.go | 13 ++++- cmd/kubectl/BUILD | 7 ++- cmd/kubectl/kubectl.go | 27 ++++++++-- cmd/kubelet/kubelet.go | 4 ++ pkg/kubectl/cmd/cmd.go | 5 ++ 20 files changed, 111 insertions(+), 101 deletions(-) delete mode 100644 cmd/hyperkube/kube-aggregator.go diff --git a/cmd/cloud-controller-manager/BUILD b/cmd/cloud-controller-manager/BUILD index 7ab8666cab..2415007ca0 100644 --- a/cmd/cloud-controller-manager/BUILD +++ b/cmd/cloud-controller-manager/BUILD @@ -21,11 +21,9 @@ go_library( importpath = "k8s.io/kubernetes/cmd/cloud-controller-manager", deps = [ "//cmd/cloud-controller-manager/app:go_default_library", - "//cmd/cloud-controller-manager/app/options:go_default_library", "//pkg/client/metrics/prometheus:go_default_library", "//pkg/cloudprovider/providers:go_default_library", "//pkg/version/prometheus:go_default_library", - "//pkg/version/verflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", diff --git a/cmd/cloud-controller-manager/app/BUILD b/cmd/cloud-controller-manager/app/BUILD index f378d94581..ff97e0cdd8 100644 --- a/cmd/cloud-controller-manager/app/BUILD +++ b/cmd/cloud-controller-manager/app/BUILD @@ -18,10 +18,10 @@ go_library( "//pkg/controller/route:go_default_library", "//pkg/controller/service:go_default_library", "//pkg/util/configz:go_default_library", + "//pkg/version/verflag:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/healthz:go_default_library", diff --git a/cmd/cloud-controller-manager/app/controllermanager.go b/cmd/cloud-controller-manager/app/controllermanager.go index de8005224a..f48c69d4c2 100644 --- a/cmd/cloud-controller-manager/app/controllermanager.go +++ b/cmd/cloud-controller-manager/app/controllermanager.go @@ -17,6 +17,7 @@ limitations under the License. package app import ( + "fmt" "math/rand" "net" "net/http" @@ -27,6 +28,10 @@ import ( "strings" "time" + "github.com/golang/glog" + "github.com/prometheus/client_golang/prometheus" + "github.com/spf13/cobra" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/server/healthz" @@ -46,11 +51,7 @@ import ( routecontroller "k8s.io/kubernetes/pkg/controller/route" servicecontroller "k8s.io/kubernetes/pkg/controller/service" "k8s.io/kubernetes/pkg/util/configz" - - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus" - "github.com/spf13/cobra" - "github.com/spf13/pflag" + "k8s.io/kubernetes/pkg/version/verflag" ) const ( @@ -61,14 +62,21 @@ const ( // NewCloudControllerManagerCommand creates a *cobra.Command object with default parameters func NewCloudControllerManagerCommand() *cobra.Command { s := options.NewCloudControllerManagerServer() - s.AddFlags(pflag.CommandLine) cmd := &cobra.Command{ Use: "cloud-controller-manager", Long: `The Cloud controller manager is a daemon that embeds the cloud specific control loops shipped with Kubernetes.`, Run: func(cmd *cobra.Command, args []string) { + verflag.PrintAndExitIfRequested() + + if err := Run(s); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + }, } + s.AddFlags(cmd.Flags()) return cmd } diff --git a/cmd/cloud-controller-manager/controller-manager.go b/cmd/cloud-controller-manager/controller-manager.go index 1d8b498fbf..edac325fa5 100644 --- a/cmd/cloud-controller-manager/controller-manager.go +++ b/cmd/cloud-controller-manager/controller-manager.go @@ -20,35 +20,40 @@ limitations under the License. package main import ( + goflag "flag" "fmt" + "math/rand" "os" + "time" - "k8s.io/apiserver/pkg/util/flag" + utilflag "k8s.io/apiserver/pkg/util/flag" "k8s.io/apiserver/pkg/util/logs" "k8s.io/kubernetes/cmd/cloud-controller-manager/app" - "k8s.io/kubernetes/cmd/cloud-controller-manager/app/options" _ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration // NOTE: Importing all in-tree cloud-providers is not required when // implementing an out-of-tree cloud-provider. _ "k8s.io/kubernetes/pkg/cloudprovider/providers" _ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration - "k8s.io/kubernetes/pkg/version/verflag" "github.com/spf13/pflag" ) func main() { - s := options.NewCloudControllerManagerServer() - s.AddFlags(pflag.CommandLine) + rand.Seed(time.Now().UTC().UnixNano()) - flag.InitFlags() + command := app.NewCloudControllerManagerCommand() + + // TODO: once we switch everything over to Cobra commands, we can go back to calling + // utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the + // normalize func and add the go flag set by hand. + pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc) + pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) + // utilflag.InitFlags() logs.InitLogs() defer logs.FlushLogs() - verflag.PrintAndExitIfRequested() - - if err := app.Run(s); err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) + if err := command.Execute(); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } } diff --git a/cmd/hyperkube/BUILD b/cmd/hyperkube/BUILD index 09ce16626f..f4974ef0d7 100644 --- a/cmd/hyperkube/BUILD +++ b/cmd/hyperkube/BUILD @@ -32,7 +32,6 @@ go_library( srcs = [ "cloud-controller-manager.go", "hyperkube.go", - "kube-aggregator.go", "kube-apiserver.go", "kube-controller-manager.go", "kube-proxy.go", @@ -66,7 +65,6 @@ go_library( "//vendor/k8s.io/apiserver/pkg/server/healthz:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", - "//vendor/k8s.io/kube-aggregator/pkg/cmd/server:go_default_library", ], ) diff --git a/cmd/hyperkube/kube-aggregator.go b/cmd/hyperkube/kube-aggregator.go deleted file mode 100644 index 6f1b022d39..0000000000 --- a/cmd/hyperkube/kube-aggregator.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "os" - - "k8s.io/kube-aggregator/pkg/cmd/server" -) - -// NewKubeAggregator creates a new hyperkube Server object that includes the -// description and flags. -func NewKubeAggregator() *Server { - o := server.NewDefaultOptions(os.Stdout, os.Stderr) - - hks := Server{ - name: "aggregator", - AlternativeName: "kube-aggregator", - SimpleUsage: "aggregator", - Long: "Aggregator for Kubernetes-style API servers: dynamic registration, discovery summarization, secure proxy.", - Run: func(_ *Server, args []string, stopCh <-chan struct{}) error { - if err := o.Complete(); err != nil { - return err - } - if err := o.Validate(args); err != nil { - return err - } - if err := o.RunAggregator(stopCh); err != nil { - return err - } - return nil - }, - RespectsStopCh: true, - } - - o.AddFlags(hks.Flags()) - return &hks -} diff --git a/cmd/hyperkube/main.go b/cmd/hyperkube/main.go index 123f040a87..0bdd55f9a4 100644 --- a/cmd/hyperkube/main.go +++ b/cmd/hyperkube/main.go @@ -44,7 +44,6 @@ func main() { hk.AddServer(kubelet) } hk.AddServer(NewKubeProxy()) - hk.AddServer(NewKubeAggregator()) // Alpha servers hk.AddAlphaServer(NewCloudControllerManager()) diff --git a/cmd/kube-apiserver/BUILD b/cmd/kube-apiserver/BUILD index 29a454f06e..ced176fabe 100644 --- a/cmd/kube-apiserver/BUILD +++ b/cmd/kube-apiserver/BUILD @@ -21,12 +21,9 @@ go_library( importpath = "k8s.io/kubernetes/cmd/kube-apiserver", deps = [ "//cmd/kube-apiserver/app:go_default_library", - "//cmd/kube-apiserver/app/options:go_default_library", "//pkg/client/metrics/prometheus:go_default_library", "//pkg/version/prometheus:go_default_library", - "//pkg/version/verflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", ], diff --git a/cmd/kube-apiserver/apiserver.go b/cmd/kube-apiserver/apiserver.go index 5ed248f155..9d3ce436db 100644 --- a/cmd/kube-apiserver/apiserver.go +++ b/cmd/kube-apiserver/apiserver.go @@ -19,6 +19,7 @@ limitations under the License. package main import ( + goflag "flag" "fmt" "math/rand" "os" @@ -26,31 +27,29 @@ import ( "github.com/spf13/pflag" - "k8s.io/apiserver/pkg/server" - "k8s.io/apiserver/pkg/util/flag" + utilflag "k8s.io/apiserver/pkg/util/flag" "k8s.io/apiserver/pkg/util/logs" "k8s.io/kubernetes/cmd/kube-apiserver/app" - "k8s.io/kubernetes/cmd/kube-apiserver/app/options" _ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration _ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration - "k8s.io/kubernetes/pkg/version/verflag" ) func main() { rand.Seed(time.Now().UTC().UnixNano()) - s := options.NewServerRunOptions() - s.AddFlags(pflag.CommandLine) + command := app.NewAPIServerCommand() - flag.InitFlags() + // TODO: once we switch everything over to Cobra commands, we can go back to calling + // utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the + // normalize func and add the go flag set by hand. + pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc) + pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) + // utilflag.InitFlags() logs.InitLogs() defer logs.FlushLogs() - verflag.PrintAndExitIfRequested() - - stopCh := server.SetupSignalHandler() - if err := app.Run(s, stopCh); err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) + if err := command.Execute(); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } } diff --git a/cmd/kube-apiserver/app/BUILD b/cmd/kube-apiserver/app/BUILD index 6f2497a161..e0402ec4d3 100644 --- a/cmd/kube-apiserver/app/BUILD +++ b/cmd/kube-apiserver/app/BUILD @@ -46,11 +46,11 @@ go_library( "//pkg/util/reflector/prometheus:go_default_library", "//pkg/util/workqueue/prometheus:go_default_library", "//pkg/version:go_default_library", + "//pkg/version/verflag:go_default_library", "//plugin/pkg/auth/authenticator/token/bootstrap:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion:go_default_library", diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 51f4bfd216..f93be39feb 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -35,7 +35,6 @@ import ( "github.com/go-openapi/spec" "github.com/golang/glog" "github.com/spf13/cobra" - "github.com/spf13/pflag" "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" @@ -56,6 +55,7 @@ import ( openapi "k8s.io/kube-openapi/pkg/common" webhookinit "k8s.io/apiserver/pkg/admission/plugin/webhook/initializer" + "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/storage/etcd3/preflight" clientgoinformers "k8s.io/client-go/informers" clientgoclientset "k8s.io/client-go/kubernetes" @@ -93,6 +93,7 @@ import ( _ "k8s.io/kubernetes/pkg/util/reflector/prometheus" // for reflector metric registration _ "k8s.io/kubernetes/pkg/util/workqueue/prometheus" // for workqueue metric registration + "k8s.io/kubernetes/pkg/version/verflag" ) const etcdRetryLimit = 60 @@ -101,7 +102,6 @@ const etcdRetryInterval = 1 * time.Second // NewAPIServerCommand creates a *cobra.Command object with default parameters func NewAPIServerCommand() *cobra.Command { s := options.NewServerRunOptions() - s.AddFlags(pflag.CommandLine) cmd := &cobra.Command{ Use: "kube-apiserver", Long: `The Kubernetes API server validates and configures data @@ -109,8 +109,16 @@ for the api objects which include pods, services, replicationcontrollers, and others. The API Server services REST operations and provides the frontend to the cluster's shared state through which all other components interact.`, Run: func(cmd *cobra.Command, args []string) { + verflag.PrintAndExitIfRequested() + + stopCh := server.SetupSignalHandler() + if err := Run(s, stopCh); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } }, } + s.AddFlags(cmd.Flags()) return cmd } diff --git a/cmd/kube-controller-manager/controller-manager.go b/cmd/kube-controller-manager/controller-manager.go index 495a5734f4..6618dae332 100644 --- a/cmd/kube-controller-manager/controller-manager.go +++ b/cmd/kube-controller-manager/controller-manager.go @@ -22,7 +22,9 @@ package main import ( "fmt" + "math/rand" "os" + "time" "k8s.io/apiserver/pkg/util/flag" "k8s.io/apiserver/pkg/util/logs" @@ -38,6 +40,8 @@ import ( ) func main() { + rand.Seed(time.Now().UTC().UnixNano()) + s := options.NewCMServer() s.AddFlags(pflag.CommandLine, app.KnownControllers(), app.ControllersDisabledByDefault.List()) diff --git a/cmd/kube-proxy/proxy.go b/cmd/kube-proxy/proxy.go index a9c958d6b2..092491e337 100644 --- a/cmd/kube-proxy/proxy.go +++ b/cmd/kube-proxy/proxy.go @@ -19,7 +19,9 @@ package main import ( goflag "flag" "fmt" + "math/rand" "os" + "time" "github.com/spf13/pflag" @@ -31,6 +33,8 @@ import ( ) func main() { + rand.Seed(time.Now().UTC().UnixNano()) + command := app.NewProxyCommand() // TODO: once we switch everything over to Cobra commands, we can go back to calling diff --git a/cmd/kube-scheduler/BUILD b/cmd/kube-scheduler/BUILD index 88e75f4e81..58142589ea 100644 --- a/cmd/kube-scheduler/BUILD +++ b/cmd/kube-scheduler/BUILD @@ -23,6 +23,7 @@ go_library( "//cmd/kube-scheduler/app:go_default_library", "//pkg/client/metrics/prometheus:go_default_library", "//pkg/version/prometheus:go_default_library", + "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", ], diff --git a/cmd/kube-scheduler/app/server.go b/cmd/kube-scheduler/app/server.go index a80a376f9f..0f0e1bf25e 100644 --- a/cmd/kube-scheduler/app/server.go +++ b/cmd/kube-scheduler/app/server.go @@ -341,8 +341,7 @@ through the API as necessary.`, glog.Fatalf("unable to apply config defaults: %v", err) } - opts.AddFlags(pflag.CommandLine) - + opts.AddFlags(cmd.Flags()) cmd.MarkFlagFilename("config", "yaml", "yml", "json") return cmd diff --git a/cmd/kube-scheduler/scheduler.go b/cmd/kube-scheduler/scheduler.go index 1f6fcf7d60..a925ced373 100644 --- a/cmd/kube-scheduler/scheduler.go +++ b/cmd/kube-scheduler/scheduler.go @@ -17,8 +17,12 @@ limitations under the License. package main import ( + goflag "flag" + "math/rand" "os" + "time" + "github.com/spf13/pflag" utilflag "k8s.io/apiserver/pkg/util/flag" "k8s.io/apiserver/pkg/util/logs" "k8s.io/kubernetes/cmd/kube-scheduler/app" @@ -27,9 +31,16 @@ import ( ) func main() { + rand.Seed(time.Now().UTC().UnixNano()) + command := app.NewSchedulerCommand() - utilflag.InitFlags() + // TODO: once we switch everything over to Cobra commands, we can go back to calling + // utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the + // normalize func and add the go flag set by hand. + pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc) + pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) + // utilflag.InitFlags() logs.InitLogs() defer logs.FlushLogs() diff --git a/cmd/kubectl/BUILD b/cmd/kubectl/BUILD index 74501eed97..f611640950 100644 --- a/cmd/kubectl/BUILD +++ b/cmd/kubectl/BUILD @@ -19,7 +19,12 @@ go_library( srcs = ["kubectl.go"], importpath = "k8s.io/kubernetes/cmd/kubectl", visibility = ["//visibility:private"], - deps = ["//cmd/kubectl/app:go_default_library"], + deps = [ + "//pkg/kubectl/cmd:go_default_library", + "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", + ], ) filegroup( diff --git a/cmd/kubectl/kubectl.go b/cmd/kubectl/kubectl.go index 5864a5ae68..4802021b54 100644 --- a/cmd/kubectl/kubectl.go +++ b/cmd/kubectl/kubectl.go @@ -17,16 +17,33 @@ limitations under the License. package main import ( - "fmt" + goflag "flag" + "math/rand" "os" + "time" - "k8s.io/kubernetes/cmd/kubectl/app" + "github.com/spf13/pflag" + + utilflag "k8s.io/apiserver/pkg/util/flag" + "k8s.io/apiserver/pkg/util/logs" + "k8s.io/kubernetes/pkg/kubectl/cmd" ) func main() { - if err := app.Run(); err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) + rand.Seed(time.Now().UTC().UnixNano()) + + command := cmd.NewDefaultKubectlCommand() + + // TODO: once we switch everything over to Cobra commands, we can go back to calling + // utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the + // normalize func and add the go flag set by hand. + pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc) + pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) + // utilflag.InitFlags() + logs.InitLogs() + defer logs.FlushLogs() + + if err := command.Execute(); err != nil { os.Exit(1) } - os.Exit(0) } diff --git a/cmd/kubelet/kubelet.go b/cmd/kubelet/kubelet.go index 76b86233dc..382976863f 100644 --- a/cmd/kubelet/kubelet.go +++ b/cmd/kubelet/kubelet.go @@ -22,7 +22,9 @@ package main import ( "fmt" + "math/rand" "os" + "time" "github.com/golang/glog" "github.com/spf13/pflag" @@ -53,6 +55,8 @@ func die(err error) { } func main() { + rand.Seed(time.Now().UTC().UnixNano()) + fs := pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) // set the normalize func, similar to k8s.io/apiserver/pkg/util/flag/flags.go:InitFlags fs.SetNormalizeFunc(flag.WordSepNormalizeFunc) diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index 04429a76b4..8ab38ac0b7 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -19,6 +19,7 @@ package cmd import ( "fmt" "io" + "os" "k8s.io/apiserver/pkg/util/flag" "k8s.io/client-go/tools/clientcmd" @@ -212,6 +213,10 @@ var ( } ) +func NewDefaultKubectlCommand() *cobra.Command { + return NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, os.Stdout, os.Stderr) +} + // NewKubectlCommand creates the `kubectl` command and its nested children. func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cobra.Command { // Parent command to which all subcommands are added.