}
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,
IfName: rt.IfName,
Path: strings.Join(c.Path, ":"),
}
- return invoke.ExecPlugin(pluginPath, conf.Bytes, args)
}
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))
}
return nil, pluginErr(err, stdout.Bytes())
}
- res := &types.Result{}
- err := json.Unmarshal(stdout.Bytes(), res)
- return res, err
+ return stdout.Bytes(), nil
}
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