in plugins/internal/plugin/common_main.go [19:83]
func CommonMain(pluginName string, resourceName string, filter discovery.DeviceFilter) {
// Create a logger that prints debug and higher verbosity level messages
logger, err := zap.NewDevelopment()
if err != nil {
log.Fatalln("Error: failed to create the logger:", err)
}
// Sugar the logger
sugar := logger.Sugar()
defer sugar.Sync()
// Log the plugin name and version
sugar.Infof("Kubernetes device plugin for %s, version %s", strings.ToUpper(pluginName), version)
// Load the plugin configuration data
config, err := LoadConfig(pluginName, sugar)
if err != nil {
sugar.Errorf("Error: failed to load the device plugin configuration: %v", err)
return
}
// Create the device plugin and start the device watcher
server, err := NewDevicePlugin(pluginName, version, resourceName, filter, config, sugar)
if err != nil {
sugar.Errorf("Error: failed to create the device plugin: %v", err)
return
}
//Ensure the plugin is destroyed and the device watcher stopped when we complete execution
defer server.Destroy()
// Attempt to start the plugin's gRPC server
if err := server.StartServer(); err != nil {
sugar.Errorf("Error: failed to start the gRPC server: %v", err)
return
}
// Ensure we perform a graceful shutdown of the gRPC server before we destroy the plugin
defer server.StopServer()
// Attempt to register the device plugin with the Kubelet
if err := server.RegisterWithKubelet(); err != nil {
sugar.Errorf("Error: failed to register the device plugin with the Kubelet: %v", err)
return
}
// Wire up a signal handler to receive shutdown requests
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
// Serve requests until we receive a shutdown request or an error occurs
sugar.Info("Serving until a shutdown request is received")
for {
select {
case sig := <-signals:
sugar.Infow("Received signal", "signal", sig)
return
case err := <-server.Errors:
sugar.Errorf("Error: %v", err)
return
}
}
}