From 99fa75842358ec1cc1f428edecb704349ac8478d Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Thu, 9 Aug 2018 15:05:00 -0700 Subject: [PATCH 1/3] network: Remove unused CNI code We dont really call CNI from Kata, this is done by the CRI layer. All of the CNI code is unused. Fixes #567 Signed-off-by: Archana Shinde --- virtcontainers/api_test.go | 111 ------ virtcontainers/cni.go | 172 --------- virtcontainers/documentation/api/1.0/api.md | 3 - virtcontainers/network.go | 10 - virtcontainers/network_test.go | 13 - virtcontainers/pkg/cni/OWNERS | 6 - virtcontainers/pkg/cni/cni.go | 156 -------- virtcontainers/pkg/cni/cni_test.go | 397 -------------------- 8 files changed, 868 deletions(-) delete mode 100644 virtcontainers/cni.go delete mode 100644 virtcontainers/pkg/cni/OWNERS delete mode 100644 virtcontainers/pkg/cni/cni.go delete mode 100644 virtcontainers/pkg/cni/cni_test.go diff --git a/virtcontainers/api_test.go b/virtcontainers/api_test.go index 8cc929fd6a..5f896806fc 100644 --- a/virtcontainers/api_test.go +++ b/virtcontainers/api_test.go @@ -119,49 +119,6 @@ func newTestSandboxConfigHyperstartAgent() SandboxConfig { return sandboxConfig } -func newTestSandboxConfigHyperstartAgentCNINetwork() SandboxConfig { - // Define the container command and bundle. - container := ContainerConfig{ - ID: containerID, - RootFs: filepath.Join(testDir, testBundle), - Cmd: newBasicTestCmd(), - Annotations: containerAnnotations, - } - - // Sets the hypervisor configuration. - hypervisorConfig := HypervisorConfig{ - KernelPath: filepath.Join(testDir, testKernel), - ImagePath: filepath.Join(testDir, testImage), - HypervisorPath: filepath.Join(testDir, testHypervisor), - } - - agentConfig := HyperConfig{ - SockCtlName: testHyperstartCtlSocket, - SockTtyName: testHyperstartTtySocket, - } - - netConfig := NetworkConfig{ - NumInterfaces: 1, - } - - sandboxConfig := SandboxConfig{ - ID: testSandboxID, - HypervisorType: MockHypervisor, - HypervisorConfig: hypervisorConfig, - - AgentType: HyperstartAgent, - AgentConfig: agentConfig, - - NetworkModel: CNINetworkModel, - NetworkConfig: netConfig, - - Containers: []ContainerConfig{container}, - Annotations: sandboxAnnotations, - } - - return sandboxConfig -} - func newTestSandboxConfigHyperstartAgentCNMNetwork() SandboxConfig { // Define the container command and bundle. container := ContainerConfig{ @@ -1396,46 +1353,6 @@ func TestStartStopContainerHyperstartAgentSuccessful(t *testing.T) { bindUnmountAllRootfs(defaultSharedDir, pImpl) } -func TestStartStopSandboxHyperstartAgentSuccessfulWithCNINetwork(t *testing.T) { - if os.Geteuid() != 0 { - t.Skip(testDisabledAsNonRoot) - } - - cleanUp() - - config := newTestSandboxConfigHyperstartAgentCNINetwork() - - sockDir, err := testGenerateCCProxySockDir() - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(sockDir) - - testCCProxySockPath := fmt.Sprintf(testCCProxySockPathTempl, sockDir) - noopProxyURL = testCCProxyURLUnixScheme + testCCProxySockPath - proxy := mock.NewCCProxyMock(t, testCCProxySockPath) - proxy.Start() - defer proxy.Stop() - - hyperConfig := config.AgentConfig.(HyperConfig) - config.AgentConfig = hyperConfig - - p, _, err := createAndStartSandbox(config) - if p == nil || err != nil { - t.Fatal(err) - } - - p, err = StopSandbox(p.ID()) - if p == nil || err != nil { - t.Fatal(err) - } - - p, err = DeleteSandbox(p.ID()) - if p == nil || err != nil { - t.Fatal(err) - } -} - func TestStartStopSandboxHyperstartAgentSuccessfulWithCNMNetwork(t *testing.T) { if os.Geteuid() != 0 { t.Skip(testDisabledAsNonRoot) @@ -2216,34 +2133,6 @@ func createStartStopDeleteContainers(b *testing.B, sandboxConfig SandboxConfig, } } -func BenchmarkCreateStartStopDeleteSandboxQemuHypervisorHyperstartAgentNetworkCNI(b *testing.B) { - for i := 0; i < b.N; i++ { - sandboxConfig := createNewSandboxConfig(QemuHypervisor, HyperstartAgent, HyperConfig{}, CNINetworkModel) - - sockDir, err := testGenerateCCProxySockDir() - if err != nil { - b.Fatal(err) - } - defer os.RemoveAll(sockDir) - - var t testing.T - testCCProxySockPath := fmt.Sprintf(testCCProxySockPathTempl, sockDir) - noopProxyURL = testCCProxyURLUnixScheme + testCCProxySockPath - proxy := mock.NewCCProxyMock(&t, testCCProxySockPath) - proxy.Start() - defer proxy.Stop() - - createStartStopDeleteSandbox(b, sandboxConfig) - } -} - -func BenchmarkCreateStartStopDeleteSandboxQemuHypervisorNoopAgentNetworkCNI(b *testing.B) { - for i := 0; i < b.N; i++ { - sandboxConfig := createNewSandboxConfig(QemuHypervisor, NoopAgentType, nil, CNINetworkModel) - createStartStopDeleteSandbox(b, sandboxConfig) - } -} - func BenchmarkCreateStartStopDeleteSandboxQemuHypervisorHyperstartAgentNetworkNoop(b *testing.B) { for i := 0; i < b.N; i++ { sandboxConfig := createNewSandboxConfig(QemuHypervisor, HyperstartAgent, HyperConfig{}, NoopNetworkModel) diff --git a/virtcontainers/cni.go b/virtcontainers/cni.go deleted file mode 100644 index 41e0e71e34..0000000000 --- a/virtcontainers/cni.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2016 Intel Corporation -// -// SPDX-License-Identifier: Apache-2.0 -// - -package virtcontainers - -import ( - "fmt" - - cniTypes "github.com/containernetworking/cni/pkg/types" - cniV2Types "github.com/containernetworking/cni/pkg/types/020" - cniLatestTypes "github.com/containernetworking/cni/pkg/types/current" - cniPlugin "github.com/kata-containers/runtime/virtcontainers/pkg/cni" - "github.com/sirupsen/logrus" -) - -// CniPrimaryInterface Name chosen for the primary interface -// If CNI ever support multiple primary interfaces this should be revisited -const CniPrimaryInterface = "eth0" - -// cni is a network implementation for the CNI plugin. -type cni struct{} - -// Logger returns a logrus logger appropriate for logging cni messages -func (n *cni) Logger() *logrus.Entry { - return virtLog.WithField("subsystem", "cni") -} - -func cniDNSToDNSInfo(cniDNS cniTypes.DNS) DNSInfo { - return DNSInfo{ - Servers: cniDNS.Nameservers, - Domain: cniDNS.Domain, - Searches: cniDNS.Search, - Options: cniDNS.Options, - } -} - -func convertLatestCNIResult(result *cniLatestTypes.Result) NetworkInfo { - return NetworkInfo{ - DNS: cniDNSToDNSInfo(result.DNS), - } -} - -func convertV2CNIResult(result *cniV2Types.Result) NetworkInfo { - return NetworkInfo{ - DNS: cniDNSToDNSInfo(result.DNS), - } -} - -func convertCNIResult(cniResult cniTypes.Result) (NetworkInfo, error) { - switch result := cniResult.(type) { - case *cniLatestTypes.Result: - return convertLatestCNIResult(result), nil - case *cniV2Types.Result: - return convertV2CNIResult(result), nil - default: - return NetworkInfo{}, fmt.Errorf("Unknown CNI result type %T", result) - } -} - -func (n *cni) invokePluginsAdd(sandbox *Sandbox, networkNS *NetworkNamespace) (*NetworkInfo, error) { - netPlugin, err := cniPlugin.NewNetworkPlugin() - if err != nil { - return nil, err - } - - // Note: In the case of multus or cni-genie this will return only the results - // corresponding to the primary interface. The remaining results need to be - // derived - result, err := netPlugin.AddNetwork(sandbox.id, networkNS.NetNsPath, CniPrimaryInterface) - if err != nil { - return nil, err - } - - netInfo, err := convertCNIResult(result) - if err != nil { - return nil, err - } - - // We do not care about this for now but - // If present, the CNI DNS result has to be updated in resolv.conf - // if the kubelet has not supplied it already - n.Logger().Infof("AddNetwork results %s", result.String()) - - return &netInfo, nil -} - -func (n *cni) invokePluginsDelete(sandbox *Sandbox, networkNS NetworkNamespace) error { - netPlugin, err := cniPlugin.NewNetworkPlugin() - if err != nil { - return err - } - - err = netPlugin.RemoveNetwork(sandbox.id, networkNS.NetNsPath, CniPrimaryInterface) - if err != nil { - return err - } - - return nil -} - -func (n *cni) updateEndpointsFromScan(networkNS *NetworkNamespace, netInfo *NetworkInfo, config NetworkConfig) error { - endpoints, err := createEndpointsFromScan(networkNS.NetNsPath, config) - if err != nil { - return err - } - - for _, endpoint := range endpoints { - if CniPrimaryInterface == endpoint.Name() { - prop := endpoint.Properties() - prop.DNS = netInfo.DNS - endpoint.SetProperties(prop) - break - } - } - - networkNS.Endpoints = endpoints - return nil -} - -// init initializes the network, setting a new network namespace for the CNI network. -func (n *cni) init(config NetworkConfig) (string, bool, error) { - return initNetworkCommon(config) -} - -// run runs a callback in the specified network namespace. -func (n *cni) run(networkNSPath string, cb func() error) error { - return runNetworkCommon(networkNSPath, cb) -} - -// add adds all needed interfaces inside the network namespace for the CNI network. -func (n *cni) add(sandbox *Sandbox, config NetworkConfig, netNsPath string, netNsCreated bool) (NetworkNamespace, error) { - - networkNS := NetworkNamespace{ - NetNsPath: netNsPath, - NetNsCreated: netNsCreated, - } - - netInfo, err := n.invokePluginsAdd(sandbox, &networkNS) - if err != nil { - return NetworkNamespace{}, err - } - - if err := n.updateEndpointsFromScan(&networkNS, netInfo, config); err != nil { - return NetworkNamespace{}, err - } - - if err := addNetworkCommon(sandbox, &networkNS); err != nil { - return NetworkNamespace{}, err - } - - return networkNS, nil -} - -// remove network endpoints in the network namespace. It also deletes the network -// namespace in case the namespace has been created by us. -func (n *cni) remove(sandbox *Sandbox, networkNS NetworkNamespace, netNsCreated bool) error { - if err := removeNetworkCommon(networkNS, netNsCreated); err != nil { - return err - } - - if err := n.invokePluginsDelete(sandbox, networkNS); err != nil { - return err - } - - if netNsCreated { - return deleteNetNS(networkNS.NetNsPath) - } - - return nil -} diff --git a/virtcontainers/documentation/api/1.0/api.md b/virtcontainers/documentation/api/1.0/api.md index 55fbefc4bd..b5621fe833 100644 --- a/virtcontainers/documentation/api/1.0/api.md +++ b/virtcontainers/documentation/api/1.0/api.md @@ -266,9 +266,6 @@ const ( // NoopNetworkModel is the No-Op network. NoopNetworkModel NetworkModel = "noop" - // CNINetworkModel is the CNI network. - CNINetworkModel NetworkModel = "CNI" - // CNMNetworkModel is the CNM network. CNMNetworkModel NetworkModel = "CNM" ) diff --git a/virtcontainers/network.go b/virtcontainers/network.go index a6e574d510..baeb43b9a6 100644 --- a/virtcontainers/network.go +++ b/virtcontainers/network.go @@ -540,9 +540,6 @@ const ( // NoopNetworkModel is the No-Op network. NoopNetworkModel NetworkModel = "noop" - // CNINetworkModel is the CNI network. - CNINetworkModel NetworkModel = "CNI" - // CNMNetworkModel is the CNM network. CNMNetworkModel NetworkModel = "CNM" ) @@ -553,9 +550,6 @@ func (networkType *NetworkModel) Set(value string) error { case "noop": *networkType = NoopNetworkModel return nil - case "CNI": - *networkType = CNINetworkModel - return nil case "CNM": *networkType = CNMNetworkModel return nil @@ -569,8 +563,6 @@ func (networkType *NetworkModel) String() string { switch *networkType { case NoopNetworkModel: return string(NoopNetworkModel) - case CNINetworkModel: - return string(CNINetworkModel) case CNMNetworkModel: return string(CNMNetworkModel) default: @@ -583,8 +575,6 @@ func newNetwork(networkType NetworkModel) network { switch networkType { case NoopNetworkModel: return &noopNetwork{} - case CNINetworkModel: - return &cni{} case CNMNetworkModel: return &cnm{} default: diff --git a/virtcontainers/network_test.go b/virtcontainers/network_test.go index c2442f4f33..75ed18ecfd 100644 --- a/virtcontainers/network_test.go +++ b/virtcontainers/network_test.go @@ -38,10 +38,6 @@ func TestNoopNetworkModelSet(t *testing.T) { testNetworkModelSet(t, "noop", NoopNetworkModel) } -func TestCNINetworkModelSet(t *testing.T) { - testNetworkModelSet(t, "CNI", CNINetworkModel) -} - func TestCNMNetworkModelSet(t *testing.T) { testNetworkModelSet(t, "CNM", CNMNetworkModel) } @@ -68,11 +64,6 @@ func TestNoopNetworkModelString(t *testing.T) { testNetworkModelString(t, &netModel, string(NoopNetworkModel)) } -func TestCNINetworkModelString(t *testing.T) { - netModel := CNINetworkModel - testNetworkModelString(t, &netModel, string(CNINetworkModel)) -} - func TestCNMNetworkModelString(t *testing.T) { netModel := CNMNetworkModel testNetworkModelString(t, &netModel, string(CNMNetworkModel)) @@ -95,10 +86,6 @@ func TestNewNoopNetworkFromNetworkModel(t *testing.T) { testNewNetworkFromNetworkModel(t, NoopNetworkModel, &noopNetwork{}) } -func TestNewCNINetworkFromNetworkModel(t *testing.T) { - testNewNetworkFromNetworkModel(t, CNINetworkModel, &cni{}) -} - func TestNewCNMNetworkFromNetworkModel(t *testing.T) { testNewNetworkFromNetworkModel(t, CNMNetworkModel, &cnm{}) } diff --git a/virtcontainers/pkg/cni/OWNERS b/virtcontainers/pkg/cni/OWNERS deleted file mode 100644 index aa02988580..0000000000 --- a/virtcontainers/pkg/cni/OWNERS +++ /dev/null @@ -1,6 +0,0 @@ -reviewers: -- virtcontainers-maintainers - -approvers: -- mcastelino -- sboeuf diff --git a/virtcontainers/pkg/cni/cni.go b/virtcontainers/pkg/cni/cni.go deleted file mode 100644 index c98ac557e8..0000000000 --- a/virtcontainers/pkg/cni/cni.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2016 Intel Corporation -// -// SPDX-License-Identifier: Apache-2.0 -// - -package cni - -import ( - "fmt" - "sort" - - "github.com/containernetworking/cni/libcni" - types "github.com/containernetworking/cni/pkg/types" -) - -// CNI default values to find plugins and configurations. -const ( - LocalNetName = "lo" - DefNetName = "net" - PluginConfDir = "/etc/cni/net.d" - PluginBinDir = "/opt/cni/bin" -) - -var confExtensions = []string{".conf"} - -// NetworkPlugin is the CNI network plugin handler. -type NetworkPlugin struct { - loNetwork *cniNetwork - defNetwork *cniNetwork -} - -type cniNetwork struct { - name string - networkConfig *libcni.NetworkConfig - cniConfig libcni.CNI -} - -// NewNetworkPlugin initialize the CNI network plugin and returns -// a handler to it. -func NewNetworkPlugin() (*NetworkPlugin, error) { - return NewNetworkPluginWithArgs(PluginConfDir, PluginBinDir) -} - -// NewNetworkPluginWithArgs initialize the CNI network plugin, specifying the -// configuration and binary directories, and it returns a handler to it. -func NewNetworkPluginWithArgs(confDir, binDir string) (*NetworkPlugin, error) { - var err error - - plugin := &NetworkPlugin{} - - plugin.loNetwork, err = getLoNetwork(confDir, binDir) - if err != nil { - return nil, err - } - - plugin.defNetwork, err = getDefNetwork(confDir, binDir) - if err != nil { - return nil, err - } - - return plugin, nil -} - -func getNetwork(confDir, binDir, defaultName string, local bool) (*cniNetwork, error) { - confFiles, err := libcni.ConfFiles(confDir, confExtensions) - if err != nil || confFiles == nil { - return nil, fmt.Errorf("Invalid configuration directory %s", confDir) - } - - if len(confFiles) == 0 { - return nil, fmt.Errorf("Could not find networks in %s", confDir) - } - - if local == true { - sort.Sort(sort.Reverse(sort.StringSlice(confFiles))) - } else { - sort.Sort(sort.StringSlice(confFiles)) - } - - for _, confFile := range confFiles { - conf, err := libcni.ConfFromFile(confFile) - if err != nil { - continue - } - - cninet := &libcni.CNIConfig{ - Path: []string{binDir}, - } - - name := defaultName - if conf.Network.Name != "" { - name = conf.Network.Name - } - - network := &cniNetwork{ - name: name, - networkConfig: conf, - cniConfig: cninet, - } - - return network, nil - } - - return nil, fmt.Errorf("No valid networks found in %s", confDir) -} - -func getLoNetwork(confDir, binDir string) (*cniNetwork, error) { - return getNetwork(confDir, binDir, LocalNetName, true) -} - -func getDefNetwork(confDir, binDir string) (*cniNetwork, error) { - return getNetwork(confDir, binDir, DefNetName, false) -} - -func buildRuntimeConf(sandboxID, sandboxNetNSPath, ifName string) *libcni.RuntimeConf { - return &libcni.RuntimeConf{ - ContainerID: sandboxID, - NetNS: sandboxNetNSPath, - IfName: ifName, - } -} - -// AddNetwork calls the CNI plugin to create a network between the host and the network namespace. -func (plugin *NetworkPlugin) AddNetwork(sandboxID, netNSPath, ifName string) (types.Result, error) { - rt := buildRuntimeConf(sandboxID, netNSPath, ifName) - - _, err := plugin.loNetwork.cniConfig.AddNetwork(plugin.loNetwork.networkConfig, rt) - if err != nil { - return nil, err - } - - ifaceResult, err := plugin.defNetwork.cniConfig.AddNetwork(plugin.defNetwork.networkConfig, rt) - if err != nil { - return nil, err - } - - return ifaceResult, nil -} - -// RemoveNetwork calls the CNI plugin to remove a specific network previously created between -// the host and the network namespace. -func (plugin *NetworkPlugin) RemoveNetwork(sandboxID, netNSPath, ifName string) error { - rt := buildRuntimeConf(sandboxID, netNSPath, ifName) - - err := plugin.defNetwork.cniConfig.DelNetwork(plugin.defNetwork.networkConfig, rt) - if err != nil { - return err - } - - err = plugin.loNetwork.cniConfig.DelNetwork(plugin.loNetwork.networkConfig, rt) - if err != nil { - return err - } - - return nil -} diff --git a/virtcontainers/pkg/cni/cni_test.go b/virtcontainers/pkg/cni/cni_test.go deleted file mode 100644 index 609179aec0..0000000000 --- a/virtcontainers/pkg/cni/cni_test.go +++ /dev/null @@ -1,397 +0,0 @@ -// Copyright (c) 2016 Intel Corporation -// -// SPDX-License-Identifier: Apache-2.0 -// - -package cni - -import ( - "fmt" - "os" - "path/filepath" - "reflect" - "testing" - - "github.com/containernetworking/cni/libcni" - "github.com/containernetworking/plugins/pkg/ns" -) - -const ( - dirMode = os.FileMode(0750) -) - -var testDirBase = "../../utils/supportfiles/cni" -var testConfDir = testDirBase + "/net.d" -var testBinDir = testDirBase + "/bin" -var testWrongConfDir = testDirBase + "/wrong" -var testDefFile = "10-test_network.conf" -var testLoFile = "99-test_loopback.conf" -var testWrongFile = "100-test_error.conf" - -var testLoFileContent = []byte(`{ - "cniVersion": "0.3.0", - "name": "testlonetwork", - "type": "loopback" -}`) - -var testLoFileContentNoName = []byte(`{ - "cniVersion": "0.3.0", - "type": "loopback" -}`) - -var testDefFileContent = []byte(`{ - "cniVersion": "0.3.0", - "name": "testdefnetwork", - "type": "cni-bridge", - "bridge": "cni0", - "isGateway": true, - "ipMasq": true, - "ipam": { - "type": "host-local", - "subnet": "10.88.0.0/16", - "routes": [ - { "dst": "0.0.0.0/0" } - ] - } -}`) - -var testDefFileContentNoName = []byte(`{ - "cniVersion": "0.3.0", - "type": "cni-bridge", - "bridge": "cni0", - "isGateway": true, - "ipMasq": true, - "ipam": { - "type": "host-local", - "subnet": "10.88.0.0/16", - "routes": [ - { "dst": "0.0.0.0/0" } - ] - } -}`) - -var testWrongFileContent = []byte(`{ - "cniVersion "0.3.0", - "type": "loopback" -}`) - -func createLoNetwork(t *testing.T) { - loFile := filepath.Join(testConfDir, testLoFile) - - f, err := os.Create(loFile) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - _, err = f.Write(testLoFileContent) - if err != nil { - t.Fatal(err) - } -} - -func createLoNetworkNoName(t *testing.T) { - loFile := filepath.Join(testConfDir, testLoFile) - - f, err := os.Create(loFile) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - _, err = f.Write(testLoFileContentNoName) - if err != nil { - t.Fatal(err) - } -} - -func createDefNetwork(t *testing.T) { - defFile := filepath.Join(testConfDir, testDefFile) - - f, err := os.Create(defFile) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - _, err = f.Write(testDefFileContent) - if err != nil { - t.Fatal(err) - } -} - -func createDefNetworkNoName(t *testing.T) { - defFile := filepath.Join(testConfDir, testDefFile) - - f, err := os.Create(defFile) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - _, err = f.Write(testDefFileContentNoName) - if err != nil { - t.Fatal(err) - } -} - -func createWrongNetwork(t *testing.T) { - wrongFile := filepath.Join(testConfDir, testWrongFile) - - f, err := os.Create(wrongFile) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - _, err = f.Write(testWrongFileContent) - if err != nil { - t.Fatal(err) - } -} - -func removeLoNetwork(t *testing.T) { - loFile := filepath.Join(testConfDir, testLoFile) - err := os.Remove(loFile) - if err != nil { - t.Fatal(err) - } -} - -func removeDefNetwork(t *testing.T) { - defFile := filepath.Join(testConfDir, testDefFile) - err := os.Remove(defFile) - if err != nil { - t.Fatal(err) - } -} - -func removeWrongNetwork(t *testing.T) { - wrongFile := filepath.Join(testConfDir, testWrongFile) - err := os.Remove(wrongFile) - if err != nil { - t.Fatal(err) - } -} - -func TestNewNetworkPluginSuccessful(t *testing.T) { - createLoNetwork(t) - defer removeLoNetwork(t) - createDefNetwork(t) - defer removeDefNetwork(t) - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err != nil { - t.Fatal(err) - } - - if netPlugin.loNetwork == nil { - t.Fatal("Invalid local network") - } - - if netPlugin.defNetwork == nil { - t.Fatal("Invalid default network") - } - - if netPlugin.loNetwork.name != "testlonetwork" { - t.Fatal("Invalid local network name") - } - - if netPlugin.defNetwork.name != "testdefnetwork" { - t.Fatal("Invalid default network name") - } -} - -func TestNewNetworkPluginSuccessfulNoName(t *testing.T) { - createLoNetworkNoName(t) - defer removeLoNetwork(t) - createDefNetworkNoName(t) - defer removeDefNetwork(t) - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err != nil { - t.Fatal(err) - } - - if netPlugin.loNetwork == nil { - t.Fatal("Invalid local network") - } - - if netPlugin.defNetwork == nil { - t.Fatal("Invalid default network") - } - - if netPlugin.loNetwork.name != "lo" { - t.Fatal("Invalid local network name") - } - - if netPlugin.defNetwork.name != "net" { - t.Fatal("Invalid default network name") - } -} - -func TestNewNetworkPluginFailureNoNetwork(t *testing.T) { - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err == nil || netPlugin != nil { - t.Fatal("Should fail because no available network") - } -} - -func TestNewNetworkPluginFailureNoConfDir(t *testing.T) { - netPlugin, err := NewNetworkPluginWithArgs(testWrongConfDir, testBinDir) - if err == nil || netPlugin != nil { - t.Fatal("Should fail because configuration directory does not exist") - } -} - -func TestNewNetworkPluginFailureWrongNetwork(t *testing.T) { - createWrongNetwork(t) - defer removeWrongNetwork(t) - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err == nil || netPlugin != nil { - t.Fatal("Should fail because of wrong network definition") - } -} - -func TestBuildRuntimeConf(t *testing.T) { - expected := libcni.RuntimeConf{ - ContainerID: "testSandboxID", - NetNS: "testSandboxNetNSPath", - IfName: "testIfName", - } - - runtimeConf := buildRuntimeConf("testSandboxID", "testSandboxNetNSPath", "testIfName") - - if reflect.DeepEqual(*runtimeConf, expected) == false { - t.Fatal("Runtime configuration different from expected one") - } -} - -func TestAddNetworkSuccessful(t *testing.T) { - createLoNetworkNoName(t) - defer removeLoNetwork(t) - createDefNetworkNoName(t) - defer removeDefNetwork(t) - - netNsHandle, err := ns.NewNS() - if err != nil { - t.Fatal(err) - } - defer netNsHandle.Close() - - testNetNsPath := netNsHandle.Path() - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err != nil { - t.Fatal(err) - } - - _, err = netPlugin.AddNetwork("testSandboxID", testNetNsPath, "testIfName") - if err != nil { - t.Fatal(err) - } -} - -func TestAddNetworkFailureUnknownNetNs(t *testing.T) { - createLoNetworkNoName(t) - defer removeLoNetwork(t) - createDefNetworkNoName(t) - defer removeDefNetwork(t) - - const invalidNetNsPath = "/this/path/does/not/exist" - - // ensure it really is invalid - _, err := os.Stat(invalidNetNsPath) - if err == nil { - t.Fatalf("directory %v unexpectedly exists", invalidNetNsPath) - } - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err != nil { - t.Fatal(err) - } - - _, err = netPlugin.AddNetwork("testSandboxID", invalidNetNsPath, "testIfName") - if err == nil { - t.Fatalf("Should fail because netns %s does not exist", invalidNetNsPath) - } -} - -func TestRemoveNetworkSuccessful(t *testing.T) { - createLoNetworkNoName(t) - defer removeLoNetwork(t) - createDefNetworkNoName(t) - defer removeDefNetwork(t) - - netNsHandle, err := ns.NewNS() - if err != nil { - t.Fatal(err) - } - defer netNsHandle.Close() - - testNetNsPath := netNsHandle.Path() - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err != nil { - t.Fatal(err) - } - - _, err = netPlugin.AddNetwork("testSandboxID", testNetNsPath, "testIfName") - if err != nil { - t.Fatal(err) - } - - err = netPlugin.RemoveNetwork("testSandboxID", testNetNsPath, "testIfName") - if err != nil { - t.Fatal(err) - } -} - -func TestRemoveNetworkSuccessfulNetworkDoesNotExist(t *testing.T) { - createLoNetworkNoName(t) - defer removeLoNetwork(t) - createDefNetworkNoName(t) - defer removeDefNetwork(t) - - netNsHandle, err := ns.NewNS() - if err != nil { - t.Fatal(err) - } - defer netNsHandle.Close() - - testNetNsPath := netNsHandle.Path() - - netPlugin, err := NewNetworkPluginWithArgs(testConfDir, testBinDir) - if err != nil { - t.Fatal(err) - } - - err = netPlugin.RemoveNetwork("testSandboxID", testNetNsPath, "testIfName") - if err != nil { - // CNI specification says that no error should be returned - // in case we try to tear down a non-existing network. - t.Fatalf("Should pass because network not previously added: %s", err) - } -} - -func TestMain(m *testing.M) { - err := os.MkdirAll(testConfDir, dirMode) - if err != nil { - fmt.Println("Could not create test configuration directory:", err) - os.Exit(1) - } - - _, err = os.Stat(testBinDir) - if err != nil { - fmt.Println("Test binary directory should exist:", err) - os.RemoveAll(testConfDir) - os.Exit(1) - } - - ret := m.Run() - - os.RemoveAll(testConfDir) - - os.Exit(ret) -} From 0d7b476923388843033763f3a8e8af1de2b68204 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Thu, 9 Aug 2018 15:27:19 -0700 Subject: [PATCH 2/3] network: Remove unused cni vendored code Most of the libcni code can now be removed. Signed-off-by: Archana Shinde --- Gopkg.lock | 12 +- Gopkg.toml | 4 - .../containernetworking/cni/LICENSE | 202 ------------ .../containernetworking/cni/libcni/api.go | 219 ------------- .../containernetworking/cni/libcni/conf.go | 259 --------------- .../cni/pkg/invoke/args.go | 82 ----- .../cni/pkg/invoke/delegate.go | 53 ---- .../cni/pkg/invoke/exec.go | 95 ------ .../cni/pkg/invoke/find.go | 43 --- .../cni/pkg/invoke/os_unix.go | 20 -- .../cni/pkg/invoke/os_windows.go | 18 -- .../cni/pkg/invoke/raw_exec.go | 59 ---- .../cni/pkg/types/020/types.go | 135 -------- .../containernetworking/cni/pkg/types/args.go | 112 ------- .../cni/pkg/types/current/types.go | 300 ------------------ .../cni/pkg/types/types.go | 189 ----------- .../cni/pkg/version/conf.go | 37 --- .../cni/pkg/version/plugin.go | 81 ----- .../cni/pkg/version/reconcile.go | 49 --- .../cni/pkg/version/version.go | 61 ---- 20 files changed, 1 insertion(+), 2029 deletions(-) delete mode 100644 vendor/github.com/containernetworking/cni/LICENSE delete mode 100644 vendor/github.com/containernetworking/cni/libcni/api.go delete mode 100644 vendor/github.com/containernetworking/cni/libcni/conf.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/args.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/exec.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/find.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/types/020/types.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/types/args.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/types/current/types.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/types/types.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/version/conf.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/version/plugin.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/version/reconcile.go delete mode 100644 vendor/github.com/containernetworking/cni/pkg/version/version.go diff --git a/Gopkg.lock b/Gopkg.lock index e9bbaa4e18..58fa448b7d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -37,14 +37,7 @@ [[projects]] digest = "1:3e0383c8e6689f78621ca3592fe1adfc98c23a8bf354704c514d1e7c36d550d7" name = "github.com/containernetworking/cni" - packages = [ - "libcni", - "pkg/invoke", - "pkg/types", - "pkg/types/020", - "pkg/types/current", - "pkg/version", - ] + packages = ["pkg/types"] pruneopts = "NUT" revision = "384d8c0b5288c25b9f1da901c66ea5155e6c567d" @@ -396,10 +389,7 @@ "github.com/clearcontainers/proxy/api", "github.com/clearcontainers/proxy/client", "github.com/containerd/cri-containerd/pkg/annotations", - "github.com/containernetworking/cni/libcni", "github.com/containernetworking/cni/pkg/types", - "github.com/containernetworking/cni/pkg/types/020", - "github.com/containernetworking/cni/pkg/types/current", "github.com/containernetworking/plugins/pkg/ns", "github.com/dlespiau/covertool/pkg/cover", "github.com/docker/go-units", diff --git a/Gopkg.toml b/Gopkg.toml index aeb42b950a..92c37defe4 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -2,10 +2,6 @@ name = "github.com/clearcontainers/proxy" revision = "1d2a6a3ea132a86abd0731408b7dc34f2fc17d55" -[[constraint]] - name = "github.com/containernetworking/cni" - revision = "384d8c0b5288c25b9f1da901c66ea5155e6c567d" - [[constraint]] name = "github.com/containernetworking/plugins" revision = "7f98c94613021d8b57acfa1a2f0c8d0f6fd7ae5a" diff --git a/vendor/github.com/containernetworking/cni/LICENSE b/vendor/github.com/containernetworking/cni/LICENSE deleted file mode 100644 index 8f71f43fee..0000000000 --- a/vendor/github.com/containernetworking/cni/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - 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. - diff --git a/vendor/github.com/containernetworking/cni/libcni/api.go b/vendor/github.com/containernetworking/cni/libcni/api.go deleted file mode 100644 index a23cbb2c57..0000000000 --- a/vendor/github.com/containernetworking/cni/libcni/api.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2015 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 libcni - -import ( - "os" - "strings" - - "github.com/containernetworking/cni/pkg/invoke" - "github.com/containernetworking/cni/pkg/types" - "github.com/containernetworking/cni/pkg/version" -) - -type RuntimeConf struct { - ContainerID string - NetNS string - IfName string - Args [][2]string - // A dictionary of capability-specific data passed by the runtime - // to plugins as top-level keys in the 'runtimeConfig' dictionary - // of the plugin's stdin data. libcni will ensure that only keys - // in this map which match the capabilities of the plugin are passed - // to the plugin - CapabilityArgs map[string]interface{} -} - -type NetworkConfig struct { - Network *types.NetConf - Bytes []byte -} - -type NetworkConfigList struct { - Name string - CNIVersion string - Plugins []*NetworkConfig - Bytes []byte -} - -type CNI interface { - AddNetworkList(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error) - DelNetworkList(net *NetworkConfigList, rt *RuntimeConf) error - - AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) - DelNetwork(net *NetworkConfig, rt *RuntimeConf) error -} - -type CNIConfig struct { - Path []string -} - -// CNIConfig implements the CNI interface -var _ CNI = &CNIConfig{} - -func buildOneConfig(list *NetworkConfigList, orig *NetworkConfig, prevResult types.Result, rt *RuntimeConf) (*NetworkConfig, error) { - var err error - - inject := map[string]interface{}{ - "name": list.Name, - "cniVersion": list.CNIVersion, - } - // Add previous plugin result - if prevResult != nil { - inject["prevResult"] = prevResult - } - - // Ensure every config uses the same name and version - orig, err = InjectConf(orig, inject) - if err != nil { - return nil, err - } - - return injectRuntimeConfig(orig, rt) -} - -// This function takes a libcni RuntimeConf structure and injects values into -// a "runtimeConfig" dictionary in the CNI network configuration JSON that -// will be passed to the plugin on stdin. -// -// Only "capabilities arguments" passed by the runtime are currently injected. -// These capabilities arguments are filtered through the plugin's advertised -// capabilities from its config JSON, and any keys in the CapabilityArgs -// matching plugin capabilities are added to the "runtimeConfig" dictionary -// sent to the plugin via JSON on stdin. For exmaple, if the plugin's -// capabilities include "portMappings", and the CapabilityArgs map includes a -// "portMappings" key, that key and its value are added to the "runtimeConfig" -// dictionary to be passed to the plugin's stdin. -func injectRuntimeConfig(orig *NetworkConfig, rt *RuntimeConf) (*NetworkConfig, error) { - var err error - - rc := make(map[string]interface{}) - for capability, supported := range orig.Network.Capabilities { - if !supported { - continue - } - if data, ok := rt.CapabilityArgs[capability]; ok { - rc[capability] = data - } - } - - if len(rc) > 0 { - orig, err = InjectConf(orig, map[string]interface{}{"runtimeConfig": rc}) - if err != nil { - return nil, err - } - } - - return orig, nil -} - -// AddNetworkList executes a sequence of plugins with the ADD command -func (c *CNIConfig) AddNetworkList(list *NetworkConfigList, rt *RuntimeConf) (types.Result, error) { - var prevResult types.Result - for _, net := range list.Plugins { - pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) - if err != nil { - return nil, err - } - - newConf, err := buildOneConfig(list, net, prevResult, rt) - if err != nil { - return nil, err - } - - prevResult, err = invoke.ExecPluginWithResult(pluginPath, newConf.Bytes, c.args("ADD", rt)) - if err != nil { - return nil, err - } - } - - return prevResult, nil -} - -// DelNetworkList executes a sequence of plugins with the DEL command -func (c *CNIConfig) DelNetworkList(list *NetworkConfigList, rt *RuntimeConf) error { - for i := len(list.Plugins) - 1; i >= 0; i-- { - net := list.Plugins[i] - - pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) - if err != nil { - return err - } - - newConf, err := buildOneConfig(list, net, nil, rt) - if err != nil { - return err - } - - if err := invoke.ExecPluginWithoutResult(pluginPath, newConf.Bytes, c.args("DEL", rt)); err != nil { - return err - } - } - - return nil -} - -// AddNetwork executes the plugin with the ADD command -func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) { - pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) - if err != nil { - return nil, err - } - - net, err = injectRuntimeConfig(net, rt) - if err != nil { - return nil, err - } - - return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt)) -} - -// DelNetwork executes the plugin with the DEL command -func (c *CNIConfig) DelNetwork(net *NetworkConfig, rt *RuntimeConf) error { - pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path) - if err != nil { - return err - } - - net, err = injectRuntimeConfig(net, rt) - if err != nil { - return err - } - - return invoke.ExecPluginWithoutResult(pluginPath, net.Bytes, c.args("DEL", rt)) -} - -// GetVersionInfo reports which versions of the CNI spec are supported by -// the given plugin. -func (c *CNIConfig) GetVersionInfo(pluginType string) (version.PluginInfo, error) { - pluginPath, err := invoke.FindInPath(pluginType, c.Path) - if err != nil { - return nil, err - } - - return invoke.GetVersionInfo(pluginPath) -} - -// ===== -func (c *CNIConfig) args(action string, rt *RuntimeConf) *invoke.Args { - return &invoke.Args{ - Command: action, - ContainerID: rt.ContainerID, - NetNS: rt.NetNS, - PluginArgs: rt.Args, - IfName: rt.IfName, - Path: strings.Join(c.Path, string(os.PathListSeparator)), - } -} diff --git a/vendor/github.com/containernetworking/cni/libcni/conf.go b/vendor/github.com/containernetworking/cni/libcni/conf.go deleted file mode 100644 index 9834d715b5..0000000000 --- a/vendor/github.com/containernetworking/cni/libcni/conf.go +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2015 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 libcni - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "sort" -) - -type NotFoundError struct { - Dir string - Name string -} - -func (e NotFoundError) Error() string { - return fmt.Sprintf(`no net configuration with name "%s" in %s`, e.Name, e.Dir) -} - -type NoConfigsFoundError struct { - Dir string -} - -func (e NoConfigsFoundError) Error() string { - return fmt.Sprintf(`no net configurations found in %s`, e.Dir) -} - -func ConfFromBytes(bytes []byte) (*NetworkConfig, error) { - conf := &NetworkConfig{Bytes: bytes} - if err := json.Unmarshal(bytes, &conf.Network); err != nil { - return nil, fmt.Errorf("error parsing configuration: %s", err) - } - if conf.Network.Type == "" { - return nil, fmt.Errorf("error parsing configuration: missing 'type'") - } - return conf, nil -} - -func ConfFromFile(filename string) (*NetworkConfig, error) { - bytes, err := ioutil.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error reading %s: %s", filename, err) - } - return ConfFromBytes(bytes) -} - -func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) { - rawList := make(map[string]interface{}) - if err := json.Unmarshal(bytes, &rawList); err != nil { - return nil, fmt.Errorf("error parsing configuration list: %s", err) - } - - rawName, ok := rawList["name"] - if !ok { - return nil, fmt.Errorf("error parsing configuration list: no name") - } - name, ok := rawName.(string) - if !ok { - return nil, fmt.Errorf("error parsing configuration list: invalid name type %T", rawName) - } - - var cniVersion string - rawVersion, ok := rawList["cniVersion"] - if ok { - cniVersion, ok = rawVersion.(string) - if !ok { - return nil, fmt.Errorf("error parsing configuration list: invalid cniVersion type %T", rawVersion) - } - } - - list := &NetworkConfigList{ - Name: name, - CNIVersion: cniVersion, - Bytes: bytes, - } - - var plugins []interface{} - plug, ok := rawList["plugins"] - if !ok { - return nil, fmt.Errorf("error parsing configuration list: no 'plugins' key") - } - plugins, ok = plug.([]interface{}) - if !ok { - return nil, fmt.Errorf("error parsing configuration list: invalid 'plugins' type %T", plug) - } - if len(plugins) == 0 { - return nil, fmt.Errorf("error parsing configuration list: no plugins in list") - } - - for i, conf := range plugins { - newBytes, err := json.Marshal(conf) - if err != nil { - return nil, fmt.Errorf("Failed to marshal plugin config %d: %v", i, err) - } - netConf, err := ConfFromBytes(newBytes) - if err != nil { - return nil, fmt.Errorf("Failed to parse plugin config %d: %v", i, err) - } - list.Plugins = append(list.Plugins, netConf) - } - - return list, nil -} - -func ConfListFromFile(filename string) (*NetworkConfigList, error) { - bytes, err := ioutil.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error reading %s: %s", filename, err) - } - return ConfListFromBytes(bytes) -} - -func ConfFiles(dir string, extensions []string) ([]string, error) { - // In part, adapted from rkt/networking/podenv.go#listFiles - files, err := ioutil.ReadDir(dir) - switch { - case err == nil: // break - case os.IsNotExist(err): - return nil, nil - default: - return nil, err - } - - confFiles := []string{} - for _, f := range files { - if f.IsDir() { - continue - } - fileExt := filepath.Ext(f.Name()) - for _, ext := range extensions { - if fileExt == ext { - confFiles = append(confFiles, filepath.Join(dir, f.Name())) - } - } - } - return confFiles, nil -} - -func LoadConf(dir, name string) (*NetworkConfig, error) { - files, err := ConfFiles(dir, []string{".conf", ".json"}) - switch { - case err != nil: - return nil, err - case len(files) == 0: - return nil, NoConfigsFoundError{Dir: dir} - } - sort.Strings(files) - - for _, confFile := range files { - conf, err := ConfFromFile(confFile) - if err != nil { - return nil, err - } - if conf.Network.Name == name { - return conf, nil - } - } - return nil, NotFoundError{dir, name} -} - -func LoadConfList(dir, name string) (*NetworkConfigList, error) { - files, err := ConfFiles(dir, []string{".conflist"}) - if err != nil { - return nil, err - } - sort.Strings(files) - - for _, confFile := range files { - conf, err := ConfListFromFile(confFile) - if err != nil { - return nil, err - } - if conf.Name == name { - return conf, nil - } - } - - // Try and load a network configuration file (instead of list) - // from the same name, then upconvert. - singleConf, err := LoadConf(dir, name) - if err != nil { - // A little extra logic so the error makes sense - if _, ok := err.(NoConfigsFoundError); len(files) != 0 && ok { - // Config lists found but no config files found - return nil, NotFoundError{dir, name} - } - - return nil, err - } - return ConfListFromConf(singleConf) -} - -func InjectConf(original *NetworkConfig, newValues map[string]interface{}) (*NetworkConfig, error) { - config := make(map[string]interface{}) - err := json.Unmarshal(original.Bytes, &config) - if err != nil { - return nil, fmt.Errorf("unmarshal existing network bytes: %s", err) - } - - for key, value := range newValues { - if key == "" { - return nil, fmt.Errorf("keys cannot be empty") - } - - if value == nil { - return nil, fmt.Errorf("key '%s' value must not be nil", key) - } - - config[key] = value - } - - newBytes, err := json.Marshal(config) - if err != nil { - return nil, err - } - - return ConfFromBytes(newBytes) -} - -// ConfListFromConf "upconverts" a network config in to a NetworkConfigList, -// with the single network as the only entry in the list. -func ConfListFromConf(original *NetworkConfig) (*NetworkConfigList, error) { - // Re-deserialize the config's json, then make a raw map configlist. - // This may seem a bit strange, but it's to make the Bytes fields - // actually make sense. Otherwise, the generated json is littered with - // golang default values. - - rawConfig := make(map[string]interface{}) - if err := json.Unmarshal(original.Bytes, &rawConfig); err != nil { - return nil, err - } - - rawConfigList := map[string]interface{}{ - "name": original.Network.Name, - "cniVersion": original.Network.CNIVersion, - "plugins": []interface{}{rawConfig}, - } - - b, err := json.Marshal(rawConfigList) - if err != nil { - return nil, err - } - return ConfListFromBytes(b) -} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/args.go b/vendor/github.com/containernetworking/cni/pkg/invoke/args.go deleted file mode 100644 index 39b6397230..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/args.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2015 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 - -import ( - "os" - "strings" -) - -type CNIArgs interface { - // For use with os/exec; i.e., return nil to inherit the - // environment from this process - AsEnv() []string -} - -type inherited struct{} - -var inheritArgsFromEnv inherited - -func (_ *inherited) AsEnv() []string { - return nil -} - -func ArgsFromEnv() CNIArgs { - return &inheritArgsFromEnv -} - -type Args struct { - Command string - ContainerID string - NetNS string - PluginArgs [][2]string - PluginArgsStr string - IfName string - Path string -} - -// Args implements the CNIArgs interface -var _ CNIArgs = &Args{} - -func (args *Args) AsEnv() []string { - env := os.Environ() - pluginArgsStr := args.PluginArgsStr - if pluginArgsStr == "" { - pluginArgsStr = stringify(args.PluginArgs) - } - - // Ensure that the custom values are first, so any value present in - // the process environment won't override them. - env = append([]string{ - "CNI_COMMAND=" + args.Command, - "CNI_CONTAINERID=" + args.ContainerID, - "CNI_NETNS=" + args.NetNS, - "CNI_ARGS=" + pluginArgsStr, - "CNI_IFNAME=" + args.IfName, - "CNI_PATH=" + args.Path, - }, env...) - return env -} - -// taken from rkt/networking/net_plugin.go -func stringify(pluginArgs [][2]string) string { - entries := make([]string, len(pluginArgs)) - - for i, kv := range pluginArgs { - entries[i] = strings.Join(kv[:], "=") - } - - return strings.Join(entries, ";") -} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go b/vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go deleted file mode 100644 index c78a69eebc..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go +++ /dev/null @@ -1,53 +0,0 @@ -// 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 - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/containernetworking/cni/pkg/types" -) - -func DelegateAdd(delegatePlugin string, netconf []byte) (types.Result, error) { - if os.Getenv("CNI_COMMAND") != "ADD" { - return nil, fmt.Errorf("CNI_COMMAND is not ADD") - } - - paths := filepath.SplitList(os.Getenv("CNI_PATH")) - - pluginPath, err := FindInPath(delegatePlugin, paths) - if err != nil { - return nil, err - } - - return ExecPluginWithResult(pluginPath, netconf, ArgsFromEnv()) -} - -func DelegateDel(delegatePlugin string, netconf []byte) error { - if os.Getenv("CNI_COMMAND") != "DEL" { - return fmt.Errorf("CNI_COMMAND is not DEL") - } - - paths := filepath.SplitList(os.Getenv("CNI_PATH")) - - pluginPath, err := FindInPath(delegatePlugin, paths) - if err != nil { - return err - } - - return ExecPluginWithoutResult(pluginPath, netconf, ArgsFromEnv()) -} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/exec.go b/vendor/github.com/containernetworking/cni/pkg/invoke/exec.go deleted file mode 100644 index fc47e7c825..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/exec.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2015 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 - -import ( - "fmt" - "os" - - "github.com/containernetworking/cni/pkg/types" - "github.com/containernetworking/cni/pkg/version" -) - -func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error) { - return defaultPluginExec.WithResult(pluginPath, netconf, args) -} - -func ExecPluginWithoutResult(pluginPath string, netconf []byte, args CNIArgs) error { - return defaultPluginExec.WithoutResult(pluginPath, netconf, args) -} - -func GetVersionInfo(pluginPath string) (version.PluginInfo, error) { - return defaultPluginExec.GetVersionInfo(pluginPath) -} - -var defaultPluginExec = &PluginExec{ - RawExec: &RawExec{Stderr: os.Stderr}, - VersionDecoder: &version.PluginDecoder{}, -} - -type PluginExec struct { - RawExec interface { - ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error) - } - VersionDecoder interface { - Decode(jsonBytes []byte) (version.PluginInfo, error) - } -} - -func (e *PluginExec) WithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error) { - stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv()) - if err != nil { - return nil, err - } - - // Plugin must return result in same version as specified in netconf - versionDecoder := &version.ConfigDecoder{} - confVersion, err := versionDecoder.Decode(netconf) - if err != nil { - return nil, err - } - - return version.NewResult(confVersion, stdoutBytes) -} - -func (e *PluginExec) WithoutResult(pluginPath string, netconf []byte, args CNIArgs) error { - _, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv()) - return err -} - -// GetVersionInfo returns the version information available about the plugin. -// For recent-enough plugins, it uses the information returned by the VERSION -// command. For older plugins which do not recognize that command, it reports -// version 0.1.0 -func (e *PluginExec) GetVersionInfo(pluginPath string) (version.PluginInfo, error) { - args := &Args{ - Command: "VERSION", - - // set fake values required by plugins built against an older version of skel - NetNS: "dummy", - IfName: "dummy", - Path: "dummy", - } - stdin := []byte(fmt.Sprintf(`{"cniVersion":%q}`, version.Current())) - stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, stdin, args.AsEnv()) - if err != nil { - if err.Error() == "unknown CNI_COMMAND: VERSION" { - return version.PluginSupports("0.1.0"), nil - } - return nil, err - } - - return e.VersionDecoder.Decode(stdoutBytes) -} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/find.go b/vendor/github.com/containernetworking/cni/pkg/invoke/find.go deleted file mode 100644 index e815404c85..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/find.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 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 - -import ( - "fmt" - "os" - "path/filepath" -) - -// FindInPath returns the full path of the plugin by searching in the provided path -func FindInPath(plugin string, paths []string) (string, error) { - if plugin == "" { - return "", fmt.Errorf("no plugin name provided") - } - - if len(paths) == 0 { - return "", fmt.Errorf("no paths provided") - } - - for _, path := range paths { - for _, fe := range ExecutableFileExtensions { - fullpath := filepath.Join(path, plugin) + fe - if fi, err := os.Stat(fullpath); err == nil && fi.Mode().IsRegular() { - return fullpath, nil - } - } - } - - return "", fmt.Errorf("failed to find plugin %q in path %s", plugin, paths) -} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go b/vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go deleted file mode 100644 index bab5737a99..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go +++ /dev/null @@ -1,20 +0,0 @@ -// 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. - -// +build darwin dragonfly freebsd linux netbsd opensbd solaris - -package invoke - -// Valid file extensions for plugin executables. -var ExecutableFileExtensions = []string{""} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go b/vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go deleted file mode 100644 index 7665125b13..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -// 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 - -// Valid file extensions for plugin executables. -var ExecutableFileExtensions = []string{".exe", ""} diff --git a/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go b/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go deleted file mode 100644 index 93f1e75d9f..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "os/exec" - - "github.com/containernetworking/cni/pkg/types" -) - -type RawExec struct { - Stderr io.Writer -} - -func (e *RawExec) ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error) { - stdout := &bytes.Buffer{} - - c := exec.Cmd{ - Env: environ, - Path: pluginPath, - Args: []string{pluginPath}, - Stdin: bytes.NewBuffer(stdinData), - Stdout: stdout, - Stderr: e.Stderr, - } - if err := c.Run(); err != nil { - return nil, pluginErr(err, stdout.Bytes()) - } - - return stdout.Bytes(), nil -} - -func pluginErr(err error, output []byte) error { - if _, ok := err.(*exec.ExitError); ok { - emsg := types.Error{} - if perr := json.Unmarshal(output, &emsg); perr != nil { - emsg.Msg = fmt.Sprintf("netplugin failed but error parsing its diagnostic message %q: %v", string(output), perr) - } - return &emsg - } - - return err -} diff --git a/vendor/github.com/containernetworking/cni/pkg/types/020/types.go b/vendor/github.com/containernetworking/cni/pkg/types/020/types.go deleted file mode 100644 index 2833aba787..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/types/020/types.go +++ /dev/null @@ -1,135 +0,0 @@ -// 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 types020 - -import ( - "encoding/json" - "fmt" - "net" - "os" - - "github.com/containernetworking/cni/pkg/types" -) - -const ImplementedSpecVersion string = "0.2.0" - -var SupportedVersions = []string{"", "0.1.0", ImplementedSpecVersion} - -// Compatibility types for CNI version 0.1.0 and 0.2.0 - -func NewResult(data []byte) (types.Result, error) { - result := &Result{} - if err := json.Unmarshal(data, result); err != nil { - return nil, err - } - return result, nil -} - -func GetResult(r types.Result) (*Result, error) { - // We expect version 0.1.0/0.2.0 results - result020, err := r.GetAsVersion(ImplementedSpecVersion) - if err != nil { - return nil, err - } - result, ok := result020.(*Result) - if !ok { - return nil, fmt.Errorf("failed to convert result") - } - return result, nil -} - -// Result is what gets returned from the plugin (via stdout) to the caller -type Result struct { - CNIVersion string `json:"cniVersion,omitempty"` - IP4 *IPConfig `json:"ip4,omitempty"` - IP6 *IPConfig `json:"ip6,omitempty"` - DNS types.DNS `json:"dns,omitempty"` -} - -func (r *Result) Version() string { - return ImplementedSpecVersion -} - -func (r *Result) GetAsVersion(version string) (types.Result, error) { - for _, supportedVersion := range SupportedVersions { - if version == supportedVersion { - r.CNIVersion = version - return r, nil - } - } - return nil, fmt.Errorf("cannot convert version %q to %s", SupportedVersions, version) -} - -func (r *Result) Print() error { - data, err := json.MarshalIndent(r, "", " ") - if err != nil { - return err - } - _, err = os.Stdout.Write(data) - return err -} - -// String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where -// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the -// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. -func (r *Result) String() string { - var str string - if r.IP4 != nil { - str = fmt.Sprintf("IP4:%+v, ", *r.IP4) - } - if r.IP6 != nil { - str += fmt.Sprintf("IP6:%+v, ", *r.IP6) - } - return fmt.Sprintf("%sDNS:%+v", str, r.DNS) -} - -// IPConfig contains values necessary to configure an interface -type IPConfig struct { - IP net.IPNet - Gateway net.IP - Routes []types.Route -} - -// net.IPNet is not JSON (un)marshallable so this duality is needed -// for our custom IPNet type - -// JSON (un)marshallable types -type ipConfig struct { - IP types.IPNet `json:"ip"` - Gateway net.IP `json:"gateway,omitempty"` - Routes []types.Route `json:"routes,omitempty"` -} - -func (c *IPConfig) MarshalJSON() ([]byte, error) { - ipc := ipConfig{ - IP: types.IPNet(c.IP), - Gateway: c.Gateway, - Routes: c.Routes, - } - - return json.Marshal(ipc) -} - -func (c *IPConfig) UnmarshalJSON(data []byte) error { - ipc := ipConfig{} - if err := json.Unmarshal(data, &ipc); err != nil { - return err - } - - c.IP = net.IPNet(ipc.IP) - c.Gateway = ipc.Gateway - c.Routes = ipc.Routes - return nil -} diff --git a/vendor/github.com/containernetworking/cni/pkg/types/args.go b/vendor/github.com/containernetworking/cni/pkg/types/args.go deleted file mode 100644 index bd8640fc96..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/types/args.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2015 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 types - -import ( - "encoding" - "fmt" - "reflect" - "strings" -) - -// UnmarshallableBool typedef for builtin bool -// because builtin type's methods can't be declared -type UnmarshallableBool bool - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// Returns boolean true if the string is "1" or "[Tt]rue" -// Returns boolean false if the string is "0" or "[Ff]alse" -func (b *UnmarshallableBool) UnmarshalText(data []byte) error { - s := strings.ToLower(string(data)) - switch s { - case "1", "true": - *b = true - case "0", "false": - *b = false - default: - return fmt.Errorf("Boolean unmarshal error: invalid input %s", s) - } - return nil -} - -// UnmarshallableString typedef for builtin string -type UnmarshallableString string - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// Returns the string -func (s *UnmarshallableString) UnmarshalText(data []byte) error { - *s = UnmarshallableString(data) - return nil -} - -// CommonArgs contains the IgnoreUnknown argument -// and must be embedded by all Arg structs -type CommonArgs struct { - IgnoreUnknown UnmarshallableBool `json:"ignoreunknown,omitempty"` -} - -// GetKeyField is a helper function to receive Values -// Values that represent a pointer to a struct -func GetKeyField(keyString string, v reflect.Value) reflect.Value { - return v.Elem().FieldByName(keyString) -} - -// UnmarshalableArgsError is used to indicate error unmarshalling args -// from the args-string in the form "K=V;K2=V2;..." -type UnmarshalableArgsError struct { - error -} - -// LoadArgs parses args from a string in the form "K=V;K2=V2;..." -func LoadArgs(args string, container interface{}) error { - if args == "" { - return nil - } - - containerValue := reflect.ValueOf(container) - - pairs := strings.Split(args, ";") - unknownArgs := []string{} - for _, pair := range pairs { - kv := strings.Split(pair, "=") - if len(kv) != 2 { - return fmt.Errorf("ARGS: invalid pair %q", pair) - } - keyString := kv[0] - valueString := kv[1] - keyField := GetKeyField(keyString, containerValue) - if !keyField.IsValid() { - unknownArgs = append(unknownArgs, pair) - continue - } - keyFieldIface := keyField.Addr().Interface() - u, ok := keyFieldIface.(encoding.TextUnmarshaler) - if !ok { - return UnmarshalableArgsError{fmt.Errorf( - "ARGS: cannot unmarshal into field '%s' - type '%s' does not implement encoding.TextUnmarshaler", - keyString, reflect.TypeOf(keyFieldIface))} - } - err := u.UnmarshalText([]byte(valueString)) - if err != nil { - return fmt.Errorf("ARGS: error parsing value of pair %q: %v)", pair, err) - } - } - - isIgnoreUnknown := GetKeyField("IgnoreUnknown", containerValue).Bool() - if len(unknownArgs) > 0 && !isIgnoreUnknown { - return fmt.Errorf("ARGS: unknown args %q", unknownArgs) - } - return nil -} diff --git a/vendor/github.com/containernetworking/cni/pkg/types/current/types.go b/vendor/github.com/containernetworking/cni/pkg/types/current/types.go deleted file mode 100644 index caac92ba77..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/types/current/types.go +++ /dev/null @@ -1,300 +0,0 @@ -// 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 current - -import ( - "encoding/json" - "fmt" - "net" - "os" - - "github.com/containernetworking/cni/pkg/types" - "github.com/containernetworking/cni/pkg/types/020" -) - -const ImplementedSpecVersion string = "0.3.1" - -var SupportedVersions = []string{"0.3.0", ImplementedSpecVersion} - -func NewResult(data []byte) (types.Result, error) { - result := &Result{} - if err := json.Unmarshal(data, result); err != nil { - return nil, err - } - return result, nil -} - -func GetResult(r types.Result) (*Result, error) { - resultCurrent, err := r.GetAsVersion(ImplementedSpecVersion) - if err != nil { - return nil, err - } - result, ok := resultCurrent.(*Result) - if !ok { - return nil, fmt.Errorf("failed to convert result") - } - return result, nil -} - -var resultConverters = []struct { - versions []string - convert func(types.Result) (*Result, error) -}{ - {types020.SupportedVersions, convertFrom020}, - {SupportedVersions, convertFrom030}, -} - -func convertFrom020(result types.Result) (*Result, error) { - oldResult, err := types020.GetResult(result) - if err != nil { - return nil, err - } - - newResult := &Result{ - CNIVersion: ImplementedSpecVersion, - DNS: oldResult.DNS, - Routes: []*types.Route{}, - } - - if oldResult.IP4 != nil { - newResult.IPs = append(newResult.IPs, &IPConfig{ - Version: "4", - Address: oldResult.IP4.IP, - Gateway: oldResult.IP4.Gateway, - }) - for _, route := range oldResult.IP4.Routes { - gw := route.GW - if gw == nil { - gw = oldResult.IP4.Gateway - } - newResult.Routes = append(newResult.Routes, &types.Route{ - Dst: route.Dst, - GW: gw, - }) - } - } - - if oldResult.IP6 != nil { - newResult.IPs = append(newResult.IPs, &IPConfig{ - Version: "6", - Address: oldResult.IP6.IP, - Gateway: oldResult.IP6.Gateway, - }) - for _, route := range oldResult.IP6.Routes { - gw := route.GW - if gw == nil { - gw = oldResult.IP6.Gateway - } - newResult.Routes = append(newResult.Routes, &types.Route{ - Dst: route.Dst, - GW: gw, - }) - } - } - - if len(newResult.IPs) == 0 { - return nil, fmt.Errorf("cannot convert: no valid IP addresses") - } - - return newResult, nil -} - -func convertFrom030(result types.Result) (*Result, error) { - newResult, ok := result.(*Result) - if !ok { - return nil, fmt.Errorf("failed to convert result") - } - newResult.CNIVersion = ImplementedSpecVersion - return newResult, nil -} - -func NewResultFromResult(result types.Result) (*Result, error) { - version := result.Version() - for _, converter := range resultConverters { - for _, supportedVersion := range converter.versions { - if version == supportedVersion { - return converter.convert(result) - } - } - } - return nil, fmt.Errorf("unsupported CNI result22 version %q", version) -} - -// Result is what gets returned from the plugin (via stdout) to the caller -type Result struct { - CNIVersion string `json:"cniVersion,omitempty"` - Interfaces []*Interface `json:"interfaces,omitempty"` - IPs []*IPConfig `json:"ips,omitempty"` - Routes []*types.Route `json:"routes,omitempty"` - DNS types.DNS `json:"dns,omitempty"` -} - -// Convert to the older 0.2.0 CNI spec Result type -func (r *Result) convertTo020() (*types020.Result, error) { - oldResult := &types020.Result{ - CNIVersion: types020.ImplementedSpecVersion, - DNS: r.DNS, - } - - for _, ip := range r.IPs { - // Only convert the first IP address of each version as 0.2.0 - // and earlier cannot handle multiple IP addresses - if ip.Version == "4" && oldResult.IP4 == nil { - oldResult.IP4 = &types020.IPConfig{ - IP: ip.Address, - Gateway: ip.Gateway, - } - } else if ip.Version == "6" && oldResult.IP6 == nil { - oldResult.IP6 = &types020.IPConfig{ - IP: ip.Address, - Gateway: ip.Gateway, - } - } - - if oldResult.IP4 != nil && oldResult.IP6 != nil { - break - } - } - - for _, route := range r.Routes { - is4 := route.Dst.IP.To4() != nil - if is4 && oldResult.IP4 != nil { - oldResult.IP4.Routes = append(oldResult.IP4.Routes, types.Route{ - Dst: route.Dst, - GW: route.GW, - }) - } else if !is4 && oldResult.IP6 != nil { - oldResult.IP6.Routes = append(oldResult.IP6.Routes, types.Route{ - Dst: route.Dst, - GW: route.GW, - }) - } - } - - if oldResult.IP4 == nil && oldResult.IP6 == nil { - return nil, fmt.Errorf("cannot convert: no valid IP addresses") - } - - return oldResult, nil -} - -func (r *Result) Version() string { - return ImplementedSpecVersion -} - -func (r *Result) GetAsVersion(version string) (types.Result, error) { - switch version { - case "0.3.0", ImplementedSpecVersion: - r.CNIVersion = version - return r, nil - case types020.SupportedVersions[0], types020.SupportedVersions[1], types020.SupportedVersions[2]: - return r.convertTo020() - } - return nil, fmt.Errorf("cannot convert version 0.3.x to %q", version) -} - -func (r *Result) Print() error { - data, err := json.MarshalIndent(r, "", " ") - if err != nil { - return err - } - _, err = os.Stdout.Write(data) - return err -} - -// String returns a formatted string in the form of "[Interfaces: $1,][ IP: $2,] DNS: $3" where -// $1 represents the receiver's Interfaces, $2 represents the receiver's IP addresses and $3 the -// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. -func (r *Result) String() string { - var str string - if len(r.Interfaces) > 0 { - str += fmt.Sprintf("Interfaces:%+v, ", r.Interfaces) - } - if len(r.IPs) > 0 { - str += fmt.Sprintf("IP:%+v, ", r.IPs) - } - if len(r.Routes) > 0 { - str += fmt.Sprintf("Routes:%+v, ", r.Routes) - } - return fmt.Sprintf("%sDNS:%+v", str, r.DNS) -} - -// Convert this old version result to the current CNI version result -func (r *Result) Convert() (*Result, error) { - return r, nil -} - -// Interface contains values about the created interfaces -type Interface struct { - Name string `json:"name"` - Mac string `json:"mac,omitempty"` - Sandbox string `json:"sandbox,omitempty"` -} - -func (i *Interface) String() string { - return fmt.Sprintf("%+v", *i) -} - -// Int returns a pointer to the int value passed in. Used to -// set the IPConfig.Interface field. -func Int(v int) *int { - return &v -} - -// IPConfig contains values necessary to configure an IP address on an interface -type IPConfig struct { - // IP version, either "4" or "6" - Version string - // Index into Result structs Interfaces list - Interface *int - Address net.IPNet - Gateway net.IP -} - -func (i *IPConfig) String() string { - return fmt.Sprintf("%+v", *i) -} - -// JSON (un)marshallable types -type ipConfig struct { - Version string `json:"version"` - Interface *int `json:"interface,omitempty"` - Address types.IPNet `json:"address"` - Gateway net.IP `json:"gateway,omitempty"` -} - -func (c *IPConfig) MarshalJSON() ([]byte, error) { - ipc := ipConfig{ - Version: c.Version, - Interface: c.Interface, - Address: types.IPNet(c.Address), - Gateway: c.Gateway, - } - - return json.Marshal(ipc) -} - -func (c *IPConfig) UnmarshalJSON(data []byte) error { - ipc := ipConfig{} - if err := json.Unmarshal(data, &ipc); err != nil { - return err - } - - c.Version = ipc.Version - c.Interface = ipc.Interface - c.Address = net.IPNet(ipc.Address) - c.Gateway = ipc.Gateway - return nil -} diff --git a/vendor/github.com/containernetworking/cni/pkg/types/types.go b/vendor/github.com/containernetworking/cni/pkg/types/types.go deleted file mode 100644 index 6412756007..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/types/types.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2015 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 types - -import ( - "encoding/json" - "errors" - "fmt" - "net" - "os" -) - -// like net.IPNet but adds JSON marshalling and unmarshalling -type IPNet net.IPNet - -// ParseCIDR takes a string like "10.2.3.1/24" and -// return IPNet with "10.2.3.1" and /24 mask -func ParseCIDR(s string) (*net.IPNet, error) { - ip, ipn, err := net.ParseCIDR(s) - if err != nil { - return nil, err - } - - ipn.IP = ip - return ipn, nil -} - -func (n IPNet) MarshalJSON() ([]byte, error) { - return json.Marshal((*net.IPNet)(&n).String()) -} - -func (n *IPNet) UnmarshalJSON(data []byte) error { - var s string - if err := json.Unmarshal(data, &s); err != nil { - return err - } - - tmp, err := ParseCIDR(s) - if err != nil { - return err - } - - *n = IPNet(*tmp) - return nil -} - -// NetConf describes a network. -type NetConf struct { - CNIVersion string `json:"cniVersion,omitempty"` - - Name string `json:"name,omitempty"` - Type string `json:"type,omitempty"` - Capabilities map[string]bool `json:"capabilities,omitempty"` - IPAM struct { - Type string `json:"type,omitempty"` - } `json:"ipam,omitempty"` - DNS DNS `json:"dns"` -} - -// NetConfList describes an ordered list of networks. -type NetConfList struct { - CNIVersion string `json:"cniVersion,omitempty"` - - Name string `json:"name,omitempty"` - Plugins []*NetConf `json:"plugins,omitempty"` -} - -type ResultFactoryFunc func([]byte) (Result, error) - -// Result is an interface that provides the result of plugin execution -type Result interface { - // The highest CNI specification result verison the result supports - // without having to convert - Version() string - - // Returns the result converted into the requested CNI specification - // result version, or an error if conversion failed - GetAsVersion(version string) (Result, error) - - // Prints the result in JSON format to stdout - Print() error - - // Returns a JSON string representation of the result - String() string -} - -func PrintResult(result Result, version string) error { - newResult, err := result.GetAsVersion(version) - if err != nil { - return err - } - return newResult.Print() -} - -// DNS contains values interesting for DNS resolvers -type DNS struct { - Nameservers []string `json:"nameservers,omitempty"` - Domain string `json:"domain,omitempty"` - Search []string `json:"search,omitempty"` - Options []string `json:"options,omitempty"` -} - -type Route struct { - Dst net.IPNet - GW net.IP -} - -func (r *Route) String() string { - return fmt.Sprintf("%+v", *r) -} - -// Well known error codes -// see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes -const ( - ErrUnknown uint = iota // 0 - ErrIncompatibleCNIVersion // 1 - ErrUnsupportedField // 2 -) - -type Error struct { - Code uint `json:"code"` - Msg string `json:"msg"` - Details string `json:"details,omitempty"` -} - -func (e *Error) Error() string { - details := "" - if e.Details != "" { - details = fmt.Sprintf("; %v", e.Details) - } - return fmt.Sprintf("%v%v", e.Msg, details) -} - -func (e *Error) Print() error { - return prettyPrint(e) -} - -// net.IPNet is not JSON (un)marshallable so this duality is needed -// for our custom IPNet type - -// JSON (un)marshallable types -type route struct { - Dst IPNet `json:"dst"` - GW net.IP `json:"gw,omitempty"` -} - -func (r *Route) UnmarshalJSON(data []byte) error { - rt := route{} - if err := json.Unmarshal(data, &rt); err != nil { - return err - } - - r.Dst = net.IPNet(rt.Dst) - r.GW = rt.GW - return nil -} - -func (r *Route) MarshalJSON() ([]byte, error) { - rt := route{ - Dst: IPNet(r.Dst), - GW: r.GW, - } - - return json.Marshal(rt) -} - -func prettyPrint(obj interface{}) error { - data, err := json.MarshalIndent(obj, "", " ") - if err != nil { - return err - } - _, err = os.Stdout.Write(data) - return err -} - -// NotImplementedError is used to indicate that a method is not implemented for the given platform -var NotImplementedError = errors.New("Not Implemented") diff --git a/vendor/github.com/containernetworking/cni/pkg/version/conf.go b/vendor/github.com/containernetworking/cni/pkg/version/conf.go deleted file mode 100644 index 3cca58bbeb..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/version/conf.go +++ /dev/null @@ -1,37 +0,0 @@ -// 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 version - -import ( - "encoding/json" - "fmt" -) - -// ConfigDecoder can decode the CNI version available in network config data -type ConfigDecoder struct{} - -func (*ConfigDecoder) Decode(jsonBytes []byte) (string, error) { - var conf struct { - CNIVersion string `json:"cniVersion"` - } - err := json.Unmarshal(jsonBytes, &conf) - if err != nil { - return "", fmt.Errorf("decoding version from network config: %s", err) - } - if conf.CNIVersion == "" { - return "0.1.0", nil - } - return conf.CNIVersion, nil -} diff --git a/vendor/github.com/containernetworking/cni/pkg/version/plugin.go b/vendor/github.com/containernetworking/cni/pkg/version/plugin.go deleted file mode 100644 index 8a46728105..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/version/plugin.go +++ /dev/null @@ -1,81 +0,0 @@ -// 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 version - -import ( - "encoding/json" - "fmt" - "io" -) - -// PluginInfo reports information about CNI versioning -type PluginInfo interface { - // SupportedVersions returns one or more CNI spec versions that the plugin - // supports. If input is provided in one of these versions, then the plugin - // promises to use the same CNI version in its response - SupportedVersions() []string - - // Encode writes this CNI version information as JSON to the given Writer - Encode(io.Writer) error -} - -type pluginInfo struct { - CNIVersion_ string `json:"cniVersion"` - SupportedVersions_ []string `json:"supportedVersions,omitempty"` -} - -// pluginInfo implements the PluginInfo interface -var _ PluginInfo = &pluginInfo{} - -func (p *pluginInfo) Encode(w io.Writer) error { - return json.NewEncoder(w).Encode(p) -} - -func (p *pluginInfo) SupportedVersions() []string { - return p.SupportedVersions_ -} - -// PluginSupports returns a new PluginInfo that will report the given versions -// as supported -func PluginSupports(supportedVersions ...string) PluginInfo { - if len(supportedVersions) < 1 { - panic("programmer error: you must support at least one version") - } - return &pluginInfo{ - CNIVersion_: Current(), - SupportedVersions_: supportedVersions, - } -} - -// PluginDecoder can decode the response returned by a plugin's VERSION command -type PluginDecoder struct{} - -func (*PluginDecoder) Decode(jsonBytes []byte) (PluginInfo, error) { - var info pluginInfo - err := json.Unmarshal(jsonBytes, &info) - if err != nil { - return nil, fmt.Errorf("decoding version info: %s", err) - } - if info.CNIVersion_ == "" { - return nil, fmt.Errorf("decoding version info: missing field cniVersion") - } - if len(info.SupportedVersions_) == 0 { - if info.CNIVersion_ == "0.2.0" { - return PluginSupports("0.1.0", "0.2.0"), nil - } - return nil, fmt.Errorf("decoding version info: missing field supportedVersions") - } - return &info, nil -} diff --git a/vendor/github.com/containernetworking/cni/pkg/version/reconcile.go b/vendor/github.com/containernetworking/cni/pkg/version/reconcile.go deleted file mode 100644 index 25c3810b2a..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/version/reconcile.go +++ /dev/null @@ -1,49 +0,0 @@ -// 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 version - -import "fmt" - -type ErrorIncompatible struct { - Config string - Supported []string -} - -func (e *ErrorIncompatible) Details() string { - return fmt.Sprintf("config is %q, plugin supports %q", e.Config, e.Supported) -} - -func (e *ErrorIncompatible) Error() string { - return fmt.Sprintf("incompatible CNI versions: %s", e.Details()) -} - -type Reconciler struct{} - -func (r *Reconciler) Check(configVersion string, pluginInfo PluginInfo) *ErrorIncompatible { - return r.CheckRaw(configVersion, pluginInfo.SupportedVersions()) -} - -func (*Reconciler) CheckRaw(configVersion string, supportedVersions []string) *ErrorIncompatible { - for _, supportedVersion := range supportedVersions { - if configVersion == supportedVersion { - return nil - } - } - - return &ErrorIncompatible{ - Config: configVersion, - Supported: supportedVersions, - } -} diff --git a/vendor/github.com/containernetworking/cni/pkg/version/version.go b/vendor/github.com/containernetworking/cni/pkg/version/version.go deleted file mode 100644 index efe8ea8716..0000000000 --- a/vendor/github.com/containernetworking/cni/pkg/version/version.go +++ /dev/null @@ -1,61 +0,0 @@ -// 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 version - -import ( - "fmt" - - "github.com/containernetworking/cni/pkg/types" - "github.com/containernetworking/cni/pkg/types/020" - "github.com/containernetworking/cni/pkg/types/current" -) - -// Current reports the version of the CNI spec implemented by this library -func Current() string { - return "0.3.1" -} - -// Legacy PluginInfo describes a plugin that is backwards compatible with the -// CNI spec version 0.1.0. In particular, a runtime compiled against the 0.1.0 -// library ought to work correctly with a plugin that reports support for -// Legacy versions. -// -// Any future CNI spec versions which meet this definition should be added to -// this list. -var Legacy = PluginSupports("0.1.0", "0.2.0") -var All = PluginSupports("0.1.0", "0.2.0", "0.3.0", "0.3.1") - -var resultFactories = []struct { - supportedVersions []string - newResult types.ResultFactoryFunc -}{ - {current.SupportedVersions, current.NewResult}, - {types020.SupportedVersions, types020.NewResult}, -} - -// Finds a Result object matching the requested version (if any) and asks -// that object to parse the plugin result, returning an error if parsing failed. -func NewResult(version string, resultBytes []byte) (types.Result, error) { - reconciler := &Reconciler{} - for _, resultFactory := range resultFactories { - err := reconciler.CheckRaw(version, resultFactory.supportedVersions) - if err == nil { - // Result supports this version - return resultFactory.newResult(resultBytes) - } - } - - return nil, fmt.Errorf("unsupported CNI result version %q", version) -} From 474111c1af06cc0509a16b7cec78bc822abba279 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Tue, 14 Aug 2018 10:00:57 -0700 Subject: [PATCH 3/3] tests: Add a cleanup for the CNM tests The CNM test was missing a cleanup which was handled earlier with the CNI tests. Signed-off-by: Archana Shinde --- virtcontainers/api_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/virtcontainers/api_test.go b/virtcontainers/api_test.go index 5f896806fc..0cb1086bf4 100644 --- a/virtcontainers/api_test.go +++ b/virtcontainers/api_test.go @@ -1358,6 +1358,8 @@ func TestStartStopSandboxHyperstartAgentSuccessfulWithCNMNetwork(t *testing.T) { t.Skip(testDisabledAsNonRoot) } + cleanUp() + config := newTestSandboxConfigHyperstartAgentCNMNetwork() sockDir, err := testGenerateCCProxySockDir()