package main import ( "flag" "os" "syscall" "github.com/fsnotify/fsnotify" log "github.com/sirupsen/logrus" pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" ) func main() { // Parse command-line arguments flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) flagLogLevel := flag.String("log-level", "info", "Define the logging level: error, info, debug.") flag.Parse() switch *flagLogLevel { case "debug": log.SetLevel(log.DebugLevel) case "info": log.SetLevel(log.InfoLevel) } log.Println("Starting FS watcher.") watcher, err := newFSWatcher(pluginapi.DevicePluginPath) if err != nil { log.Printf("Failed to created FS watcher: %s.", err) os.Exit(1) } defer watcher.Close() log.Println("Starting OS watcher.") sigs := newOSWatcher(syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) restart := true var devicePlugin *FPGADevicePlugin L: for { if restart { devicePlugin = NewFPGADevicePlugin() restart = false } select { case update := <-devicePlugin.updateChan: devicePlugin.checkDeviceUpdate(update) case event := <-watcher.Events: if event.Name == pluginapi.KubeletSocket && event.Op&fsnotify.Create == fsnotify.Create { log.Printf("inotify: %s created, restarting.", pluginapi.KubeletSocket) restart = true } case err := <-watcher.Errors: log.Printf("inotify: %s", err) case s := <-sigs: switch s { case syscall.SIGHUP: log.Println("Received SIGHUP, restarting.") restart = true default: log.Printf("Received signal \"%v\", shutting down.", s) break L } } } }