mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-07-06 12:06:49 +00:00
network: Remove unused cni vendored code
Most of the libcni code can now be removed. Signed-off-by: Archana Shinde <archana.m.shinde@intel.com>
This commit is contained in:
parent
99fa758423
commit
0d7b476923
12
Gopkg.lock
generated
12
Gopkg.lock
generated
@ -37,14 +37,7 @@
|
|||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:3e0383c8e6689f78621ca3592fe1adfc98c23a8bf354704c514d1e7c36d550d7"
|
digest = "1:3e0383c8e6689f78621ca3592fe1adfc98c23a8bf354704c514d1e7c36d550d7"
|
||||||
name = "github.com/containernetworking/cni"
|
name = "github.com/containernetworking/cni"
|
||||||
packages = [
|
packages = ["pkg/types"]
|
||||||
"libcni",
|
|
||||||
"pkg/invoke",
|
|
||||||
"pkg/types",
|
|
||||||
"pkg/types/020",
|
|
||||||
"pkg/types/current",
|
|
||||||
"pkg/version",
|
|
||||||
]
|
|
||||||
pruneopts = "NUT"
|
pruneopts = "NUT"
|
||||||
revision = "384d8c0b5288c25b9f1da901c66ea5155e6c567d"
|
revision = "384d8c0b5288c25b9f1da901c66ea5155e6c567d"
|
||||||
|
|
||||||
@ -396,10 +389,7 @@
|
|||||||
"github.com/clearcontainers/proxy/api",
|
"github.com/clearcontainers/proxy/api",
|
||||||
"github.com/clearcontainers/proxy/client",
|
"github.com/clearcontainers/proxy/client",
|
||||||
"github.com/containerd/cri-containerd/pkg/annotations",
|
"github.com/containerd/cri-containerd/pkg/annotations",
|
||||||
"github.com/containernetworking/cni/libcni",
|
|
||||||
"github.com/containernetworking/cni/pkg/types",
|
"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/containernetworking/plugins/pkg/ns",
|
||||||
"github.com/dlespiau/covertool/pkg/cover",
|
"github.com/dlespiau/covertool/pkg/cover",
|
||||||
"github.com/docker/go-units",
|
"github.com/docker/go-units",
|
||||||
|
@ -2,10 +2,6 @@
|
|||||||
name = "github.com/clearcontainers/proxy"
|
name = "github.com/clearcontainers/proxy"
|
||||||
revision = "1d2a6a3ea132a86abd0731408b7dc34f2fc17d55"
|
revision = "1d2a6a3ea132a86abd0731408b7dc34f2fc17d55"
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
name = "github.com/containernetworking/cni"
|
|
||||||
revision = "384d8c0b5288c25b9f1da901c66ea5155e6c567d"
|
|
||||||
|
|
||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "github.com/containernetworking/plugins"
|
name = "github.com/containernetworking/plugins"
|
||||||
revision = "7f98c94613021d8b57acfa1a2f0c8d0f6fd7ae5a"
|
revision = "7f98c94613021d8b57acfa1a2f0c8d0f6fd7ae5a"
|
||||||
|
202
vendor/github.com/containernetworking/cni/LICENSE
generated
vendored
202
vendor/github.com/containernetworking/cni/LICENSE
generated
vendored
@ -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.
|
|
||||||
|
|
219
vendor/github.com/containernetworking/cni/libcni/api.go
generated
vendored
219
vendor/github.com/containernetworking/cni/libcni/api.go
generated
vendored
@ -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)),
|
|
||||||
}
|
|
||||||
}
|
|
259
vendor/github.com/containernetworking/cni/libcni/conf.go
generated
vendored
259
vendor/github.com/containernetworking/cni/libcni/conf.go
generated
vendored
@ -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)
|
|
||||||
}
|
|
82
vendor/github.com/containernetworking/cni/pkg/invoke/args.go
generated
vendored
82
vendor/github.com/containernetworking/cni/pkg/invoke/args.go
generated
vendored
@ -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, ";")
|
|
||||||
}
|
|
53
vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
generated
vendored
53
vendor/github.com/containernetworking/cni/pkg/invoke/delegate.go
generated
vendored
@ -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())
|
|
||||||
}
|
|
95
vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
generated
vendored
95
vendor/github.com/containernetworking/cni/pkg/invoke/exec.go
generated
vendored
@ -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)
|
|
||||||
}
|
|
43
vendor/github.com/containernetworking/cni/pkg/invoke/find.go
generated
vendored
43
vendor/github.com/containernetworking/cni/pkg/invoke/find.go
generated
vendored
@ -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)
|
|
||||||
}
|
|
20
vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
generated
vendored
20
vendor/github.com/containernetworking/cni/pkg/invoke/os_unix.go
generated
vendored
@ -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{""}
|
|
18
vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
generated
vendored
18
vendor/github.com/containernetworking/cni/pkg/invoke/os_windows.go
generated
vendored
@ -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", ""}
|
|
59
vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
generated
vendored
59
vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go
generated
vendored
@ -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
|
|
||||||
}
|
|
135
vendor/github.com/containernetworking/cni/pkg/types/020/types.go
generated
vendored
135
vendor/github.com/containernetworking/cni/pkg/types/020/types.go
generated
vendored
@ -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
|
|
||||||
}
|
|
112
vendor/github.com/containernetworking/cni/pkg/types/args.go
generated
vendored
112
vendor/github.com/containernetworking/cni/pkg/types/args.go
generated
vendored
@ -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
|
|
||||||
}
|
|
300
vendor/github.com/containernetworking/cni/pkg/types/current/types.go
generated
vendored
300
vendor/github.com/containernetworking/cni/pkg/types/current/types.go
generated
vendored
@ -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
|
|
||||||
}
|
|
189
vendor/github.com/containernetworking/cni/pkg/types/types.go
generated
vendored
189
vendor/github.com/containernetworking/cni/pkg/types/types.go
generated
vendored
@ -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")
|
|
37
vendor/github.com/containernetworking/cni/pkg/version/conf.go
generated
vendored
37
vendor/github.com/containernetworking/cni/pkg/version/conf.go
generated
vendored
@ -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
|
|
||||||
}
|
|
81
vendor/github.com/containernetworking/cni/pkg/version/plugin.go
generated
vendored
81
vendor/github.com/containernetworking/cni/pkg/version/plugin.go
generated
vendored
@ -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
|
|
||||||
}
|
|
49
vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
generated
vendored
49
vendor/github.com/containernetworking/cni/pkg/version/reconcile.go
generated
vendored
@ -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,
|
|
||||||
}
|
|
||||||
}
|
|
61
vendor/github.com/containernetworking/cni/pkg/version/version.go
generated
vendored
61
vendor/github.com/containernetworking/cni/pkg/version/version.go
generated
vendored
@ -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)
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user