// versionInfo displays the build and versioning information. func versionInfo(cmd *cli.Command, args []string) { if version { fmt.Println(common.BuildInfo()) os.Exit(0) } cmd.Help() }
func main() { // Accept a kubernetes config file of try the default location. var kubeConfig = flag.String("kubeconfig", os.Getenv("HOME")+"/.kube/config", "Kubernetes config file.") var romanaConfig = flag.String("romanaconfig", os.Getenv("HOME")+"/.romana.yaml", "Romana config file.") version := flag.Bool("version", false, "Build Information.") flag.Parse() if *version { fmt.Println(common.BuildInfo()) return } if *kubeConfig == "" { log.Println("Error: must have kubernetes config files specified.") os.Exit(1) } if err := initConfig(*romanaConfig); err != nil { log.Println("Error reading romana config file: ", err) os.Exit(1) } // Since romana config was successful above, now set rootURL from config. setRomanaRootURL() // Try generating config for kubernetes client-go from flags passed, // so that we can connect to kubernetes using them. kConfig, err := clientcmd.BuildConfigFromFlags("", *kubeConfig) if err != nil { log.Println("Error: ", err.Error()) os.Exit(1) } // Get a set of REST clients which connect to kubernetes services // from the config generated above. restClientSet, err := kubernetes.NewForConfig(kConfig) if err != nil { log.Println("Error: ", err.Error()) os.Exit(1) } // Channel for stopping watching node events. stop := make(chan struct{}, 1) // nodeWatcher is a new ListWatch object created from the specified // restClientSet above for watching node events. nodeWatcher := cache.NewListWatchFromClient( restClientSet.CoreClient, "nodes", api.NamespaceAll, fields.Everything()) // Setup a notifications for specific events using NewInformer. _, nodeInformer := cache.NewInformer( nodeWatcher, &v1.Node{}, time.Minute, cache.ResourceEventHandlerFuncs{ AddFunc: kubernetesAddNodeEventHandler, UpdateFunc: kubernetesUpdateNodeEventHandler, DeleteFunc: kubernetesDeleteNodeEventHandler, }, ) log.Println("Starting receving node events.") go nodeInformer.Run(stop) // Set up channel on which to send signal notifications. // We must use a buffered channel or risk missing the signal // if we're not ready to receive when the signal is sent. c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) // Block until a signal is received. <-c // Stop watching node events. close(stop) log.Println("Stopped watching node events and quitting watchnodes.") }