mirror of
https://github.com/optim-enterprises-bv/kubernetes.git
synced 2025-11-01 18:58:18 +00:00
switch hyper to cobra
This commit is contained in:
@@ -20,33 +20,156 @@ limitations under the License.
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
goflag "flag"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
|
||||
utilflag "k8s.io/apiserver/pkg/util/flag"
|
||||
"k8s.io/apiserver/pkg/util/logs"
|
||||
cloudcontrollermanager "k8s.io/kubernetes/cmd/cloud-controller-manager/app"
|
||||
kubeapiserver "k8s.io/kubernetes/cmd/kube-apiserver/app"
|
||||
kubecontrollermanager "k8s.io/kubernetes/cmd/kube-controller-manager/app"
|
||||
kubeproxy "k8s.io/kubernetes/cmd/kube-proxy/app"
|
||||
kubescheduler "k8s.io/kubernetes/cmd/kube-scheduler/app"
|
||||
kubelet "k8s.io/kubernetes/cmd/kubelet/app"
|
||||
_ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration
|
||||
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
|
||||
kubectl "k8s.io/kubernetes/pkg/kubectl/cmd"
|
||||
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
|
||||
)
|
||||
|
||||
func main() {
|
||||
hk := HyperKube{
|
||||
Name: "hyperkube",
|
||||
Long: "This is an all-in-one binary that can run any of the various Kubernetes servers.",
|
||||
}
|
||||
rand.Seed(time.Now().UTC().UnixNano())
|
||||
|
||||
hk.AddServer(NewKubectlServer())
|
||||
hk.AddServer(NewKubeAPIServer())
|
||||
hk.AddServer(NewKubeControllerManager())
|
||||
hk.AddServer(NewScheduler())
|
||||
if kubelet, err := NewKubelet(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "error: %v\n", err)
|
||||
hyperkubeCommand, allCommandFns := NewHyperKubeCommand()
|
||||
|
||||
// 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()
|
||||
|
||||
basename := filepath.Base(os.Args[0])
|
||||
if err := commandFor(basename, hyperkubeCommand, allCommandFns).Execute(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
os.Exit(1)
|
||||
} else {
|
||||
hk.AddServer(kubelet)
|
||||
}
|
||||
hk.AddServer(NewKubeProxy())
|
||||
|
||||
// Alpha servers
|
||||
hk.AddAlphaServer(NewCloudControllerManager())
|
||||
|
||||
hk.RunToExit(os.Args)
|
||||
}
|
||||
|
||||
func commandFor(basename string, defaultCommand *cobra.Command, commands []func() *cobra.Command) *cobra.Command {
|
||||
for _, commandFn := range commands {
|
||||
command := commandFn()
|
||||
if command.Name() == basename {
|
||||
return command
|
||||
}
|
||||
for _, alias := range command.Aliases {
|
||||
if alias == basename {
|
||||
return command
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return defaultCommand
|
||||
}
|
||||
|
||||
// NewCmdRequestProject implement the OpenShift cli RequestProject command.
|
||||
func NewHyperKubeCommand() (*cobra.Command, []func() *cobra.Command) {
|
||||
// these have to be functions since the command is polymorphic. Cobra wants you to be top level
|
||||
// command to get executed
|
||||
apiserver := func() *cobra.Command {
|
||||
ret := kubeapiserver.NewAPIServerCommand()
|
||||
// add back some unfortunate aliases that should be removed
|
||||
ret.Aliases = []string{"apiserver"}
|
||||
return ret
|
||||
}
|
||||
controller := func() *cobra.Command {
|
||||
ret := kubecontrollermanager.NewControllerManagerCommand()
|
||||
// add back some unfortunate aliases that should be removed
|
||||
ret.Aliases = []string{"controller-manager"}
|
||||
return ret
|
||||
}
|
||||
proxy := func() *cobra.Command {
|
||||
ret := kubeproxy.NewProxyCommand()
|
||||
// add back some unfortunate aliases that should be removed
|
||||
ret.Aliases = []string{"proxy"}
|
||||
return ret
|
||||
}
|
||||
scheduler := func() *cobra.Command {
|
||||
ret := kubescheduler.NewSchedulerCommand()
|
||||
// add back some unfortunate aliases that should be removed
|
||||
ret.Aliases = []string{"scheduler"}
|
||||
return ret
|
||||
}
|
||||
kubectlCmd := func() *cobra.Command { return kubectl.NewDefaultKubectlCommand() }
|
||||
kubelet := func() *cobra.Command { return kubelet.NewKubeletCommand() }
|
||||
cloudController := func() *cobra.Command { return cloudcontrollermanager.NewCloudControllerManagerCommand() }
|
||||
|
||||
commandFns := []func() *cobra.Command{
|
||||
apiserver,
|
||||
controller,
|
||||
proxy,
|
||||
scheduler,
|
||||
kubectlCmd,
|
||||
kubelet,
|
||||
cloudController,
|
||||
}
|
||||
|
||||
makeSymlinksFlag := false
|
||||
cmd := &cobra.Command{
|
||||
Use: "hyperkube",
|
||||
Short: "Request a new project",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 0 || !makeSymlinksFlag {
|
||||
cmd.Help()
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if err := makeSymlinks(os.Args[0], commandFns); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%v\n", err.Error())
|
||||
}
|
||||
},
|
||||
}
|
||||
cmd.Flags().BoolVar(&makeSymlinksFlag, "make-symlinks", makeSymlinksFlag, "create a symlink for each server in current directory")
|
||||
cmd.Flags().MarkHidden("make-symlinks") // hide this flag from appearing in servers' usage output
|
||||
|
||||
for i := range commandFns {
|
||||
cmd.AddCommand(commandFns[i]())
|
||||
}
|
||||
|
||||
return cmd, commandFns
|
||||
}
|
||||
|
||||
// makeSymlinks will create a symlink for each command in the local directory.
|
||||
func makeSymlinks(targetName string, commandFns []func() *cobra.Command) error {
|
||||
wd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var errs bool
|
||||
for _, commandFn := range commandFns {
|
||||
command := commandFn()
|
||||
link := path.Join(wd, command.Name())
|
||||
|
||||
err := os.Symlink(targetName, link)
|
||||
if err != nil {
|
||||
errs = true
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
if errs {
|
||||
return errors.New("Error creating one or more symlinks.")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user