This reflects the latest SPEC draft.
return nil
}
-// PrintResult writes out prettified Result to stdout
+// PrintResult writes out prettified Result JSON to stdout
func PrintResult(res *Result) error {
- data, err := json.MarshalIndent(res, "", " ")
+ return prettyPrint(res)
+}
+
+// PrintError writes out prettified Error JSON to stdout
+func PrintError(err *Error) error {
+ return prettyPrint(err)
+}
+
+func prettyPrint(obj interface{}) error {
+ data, err := json.MarshalIndent(obj, "", " ")
if err != nil {
return err
}
GW net.IP
}
+type Error struct {
+ Code uint `json:"code"`
+ Msg string `json:"msg"`
+ Details string `json:"details,omitempty"`
+}
+
// net.IPNet is not JSON (un)marshallable so this duality is needed
// for our custom ip.IPNet type
package skel
import (
+ "fmt"
"io/ioutil"
"log"
"os"
+
+ "github.com/appc/cni/pkg/plugin"
)
// CmdArgs captures all the arguments passed in to the plugin
}
if argsMissing {
- os.Exit(1)
+ die("required env variables missing")
}
stdinData, err := ioutil.ReadAll(os.Stdin)
if err != nil {
- log.Printf("Error reading from stdin: %v", err)
- os.Exit(1)
+ die("error reading from stdin: %v", err)
}
cmdArgs := &CmdArgs{
err = cmdDel(cmdArgs)
default:
- log.Printf("Unknown CNI_COMMAND: %v", cmd)
- os.Exit(1)
+ die("unknown CNI_COMMAND: %v", cmd)
}
if err != nil {
- log.Printf("%v: %v", cmd, err)
- os.Exit(1)
+ die(err.Error())
}
}
+
+func die(f string, args ...interface{}) {
+ plugin.PrintError(&plugin.Error{
+ Code: 100,
+ Msg: fmt.Sprintf(f, args...),
+ })
+ os.Exit(1)
+}