From af5c2f303a5d4f8877a6af841509e32db0ecadb6 Mon Sep 17 00:00:00 2001 From: Gabe Rosenhouse Date: Sun, 22 Jan 2017 16:39:15 -0800 Subject: [PATCH] skel: adds PluginMainWithError which returns a *types.Error Enables plugins to do their own error-handling and cleanup logic --- pkg/skel/skel.go | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/pkg/skel/skel.go b/pkg/skel/skel.go index 8fc9636e..8644c25e 100644 --- a/pkg/skel/skel.go +++ b/pkg/skel/skel.go @@ -189,25 +189,40 @@ func (t *dispatcher) pluginMain(cmdAdd, cmdDel func(_ *CmdArgs) error, versionIn return nil } -// PluginMain is the "main" for a plugin. It accepts -// two callback functions for add and del commands. -func PluginMain(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo) { - caller := dispatcher{ +// PluginMainWithError is the core "main" for a plugin. It accepts +// callback functions for add and del CNI commands and returns an error. +// +// The caller must also specify what CNI spec versions the plugin supports. +// +// It is the responsibility of the caller to check for non-nil error return. +// +// For a plugin to comply with the CNI spec, it must print any error to stdout +// as JSON and then exit with nonzero status code. +// +// To let this package automatically handle errors and call os.Exit(1) for you, +// use PluginMain() instead. +func PluginMainWithError(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo) *types.Error { + return (&dispatcher{ Getenv: os.Getenv, Stdin: os.Stdin, Stdout: os.Stdout, Stderr: os.Stderr, - } - - err := caller.pluginMain(cmdAdd, cmdDel, versionInfo) - if err != nil { - dieErr(err) - } + }).pluginMain(cmdAdd, cmdDel, versionInfo) } -func dieErr(e *types.Error) { - if err := e.Print(); err != nil { - log.Print("Error writing error JSON to stdout: ", err) +// PluginMain is the core "main" for a plugin which includes automatic error handling. +// +// The caller must also specify what CNI spec versions the plugin supports. +// +// When an error occurs in either cmdAdd or cmdDel, PluginMain will print the error +// as JSON to stdout and call os.Exit(1). +// +// To have more control over error handling, use PluginMainWithError() instead. +func PluginMain(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo) { + if e := PluginMainWithError(cmdAdd, cmdDel, versionInfo); e != nil { + if err := e.Print(); err != nil { + log.Print("Error writing error JSON to stdout: ", err) + } + os.Exit(1) } - os.Exit(1) }