From f467134838ab8542ea682cad6ee54e3f35f9636b Mon Sep 17 00:00:00 2001 From: Gabe Rosenhouse Date: Fri, 2 Sep 2016 16:01:22 -0400 Subject: [PATCH] invoke: correctly infer version for 0.1.0-vintage plugins Older plugins return a known error when issued the VERSION command. Capture this error and report it as a 0.1.0 version plugin. --- invoke/exec.go | 12 +++++- invoke/exec_integration_test.go | 72 +++++++++++++++++++++++++++++++++ invoke/exec_test.go | 2 +- 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 invoke/exec_integration_test.go diff --git a/invoke/exec.go b/invoke/exec.go index f95dec11..fe792b62 100644 --- a/invoke/exec.go +++ b/invoke/exec.go @@ -65,9 +65,19 @@ func (e *PluginExec) WithoutResult(pluginPath string, netconf []byte, args CNIAr } func (e *PluginExec) GetVersion(pluginPath string) (version.PluginInfo, error) { - args := &Args{Command: "VERSION"} + args := &Args{ + Command: "VERSION", + + // set fake values required by plugins built against an older version of skel + NetNS: "/tmp/not/a/container", + IfName: "not-an-interface", + Path: "/tmp/not/a/path", + } stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, nil, args.AsEnv()) if err != nil { + if err.Error() == "unknown CNI_COMMAND: VERSION" { + return version.PluginSupports("0.1.0"), nil + } return nil, err } diff --git a/invoke/exec_integration_test.go b/invoke/exec_integration_test.go new file mode 100644 index 00000000..c16090ad --- /dev/null +++ b/invoke/exec_integration_test.go @@ -0,0 +1,72 @@ +// Copyright 2016 CNI authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package invoke_test + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/containernetworking/cni/pkg/invoke" + "github.com/containernetworking/cni/pkg/version" + "github.com/containernetworking/cni/pkg/version/testhelpers" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/ginkgo/extensions/table" + . "github.com/onsi/gomega" +) + +var _ = Describe("GetVersion, integration tests", func() { + var ( + pluginDir string + pluginPath string + ) + + BeforeEach(func() { + pluginDir, err := ioutil.TempDir("", "plugins") + Expect(err).NotTo(HaveOccurred()) + pluginPath = filepath.Join(pluginDir, "test-plugin") + }) + + AfterEach(func() { + Expect(os.RemoveAll(pluginDir)).To(Succeed()) + }) + + DescribeTable("correctly reporting plugin versions", + func(gitRef string, pluginSource string, expectedVersions version.PluginInfo) { + Expect(testhelpers.BuildAt([]byte(pluginSource), gitRef, pluginPath)).To(Succeed()) + versionInfo, err := invoke.ExecPluginForVersion(pluginPath) + Expect(err).NotTo(HaveOccurred()) + + Expect(versionInfo.SupportedVersions()).To(ConsistOf(expectedVersions.SupportedVersions())) + }, + Entry("old plugin, before VERSION was introduced", git_ref_v010, plugin_source_v010, version.PluginSupports("0.1.0")), + Entry("when VERSION was introduced", git_ref_v020, plugin_source_v010, version.PluginSupports("0.1.0", "0.2.0")), + ) +}) + +// a minimal 0.1.0 / 0.2.0 plugin +const plugin_source_v010 = `package main + +import "github.com/containernetworking/cni/pkg/skel" +import "fmt" + +func c(_ *skel.CmdArgs) error { fmt.Println("{}"); return nil } + +func main() { skel.PluginMain(c, c) } +` + +const git_ref_v010 = "2c482f4" +const git_ref_v020 = "349d66d" diff --git a/invoke/exec_test.go b/invoke/exec_test.go index bff3fb73..7b591f17 100644 --- a/invoke/exec_test.go +++ b/invoke/exec_test.go @@ -25,7 +25,7 @@ import ( . "github.com/onsi/gomega" ) -var _ = Describe("Executing a plugin", func() { +var _ = Describe("Executing a plugin, unit tests", func() { var ( pluginExec *invoke.PluginExec rawExec *fakes.RawExec