mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-27 15:57:09 +00:00
vendor: Vendor the latest CNI plugins
Vendor cni plugin repo to use the latest code for setting up network namespaces. Signed-off-by: Archana Shinde <archana.m.shinde@intel.com>
This commit is contained in:
parent
86d8346d0c
commit
c0995c6201
12
Gopkg.lock
generated
12
Gopkg.lock
generated
@ -159,19 +159,11 @@
|
|||||||
revision = "2a93cfde8c20b23de8eb84a5adbc234ddf7a9e8d"
|
revision = "2a93cfde8c20b23de8eb84a5adbc234ddf7a9e8d"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:827ed8a74e55981880c4d77f8472d638bceb899188104ba7bf24a9548fd97292"
|
digest = "1:bcf22f6210505381c098d3ab8c039b1c435b6ee1e4cbb51563310c79328e1d28"
|
||||||
name = "github.com/containernetworking/cni"
|
|
||||||
packages = ["pkg/types"]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "a7885cb6f8ab03fba07852ded351e4f5e7a112bf"
|
|
||||||
version = "v0.6.0"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:1552ba1ba0d0f3596966cca53601a5f59c257ca7ace87f41708a2480835c5286"
|
|
||||||
name = "github.com/containernetworking/plugins"
|
name = "github.com/containernetworking/plugins"
|
||||||
packages = ["pkg/ns"]
|
packages = ["pkg/ns"]
|
||||||
pruneopts = "NUT"
|
pruneopts = "NUT"
|
||||||
revision = "7f98c94613021d8b57acfa1a2f0c8d0f6fd7ae5a"
|
revision = "485be65581341430f9106a194a98f0f2412245fb"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:6f614c5193761d29b3184a170380672cafd025306261ce7810e2dd99907184c4"
|
digest = "1:6f614c5193761d29b3184a170380672cafd025306261ce7810e2dd99907184c4"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "github.com/containernetworking/plugins"
|
name = "github.com/containernetworking/plugins"
|
||||||
revision = "7f98c94613021d8b57acfa1a2f0c8d0f6fd7ae5a"
|
revision = "485be65581341430f9106a194a98f0f2412245fb"
|
||||||
|
|
||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "github.com/go-ini/ini"
|
name = "github.com/go-ini/ini"
|
||||||
|
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.
|
|
||||||
|
|
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
|
|
||||||
}
|
|
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")
|
|
178
vendor/github.com/containernetworking/plugins/pkg/ns/ns.go
generated
vendored
178
vendor/github.com/containernetworking/plugins/pkg/ns/ns.go
generated
vendored
@ -1,178 +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 ns
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"sync"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
type NetNS interface {
|
|
||||||
// Executes the passed closure in this object's network namespace,
|
|
||||||
// attempting to restore the original namespace before returning.
|
|
||||||
// However, since each OS thread can have a different network namespace,
|
|
||||||
// and Go's thread scheduling is highly variable, callers cannot
|
|
||||||
// guarantee any specific namespace is set unless operations that
|
|
||||||
// require that namespace are wrapped with Do(). Also, no code called
|
|
||||||
// from Do() should call runtime.UnlockOSThread(), or the risk
|
|
||||||
// of executing code in an incorrect namespace will be greater. See
|
|
||||||
// https://github.com/golang/go/wiki/LockOSThread for further details.
|
|
||||||
Do(toRun func(NetNS) error) error
|
|
||||||
|
|
||||||
// Sets the current network namespace to this object's network namespace.
|
|
||||||
// Note that since Go's thread scheduling is highly variable, callers
|
|
||||||
// cannot guarantee the requested namespace will be the current namespace
|
|
||||||
// after this function is called; to ensure this wrap operations that
|
|
||||||
// require the namespace with Do() instead.
|
|
||||||
Set() error
|
|
||||||
|
|
||||||
// Returns the filesystem path representing this object's network namespace
|
|
||||||
Path() string
|
|
||||||
|
|
||||||
// Returns a file descriptor representing this object's network namespace
|
|
||||||
Fd() uintptr
|
|
||||||
|
|
||||||
// Cleans up this instance of the network namespace; if this instance
|
|
||||||
// is the last user the namespace will be destroyed
|
|
||||||
Close() error
|
|
||||||
}
|
|
||||||
|
|
||||||
type netNS struct {
|
|
||||||
file *os.File
|
|
||||||
mounted bool
|
|
||||||
closed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// netNS implements the NetNS interface
|
|
||||||
var _ NetNS = &netNS{}
|
|
||||||
|
|
||||||
const (
|
|
||||||
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/magic.h
|
|
||||||
NSFS_MAGIC = 0x6e736673
|
|
||||||
PROCFS_MAGIC = 0x9fa0
|
|
||||||
)
|
|
||||||
|
|
||||||
type NSPathNotExistErr struct{ msg string }
|
|
||||||
|
|
||||||
func (e NSPathNotExistErr) Error() string { return e.msg }
|
|
||||||
|
|
||||||
type NSPathNotNSErr struct{ msg string }
|
|
||||||
|
|
||||||
func (e NSPathNotNSErr) Error() string { return e.msg }
|
|
||||||
|
|
||||||
func IsNSorErr(nspath string) error {
|
|
||||||
stat := syscall.Statfs_t{}
|
|
||||||
if err := syscall.Statfs(nspath, &stat); err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
err = NSPathNotExistErr{msg: fmt.Sprintf("failed to Statfs %q: %v", nspath, err)}
|
|
||||||
} else {
|
|
||||||
err = fmt.Errorf("failed to Statfs %q: %v", nspath, err)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
switch stat.Type {
|
|
||||||
case PROCFS_MAGIC, NSFS_MAGIC:
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
return NSPathNotNSErr{msg: fmt.Sprintf("unknown FS magic on %q: %x", nspath, stat.Type)}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns an object representing the namespace referred to by @path
|
|
||||||
func GetNS(nspath string) (NetNS, error) {
|
|
||||||
err := IsNSorErr(nspath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
fd, err := os.Open(nspath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &netNS{file: fd}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) Path() string {
|
|
||||||
return ns.file.Name()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) Fd() uintptr {
|
|
||||||
return ns.file.Fd()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) errorIfClosed() error {
|
|
||||||
if ns.closed {
|
|
||||||
return fmt.Errorf("%q has already been closed", ns.file.Name())
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) Do(toRun func(NetNS) error) error {
|
|
||||||
if err := ns.errorIfClosed(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
containedCall := func(hostNS NetNS) error {
|
|
||||||
threadNS, err := GetCurrentNS()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to open current netns: %v", err)
|
|
||||||
}
|
|
||||||
defer threadNS.Close()
|
|
||||||
|
|
||||||
// switch to target namespace
|
|
||||||
if err = ns.Set(); err != nil {
|
|
||||||
return fmt.Errorf("error switching to ns %v: %v", ns.file.Name(), err)
|
|
||||||
}
|
|
||||||
defer threadNS.Set() // switch back
|
|
||||||
|
|
||||||
return toRun(hostNS)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save a handle to current network namespace
|
|
||||||
hostNS, err := GetCurrentNS()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Failed to open current namespace: %v", err)
|
|
||||||
}
|
|
||||||
defer hostNS.Close()
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
wg.Add(1)
|
|
||||||
|
|
||||||
var innerError error
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
runtime.LockOSThread()
|
|
||||||
innerError = containedCall(hostNS)
|
|
||||||
}()
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
return innerError
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithNetNSPath executes the passed closure under the given network
|
|
||||||
// namespace, restoring the original namespace afterwards.
|
|
||||||
func WithNetNSPath(nspath string, toRun func(NetNS) error) error {
|
|
||||||
ns, err := GetNS(nspath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer ns.Close()
|
|
||||||
return ns.Do(toRun)
|
|
||||||
}
|
|
243
vendor/github.com/containernetworking/plugins/pkg/ns/ns_linux.go
generated
vendored
243
vendor/github.com/containernetworking/plugins/pkg/ns/ns_linux.go
generated
vendored
@ -15,12 +15,11 @@
|
|||||||
package ns
|
package ns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
@ -37,82 +36,6 @@ func getCurrentThreadNetNSPath() string {
|
|||||||
return fmt.Sprintf("/proc/%d/task/%d/ns/net", os.Getpid(), unix.Gettid())
|
return fmt.Sprintf("/proc/%d/task/%d/ns/net", os.Getpid(), unix.Gettid())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new persistent network namespace and returns an object
|
|
||||||
// representing that namespace, without switching to it
|
|
||||||
func NewNS() (NetNS, error) {
|
|
||||||
const nsRunDir = "/var/run/netns"
|
|
||||||
|
|
||||||
b := make([]byte, 16)
|
|
||||||
_, err := rand.Reader.Read(b)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to generate random netns name: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = os.MkdirAll(nsRunDir, 0755)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// create an empty file at the mount point
|
|
||||||
nsName := fmt.Sprintf("cni-%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
|
|
||||||
nsPath := path.Join(nsRunDir, nsName)
|
|
||||||
mountPointFd, err := os.Create(nsPath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
mountPointFd.Close()
|
|
||||||
|
|
||||||
// Ensure the mount point is cleaned up on errors; if the namespace
|
|
||||||
// was successfully mounted this will have no effect because the file
|
|
||||||
// is in-use
|
|
||||||
defer os.RemoveAll(nsPath)
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
wg.Add(1)
|
|
||||||
|
|
||||||
// do namespace work in a dedicated goroutine, so that we can safely
|
|
||||||
// Lock/Unlock OSThread without upsetting the lock/unlock state of
|
|
||||||
// the caller of this function
|
|
||||||
var fd *os.File
|
|
||||||
go (func() {
|
|
||||||
defer wg.Done()
|
|
||||||
runtime.LockOSThread()
|
|
||||||
|
|
||||||
var origNS NetNS
|
|
||||||
origNS, err = GetNS(getCurrentThreadNetNSPath())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer origNS.Close()
|
|
||||||
|
|
||||||
// create a new netns on the current thread
|
|
||||||
err = unix.Unshare(unix.CLONE_NEWNET)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer origNS.Set()
|
|
||||||
|
|
||||||
// bind mount the new netns from the current thread onto the mount point
|
|
||||||
err = unix.Mount(getCurrentThreadNetNSPath(), nsPath, "none", unix.MS_BIND, "")
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fd, err = os.Open(nsPath)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
})()
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
unix.Unmount(nsPath, unix.MNT_DETACH)
|
|
||||||
return nil, fmt.Errorf("failed to create namespace: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &netNS{file: fd, mounted: true}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) Close() error {
|
func (ns *netNS) Close() error {
|
||||||
if err := ns.errorIfClosed(); err != nil {
|
if err := ns.errorIfClosed(); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -123,16 +46,6 @@ func (ns *netNS) Close() error {
|
|||||||
}
|
}
|
||||||
ns.closed = true
|
ns.closed = true
|
||||||
|
|
||||||
if ns.mounted {
|
|
||||||
if err := unix.Unmount(ns.file.Name(), unix.MNT_DETACH); err != nil {
|
|
||||||
return fmt.Errorf("Failed to unmount namespace %s: %v", ns.file.Name(), err)
|
|
||||||
}
|
|
||||||
if err := os.RemoveAll(ns.file.Name()); err != nil {
|
|
||||||
return fmt.Errorf("Failed to clean up namespace %s: %v", ns.file.Name(), err)
|
|
||||||
}
|
|
||||||
ns.mounted = false
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,3 +60,157 @@ func (ns *netNS) Set() error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NetNS interface {
|
||||||
|
// Executes the passed closure in this object's network namespace,
|
||||||
|
// attempting to restore the original namespace before returning.
|
||||||
|
// However, since each OS thread can have a different network namespace,
|
||||||
|
// and Go's thread scheduling is highly variable, callers cannot
|
||||||
|
// guarantee any specific namespace is set unless operations that
|
||||||
|
// require that namespace are wrapped with Do(). Also, no code called
|
||||||
|
// from Do() should call runtime.UnlockOSThread(), or the risk
|
||||||
|
// of executing code in an incorrect namespace will be greater. See
|
||||||
|
// https://github.com/golang/go/wiki/LockOSThread for further details.
|
||||||
|
Do(toRun func(NetNS) error) error
|
||||||
|
|
||||||
|
// Sets the current network namespace to this object's network namespace.
|
||||||
|
// Note that since Go's thread scheduling is highly variable, callers
|
||||||
|
// cannot guarantee the requested namespace will be the current namespace
|
||||||
|
// after this function is called; to ensure this wrap operations that
|
||||||
|
// require the namespace with Do() instead.
|
||||||
|
Set() error
|
||||||
|
|
||||||
|
// Returns the filesystem path representing this object's network namespace
|
||||||
|
Path() string
|
||||||
|
|
||||||
|
// Returns a file descriptor representing this object's network namespace
|
||||||
|
Fd() uintptr
|
||||||
|
|
||||||
|
// Cleans up this instance of the network namespace; if this instance
|
||||||
|
// is the last user the namespace will be destroyed
|
||||||
|
Close() error
|
||||||
|
}
|
||||||
|
|
||||||
|
type netNS struct {
|
||||||
|
file *os.File
|
||||||
|
closed bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// netNS implements the NetNS interface
|
||||||
|
var _ NetNS = &netNS{}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/magic.h
|
||||||
|
NSFS_MAGIC = 0x6e736673
|
||||||
|
PROCFS_MAGIC = 0x9fa0
|
||||||
|
)
|
||||||
|
|
||||||
|
type NSPathNotExistErr struct{ msg string }
|
||||||
|
|
||||||
|
func (e NSPathNotExistErr) Error() string { return e.msg }
|
||||||
|
|
||||||
|
type NSPathNotNSErr struct{ msg string }
|
||||||
|
|
||||||
|
func (e NSPathNotNSErr) Error() string { return e.msg }
|
||||||
|
|
||||||
|
func IsNSorErr(nspath string) error {
|
||||||
|
stat := syscall.Statfs_t{}
|
||||||
|
if err := syscall.Statfs(nspath, &stat); err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
err = NSPathNotExistErr{msg: fmt.Sprintf("failed to Statfs %q: %v", nspath, err)}
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("failed to Statfs %q: %v", nspath, err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch stat.Type {
|
||||||
|
case PROCFS_MAGIC, NSFS_MAGIC:
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
return NSPathNotNSErr{msg: fmt.Sprintf("unknown FS magic on %q: %x", nspath, stat.Type)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns an object representing the namespace referred to by @path
|
||||||
|
func GetNS(nspath string) (NetNS, error) {
|
||||||
|
err := IsNSorErr(nspath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fd, err := os.Open(nspath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &netNS{file: fd}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *netNS) Path() string {
|
||||||
|
return ns.file.Name()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *netNS) Fd() uintptr {
|
||||||
|
return ns.file.Fd()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *netNS) errorIfClosed() error {
|
||||||
|
if ns.closed {
|
||||||
|
return fmt.Errorf("%q has already been closed", ns.file.Name())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *netNS) Do(toRun func(NetNS) error) error {
|
||||||
|
if err := ns.errorIfClosed(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
containedCall := func(hostNS NetNS) error {
|
||||||
|
threadNS, err := GetCurrentNS()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to open current netns: %v", err)
|
||||||
|
}
|
||||||
|
defer threadNS.Close()
|
||||||
|
|
||||||
|
// switch to target namespace
|
||||||
|
if err = ns.Set(); err != nil {
|
||||||
|
return fmt.Errorf("error switching to ns %v: %v", ns.file.Name(), err)
|
||||||
|
}
|
||||||
|
defer threadNS.Set() // switch back
|
||||||
|
|
||||||
|
return toRun(hostNS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// save a handle to current network namespace
|
||||||
|
hostNS, err := GetCurrentNS()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to open current namespace: %v", err)
|
||||||
|
}
|
||||||
|
defer hostNS.Close()
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
wg.Add(1)
|
||||||
|
|
||||||
|
var innerError error
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
runtime.LockOSThread()
|
||||||
|
innerError = containedCall(hostNS)
|
||||||
|
}()
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
return innerError
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithNetNSPath executes the passed closure under the given network
|
||||||
|
// namespace, restoring the original namespace afterwards.
|
||||||
|
func WithNetNSPath(nspath string, toRun func(NetNS) error) error {
|
||||||
|
ns, err := GetNS(nspath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer ns.Close()
|
||||||
|
return ns.Do(toRun)
|
||||||
|
}
|
||||||
|
36
vendor/github.com/containernetworking/plugins/pkg/ns/ns_unspecified.go
generated
vendored
36
vendor/github.com/containernetworking/plugins/pkg/ns/ns_unspecified.go
generated
vendored
@ -1,36 +0,0 @@
|
|||||||
// Copyright 2015-2017 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 !linux
|
|
||||||
|
|
||||||
package ns
|
|
||||||
|
|
||||||
import "github.com/containernetworking/cni/pkg/types"
|
|
||||||
|
|
||||||
// Returns an object representing the current OS thread's network namespace
|
|
||||||
func GetCurrentNS() (NetNS, error) {
|
|
||||||
return nil, types.NotImplementedError
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewNS() (NetNS, error) {
|
|
||||||
return nil, types.NotImplementedError
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) Close() error {
|
|
||||||
return types.NotImplementedError
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ns *netNS) Set() error {
|
|
||||||
return types.NotImplementedError
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user