host-local: allow ip request via CNI_ARGS
authorStefan Junker <mail@stefanjunker.de>
Sun, 16 Aug 2015 00:30:04 +0000 (02:30 +0200)
committerStefan Junker <mail@stefanjunker.de>
Thu, 3 Sep 2015 23:38:22 +0000 (01:38 +0200)
A specific IP can now be requested via the environment variable CNI_ARGS, e.g.
`CNI_ARGS=ip=1.2.3.4`.
The plugin will try to reserve the specified IP.
If this is not successful the execution will fail.

plugin/args.go [new file with mode: 0644]

diff --git a/plugin/args.go b/plugin/args.go
new file mode 100644 (file)
index 0000000..8489579
--- /dev/null
@@ -0,0 +1,36 @@
+package plugin
+
+import (
+       "encoding"
+       "fmt"
+       "reflect"
+       "strings"
+)
+
+func LoadArgs(args string, container interface{}) error {
+       if args == "" {
+               return nil
+       }
+
+       containerValue := reflect.ValueOf(container)
+
+       pairs := strings.Split(args, ",")
+       for _, pair := range pairs {
+               kv := strings.Split(pair, "=")
+               if len(kv) != 2 {
+                       return fmt.Errorf("ARGS: invalid pair %q", pair)
+               }
+               keyString := kv[0]
+               valueString := kv[1]
+               keyField := containerValue.Elem().FieldByName(keyString)
+               if !keyField.IsValid() {
+                       return fmt.Errorf("ARGS: invalid key %q", keyString)
+               }
+               u := keyField.Addr().Interface().(encoding.TextUnmarshaler)
+               err := u.UnmarshalText([]byte(valueString))
+               if err != nil {
+                       return fmt.Errorf("ARGS: error parsing value of pair %q: %v)", pair, err)
+               }
+       }
+       return nil
+}