in cmd/vsphere-cloud-controller-manager/main.go [56:216]
func main() {
loadbalancer.Version = version
loadbalancer.AppName = AppName
rand.Seed(time.Now().UTC().UnixNano())
ccmOptions, err := options.NewCloudControllerManagerOptions()
if err != nil {
klog.Fatalf("unable to initialize command options: %v", err)
}
var controllerInitializers map[string]app.InitFunc
command := &cobra.Command{
Use: "vsphere-cloud-controller-manager",
Long: `vsphere-cloud-controller-manager manages vSphere cloud resources for a Kubernetes cluster.`,
Run: func(cmd *cobra.Command, args []string) {
verflag.PrintAndExitIfRequested()
cliflag.PrintFlags(cmd.Flags())
c, err := ccmOptions.Config(app.ControllerNames(app.DefaultInitFuncConstructors), app.ControllersDisabledByDefault.List())
if err != nil {
// explicitly ignore the error by Fprintf, exiting anyway
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
klog.Infof("vsphere-cloud-controller-manager version: %s", version)
// Default to the vsphere cloud provider if not set
cloudProviderFlag := cmd.Flags().Lookup("cloud-provider")
if cloudProviderFlag.Value.String() == "" {
if err := cloudProviderFlag.Value.Set(vsphere.RegisteredProviderName); err != nil {
klog.Fatalf("cannot set RegisteredProviderName to %s: %v", vsphere.RegisteredProviderName, err)
}
}
cloudProvider := cloudProviderFlag.Value.String()
if cloudProvider != vsphere.RegisteredProviderName && cloudProvider != vsphereparavirtual.RegisteredProviderName {
klog.Fatalf("unknown cloud provider %s, only 'vsphere' and 'vsphere-paravirtual' are supported", cloudProvider)
}
completedConfig := c.Complete()
cloud := initializeCloud(completedConfig, cloudProvider)
controllerInitializers = app.ConstructControllerInitializers(app.DefaultInitFuncConstructors, completedConfig, cloud)
// initialize a notifier for cloud config update
cloudConfig := completedConfig.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile
klog.Infof("initialize notifier on configmap update %s\n", cloudConfig)
watch, stop, err := initializeWatch(completedConfig, cloudConfig)
if err != nil {
klog.Fatalf("fail to initialize watch on config map %s: %v\n", cloudConfig, err)
}
defer func(watch *fsnotify.Watcher) {
_ = watch.Close() // ignore explicitly when the watch closes
}(watch)
if err := app.Run(completedConfig, cloud, controllerInitializers, stop); err != nil {
// explicitly ignore the error by Fprintf, exiting anyway due to app error
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
},
Args: func(cmd *cobra.Command, args []string) error {
for _, arg := range args {
if len(arg) > 0 {
return fmt.Errorf("%q does not take any arguments, got %q", cmd.CommandPath(), args)
}
}
return nil
},
}
fs := command.Flags()
namedFlagSets := ccmOptions.Flags(app.ControllerNames(app.DefaultInitFuncConstructors), app.ControllersDisabledByDefault.List())
verflag.AddFlags(namedFlagSets.FlagSet("global"))
globalflag.AddGlobalFlags(namedFlagSets.FlagSet("global"), command.Name())
for _, f := range namedFlagSets.FlagSets {
fs.AddFlagSet(f)
}
usageFmt := "Usage:\n %s\n"
cols, _, _ := term.TerminalSize(command.OutOrStdout())
command.SetUsageFunc(func(cmd *cobra.Command) error {
if _, err := fmt.Fprintf(cmd.OutOrStderr(), usageFmt, cmd.UseLine()); err != nil {
return err
}
cliflag.PrintSections(cmd.OutOrStderr(), namedFlagSets, cols)
return nil
})
command.SetHelpFunc(func(cmd *cobra.Command, args []string) {
if _, err := fmt.Fprintf(cmd.OutOrStdout(), "%s\n\n"+usageFmt, cmd.Long, cmd.UseLine()); err != nil {
return
}
cliflag.PrintSections(cmd.OutOrStdout(), namedFlagSets, cols)
})
// 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(cliflag.WordSepNormalizeFunc)
pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
// utilflag.InitFlags()
logs.InitLogs()
defer logs.FlushLogs()
var clusterNameFlag *pflag.Value
var controllersFlag *pflag.Value
var cloudProviderFlag *pflag.Value
command.Flags().VisitAll(func(flag *pflag.Flag) {
switch flag.Name {
// Set cloud-provider flag to vsphere
case "cloud-provider":
cloudProviderFlag = &flag.Value
if err := flag.Value.Set(vsphere.RegisteredProviderName); err != nil {
klog.Fatalf("cannot set RegisteredProviderName to %s: %v", vsphere.RegisteredProviderName, err)
}
flag.DefValue = vsphere.RegisteredProviderName
case "cluster-name":
clusterNameFlag = &flag.Value
case "controllers":
controllersFlag = &flag.Value
}
})
var versionFlag *pflag.Value
pflag.CommandLine.VisitAll(func(flag *pflag.Flag) {
switch flag.Name {
case "version":
versionFlag = &flag.Value
}
})
command.Use = AppName
innerRun := command.Run
command.Run = func(cmd *cobra.Command, args []string) {
if versionFlag != nil && (*versionFlag).String() != "false" {
fmt.Printf("%s %s\n", AppName, version)
os.Exit(0)
}
if clusterNameFlag != nil {
loadbalancer.ClusterName = (*clusterNameFlag).String()
vsphereparavirtual.ClusterName = (*clusterNameFlag).String()
}
// if route controller is enabled in vsphereparavirtual cloud provider, set routeEnabled to true
if controllersFlag != nil &&
!strings.Contains((*controllersFlag).String(), "-route") &&
(strings.Contains((*controllersFlag).String(), "route") || strings.Contains((*controllersFlag).String(), "*")) &&
vsphereparavirtual.RegisteredProviderName == (*cloudProviderFlag).String() {
vsphereparavirtual.RouteEnabled = true
}
innerRun(cmd, args)
}
if err := command.Execute(); err != nil {
// ignore error by Fprintf, exit anyway due to cmd execute error
_, _ = fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}