cnitool: add support for CNI_ARGS
authorPengfei Ni <feiskyer@gmail.com>
Mon, 10 Jul 2017 10:02:50 +0000 (18:02 +0800)
committerPengfei Ni <feiskyer@gmail.com>
Tue, 11 Jul 2017 23:06:23 +0000 (07:06 +0800)
Signed-off-by: Pengfei Ni <feiskyer@gmail.com>
cnitool/cni.go

index 92f9101..7252b8c 100644 (file)
@@ -19,6 +19,7 @@ import (
        "fmt"
        "os"
        "path/filepath"
+       "strings"
 
        "github.com/containernetworking/cni/libcni"
 )
@@ -27,6 +28,7 @@ const (
        EnvCNIPath        = "CNI_PATH"
        EnvNetDir         = "NETCONFPATH"
        EnvCapabilityArgs = "CAP_ARGS"
+       EnvCNIArgs        = "CNI_ARGS"
 
        DefaultNetDir = "/etc/cni/net.d"
 
@@ -34,6 +36,22 @@ const (
        CmdDel = "del"
 )
 
+func parseArgs(args string) ([][2]string, error) {
+       var result [][2]string
+
+       pairs := strings.Split(args, ";")
+       for _, pair := range pairs {
+               kv := strings.Split(pair, "=")
+               if len(kv) != 2 || kv[0] == "" || kv[1] == "" {
+                       return nil, fmt.Errorf("invalid CNI_ARGS pair %q", pair)
+               }
+
+               result = append(result, [2]string{kv[0], kv[1]})
+       }
+
+       return result, nil
+}
+
 func main() {
        if len(os.Args) < 3 {
                usage()
@@ -50,9 +68,18 @@ func main() {
        }
 
        var capabilityArgs map[string]interface{}
-       args := os.Getenv(EnvCapabilityArgs)
+       capabilityArgsValue := os.Getenv(EnvCapabilityArgs)
+       if len(capabilityArgsValue) > 0 {
+               if err = json.Unmarshal([]byte(capabilityArgsValue), &capabilityArgs); err != nil {
+                       exit(err)
+               }
+       }
+
+       var cniArgs [][2]string
+       args := os.Getenv(EnvCNIArgs)
        if len(args) > 0 {
-               if err = json.Unmarshal([]byte(args), &capabilityArgs); err != nil {
+               cniArgs, err = parseArgs(args)
+               if err != nil {
                        exit(err)
                }
        }
@@ -67,6 +94,7 @@ func main() {
                ContainerID:    "cni",
                NetNS:          netns,
                IfName:         "eth0",
+               Args:           cniArgs,
                CapabilityArgs: capabilityArgs,
        }