| // Copyright 2020 The Monogon Project Authors. | 
 | // | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 | // | 
 | // 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. | 
 |  | 
 | /* | 
 | Copyright 2014 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. | 
 | */ | 
 |  | 
 | // Adapted from https://github.com/dims/hyperkube | 
 |  | 
 | package main | 
 |  | 
 | import ( | 
 | 	goflag "flag" | 
 | 	"math/rand" | 
 | 	"os" | 
 | 	"path/filepath" | 
 | 	"time" | 
 |  | 
 | 	"github.com/spf13/cobra" | 
 | 	"github.com/spf13/pflag" | 
 |  | 
 | 	cliflag "k8s.io/component-base/cli/flag" | 
 | 	"k8s.io/component-base/logs" | 
 | 	_ "k8s.io/component-base/metrics/prometheus/restclient" // for client metric registration | 
 | 	_ "k8s.io/component-base/metrics/prometheus/version"    // for version metric registration | 
 | 	kubeapiserver "k8s.io/kubernetes/cmd/kube-apiserver/app" | 
 | 	kubecontrollermanager "k8s.io/kubernetes/cmd/kube-controller-manager/app" | 
 | 	kubescheduler "k8s.io/kubernetes/cmd/kube-scheduler/app" | 
 | 	kubelet "k8s.io/kubernetes/cmd/kubelet/app" | 
 | ) | 
 |  | 
 | func main() { | 
 | 	rand.Seed(time.Now().UnixNano()) | 
 |  | 
 | 	hyperkubeCommand, allCommandFns := NewHyperKubeCommand() | 
 |  | 
 | 	// TODO: once we switch everything over to Cobra commands, we can go back to calling | 
 | 	// cliflag.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(cliflag.WordSepNormalizeFunc) | 
 | 	pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) | 
 | 	// cliflag.InitFlags() | 
 | 	logs.InitLogs() | 
 | 	defer logs.FlushLogs() | 
 |  | 
 | 	basename := filepath.Base(os.Args[0]) | 
 | 	if err := commandFor(basename, hyperkubeCommand, allCommandFns).Execute(); err != nil { | 
 | 		os.Exit(1) | 
 | 	} | 
 | } | 
 |  | 
 | 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 | 
 | } | 
 |  | 
 | // NewHyperKubeCommand is the entry point for hyperkube | 
 | 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 { return kubeapiserver.NewAPIServerCommand() } | 
 | 	controller := func() *cobra.Command { return kubecontrollermanager.NewControllerManagerCommand() } | 
 | 	scheduler := func() *cobra.Command { return kubescheduler.NewSchedulerCommand() } | 
 | 	kubelet := func() *cobra.Command { return kubelet.NewKubeletCommand() } | 
 |  | 
 | 	commandFns := []func() *cobra.Command{ | 
 | 		apiserver, | 
 | 		controller, | 
 | 		scheduler, | 
 | 		kubelet, | 
 | 	} | 
 |  | 
 | 	cmd := &cobra.Command{ | 
 | 		Use:   "kube", | 
 | 		Short: "Combines all Kubernetes components in a single binary", | 
 | 		Run: func(cmd *cobra.Command, args []string) { | 
 | 			if len(args) != 0 { | 
 | 				cmd.Help() | 
 | 				os.Exit(1) | 
 | 			} | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	for i := range commandFns { | 
 | 		cmd.AddCommand(commandFns[i]()) | 
 | 	} | 
 |  | 
 | 	return cmd, commandFns | 
 | } |