skel: Plugins require a cniVersion in the NetConf

This commit is contained in:
Gabe Rosenhouse
2016-09-06 20:19:26 -04:00
committed by Gabe Rosenhouse
parent 56032390fe
commit fd150a4c97
14 changed files with 76 additions and 26 deletions

View File

@ -17,6 +17,7 @@
package skel
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
@ -143,12 +144,28 @@ func createTypedError(f string, args ...interface{}) *types.Error {
}
}
func (t *dispatcher) validateVersion(stdinData []byte) error {
var netconf types.NetConf
if err := json.Unmarshal(stdinData, &netconf); err != nil {
return err
}
if netconf.CNIVersion == "" {
return fmt.Errorf("missing required config cniVersion")
}
return nil
}
func (t *dispatcher) pluginMain(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo) *types.Error {
cmd, cmdArgs, err := t.getCmdArgsFromEnv()
if err != nil {
return createTypedError(err.Error())
}
if err = t.validateVersion(cmdArgs.StdinData); err != nil {
return createTypedError(err.Error())
}
switch cmd {
case "ADD":
err = cmdAdd(cmdArgs)

View File

@ -17,7 +17,6 @@ package skel
import (
"bytes"
"errors"
"io"
"strings"
"github.com/containernetworking/cni/pkg/types"
@ -48,7 +47,7 @@ func (c *fakeCmd) Func(args *CmdArgs) error {
var _ = Describe("dispatching to the correct callback", func() {
var (
environment map[string]string
stdin io.Reader
stdinData string
stdout, stderr *bytes.Buffer
cmdAdd, cmdDel *fakeCmd
dispatch *dispatcher
@ -65,13 +64,14 @@ var _ = Describe("dispatching to the correct callback", func() {
"CNI_ARGS": "some;extra;args",
"CNI_PATH": "/some/cni/path",
}
stdin = strings.NewReader(`{ "some": "config" }`)
stdinData = `{ "some": "config", "cniVersion": "9.8.7" }`
stdout = &bytes.Buffer{}
stderr = &bytes.Buffer{}
versionInfo = version.PluginSupports("9.8.7")
dispatch = &dispatcher{
Getenv: func(key string) string { return environment[key] },
Stdin: stdin,
Stdin: strings.NewReader(stdinData),
Stdout: stdout,
Stderr: stderr,
}
@ -83,7 +83,7 @@ var _ = Describe("dispatching to the correct callback", func() {
IfName: "eth0",
Args: "some;extra;args",
Path: "/some/cni/path",
StdinData: []byte(`{ "some": "config" }`),
StdinData: []byte(stdinData),
}
})
@ -144,6 +144,22 @@ var _ = Describe("dispatching to the correct callback", func() {
})
})
Context("when the stdin data is missing the required cniVersion config", func() {
BeforeEach(func() {
dispatch.Stdin = strings.NewReader(`{ "some": "config" }`)
})
It("immediately returns a useful error", func() {
err := dispatch.pluginMain(cmdAdd.Func, cmdDel.Func, versionInfo)
Expect(err).To(MatchError("missing required config cniVersion"))
})
It("does not call either callback", func() {
Expect(cmdAdd.CallCount).To(Equal(0))
Expect(cmdDel.CallCount).To(Equal(0))
})
})
})
Context("when the CNI_COMMAND is DEL", func() {