diff --git a/libcni/api.go b/libcni/api.go index feaed8d6..4ad714a0 100644 --- a/libcni/api.go +++ b/libcni/api.go @@ -43,20 +43,18 @@ type CNIConfig struct { } func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (*types.Result, error) { - return c.execPlugin("ADD", net, rt) + pluginPath := invoke.FindInPath(net.Network.Type, c.Path) + return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt)) } func (c *CNIConfig) DelNetwork(net *NetworkConfig, rt *RuntimeConf) error { - _, err := c.execPlugin("DEL", net, rt) - return err + pluginPath := invoke.FindInPath(net.Network.Type, c.Path) + return invoke.ExecPluginWithoutResult(pluginPath, net.Bytes, c.args("DEL", rt)) } // ===== - -func (c *CNIConfig) execPlugin(action string, conf *NetworkConfig, rt *RuntimeConf) (*types.Result, error) { - pluginPath := invoke.FindInPath(conf.Network.Type, c.Path) - - args := &invoke.Args{ +func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args { + return &invoke.Args{ Command: action, ContainerID: rt.ContainerID, NetNS: rt.NetNS, @@ -64,5 +62,4 @@ func (c *CNIConfig) execPlugin(action string, conf *NetworkConfig, rt *RuntimeCo IfName: rt.IfName, Path: strings.Join(c.Path, ":"), } - return invoke.ExecPlugin(pluginPath, conf.Bytes, args) } diff --git a/pkg/invoke/exec.go b/pkg/invoke/exec.go index d7c5b7ab..cf0cff47 100644 --- a/pkg/invoke/exec.go +++ b/pkg/invoke/exec.go @@ -41,7 +41,23 @@ func pluginErr(err error, output []byte) error { return err } -func ExecPlugin(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, error) { +func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, error) { + stdoutBytes, err := execPlugin(pluginPath, netconf, args) + if err != nil { + return nil, err + } + + res := &types.Result{} + err = json.Unmarshal(stdoutBytes, res) + return res, err +} + +func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error { + _, err := execPlugin(pluginPath, netconf, args) + return err +} + +func execPlugin(pluginPath string, netconf []byte, args CNIArgs) ([]byte, error) { if pluginPath == "" { return nil, fmt.Errorf("could not find %q plugin", filepath.Base(pluginPath)) } @@ -60,7 +76,5 @@ func ExecPlugin(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, return nil, pluginErr(err, stdout.Bytes()) } - res := &types.Result{} - err := json.Unmarshal(stdout.Bytes(), res) - return res, err + return stdout.Bytes(), nil } diff --git a/pkg/ipam/ipam.go b/pkg/ipam/ipam.go index a76299d7..6a593a26 100644 --- a/pkg/ipam/ipam.go +++ b/pkg/ipam/ipam.go @@ -29,15 +29,14 @@ func ExecAdd(plugin string, netconf []byte) (*types.Result, error) { if os.Getenv("CNI_COMMAND") != "ADD" { return nil, fmt.Errorf("CNI_COMMAND is not ADD") } - return invoke.ExecPlugin(invoke.Find(plugin), netconf, invoke.ArgsFromEnv()) + return invoke.ExecPluginWithResult(invoke.Find(plugin), netconf, invoke.ArgsFromEnv()) } func ExecDel(plugin string, netconf []byte) error { if os.Getenv("CNI_COMMAND") != "DEL" { return fmt.Errorf("CNI_COMMAND is not DEL") } - _, err := invoke.ExecPlugin(invoke.Find(plugin), netconf, invoke.ArgsFromEnv()) - return err + return invoke.ExecPluginWithoutResult(invoke.Find(plugin), netconf, invoke.ArgsFromEnv()) } // ConfigureIface takes the result of IPAM plugin and