type dispatcher struct {
Getenv func(string) string
Stdin io.Reader
+ Stderr io.Writer
}
type reqForCmdEntry map[string]bool
for _, v := range vars {
*v.val = t.Getenv(v.name)
if v.reqForCmd[cmd] && *v.val == "" {
- log.Printf("%v env variable missing", v.name)
- // TODO: test this logging ^^^ and log to stderr instead of stdout
+ fmt.Fprintf(t.Stderr, "%v env variable missing\n", v.name)
argsMissing = true
}
}
caller := dispatcher{
Getenv: os.Getenv,
Stdin: os.Stdin,
+ Stderr: os.Stderr,
}
err := caller.pluginMain(cmdAdd, cmdDel)
package skel
import (
+ "bytes"
"errors"
"io"
"strings"
var (
environment map[string]string
stdin io.Reader
+ stderr *bytes.Buffer
cmdAdd, cmdDel *fakeCmd
dispatch *dispatcher
expectedCmdArgs *CmdArgs
"CNI_PATH": "/some/cni/path",
}
stdin = strings.NewReader(`{ "some": "config" }`)
+ stderr = &bytes.Buffer{}
dispatch = &dispatcher{
Getenv: func(key string) string { return environment[key] },
Stdin: stdin,
+ Stderr: stderr,
}
cmdAdd = &fakeCmd{}
cmdDel = &fakeCmd{}
Code: 100,
Msg: "required env variables missing",
}))
+ Expect(stderr.String()).To(ContainSubstring(envVar + " env variable missing\n"))
} else {
Expect(err).NotTo(HaveOccurred())
}
Entry("args", "CNI_ARGS", false),
Entry("path", "CNI_PATH", true),
)
+
+ Context("when multiple required env vars are missing", func() {
+ BeforeEach(func() {
+ delete(environment, "CNI_NETNS")
+ delete(environment, "CNI_IFNAME")
+ delete(environment, "CNI_PATH")
+ })
+
+ It("reports that all of them are missing, not just the first", func() {
+ Expect(dispatch.pluginMain(cmdAdd.Func, cmdDel.Func)).NotTo(Succeed())
+ log := stderr.String()
+ Expect(log).To(ContainSubstring("CNI_NETNS env variable missing\n"))
+ Expect(log).To(ContainSubstring("CNI_IFNAME env variable missing\n"))
+ Expect(log).To(ContainSubstring("CNI_PATH env variable missing\n"))
+
+ })
+ })
})
Context("when the CNI_COMMAND is DEL", func() {