bug fix: exec of DEL cmd caused JSON decode error

When plugin is executed with a DEL command, it does not
print result to stdout unless there is an error. Therefore
it stdout bytes should not be passed to json.Unmarshal.
This commit is contained in:
Eugene Yakubovich 2015-09-18 10:30:10 -07:00
parent 09a8148e36
commit ae3ceedd69
2 changed files with 20 additions and 7 deletions

View File

@ -41,7 +41,23 @@ func pluginErr(err error, output []byte) error {
return err 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 == "" { if pluginPath == "" {
return nil, fmt.Errorf("could not find %q plugin", filepath.Base(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()) return nil, pluginErr(err, stdout.Bytes())
} }
res := &types.Result{} return stdout.Bytes(), nil
err := json.Unmarshal(stdout.Bytes(), res)
return res, err
} }

View File

@ -29,15 +29,14 @@ func ExecAdd(plugin string, netconf []byte) (*types.Result, error) {
if os.Getenv("CNI_COMMAND") != "ADD" { if os.Getenv("CNI_COMMAND") != "ADD" {
return nil, fmt.Errorf("CNI_COMMAND is not 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 { func ExecDel(plugin string, netconf []byte) error {
if os.Getenv("CNI_COMMAND") != "DEL" { if os.Getenv("CNI_COMMAND") != "DEL" {
return fmt.Errorf("CNI_COMMAND is not DEL") return fmt.Errorf("CNI_COMMAND is not DEL")
} }
_, err := invoke.ExecPlugin(invoke.Find(plugin), netconf, invoke.ArgsFromEnv()) return invoke.ExecPluginWithoutResult(invoke.Find(plugin), netconf, invoke.ArgsFromEnv())
return err
} }
// ConfigureIface takes the result of IPAM plugin and // ConfigureIface takes the result of IPAM plugin and