bump cni version to v0.8.0
bump cni dependencies so we can benefits from its bugfixes and improvements Signed-off-by: Antonio Ojea <antonio.ojea.garcia@gmail.com>
This commit is contained in:
		
				
					committed by
					
						
						Antonio Ojea
					
				
			
			
				
	
			
			
			
						parent
						
							412378ff02
						
					
				
				
					commit
					e3d27f9ed8
				
			
							
								
								
									
										24
									
								
								vendor/github.com/containernetworking/plugins/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/containernetworking/plugins/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +1,34 @@
 | 
			
		||||
[](https://travis-ci.org/containernetworking/plugins)
 | 
			
		||||
[](https://ci.appveyor.com/project/cni-bot/plugins/branch/master)
 | 
			
		||||
[](https://travis-ci.org/containernetworking/plugins)
 | 
			
		||||
 | 
			
		||||
# plugins
 | 
			
		||||
Some CNI network plugins, maintained by the containernetworking team. For more information, see the individual READMEs.
 | 
			
		||||
 | 
			
		||||
Read [CONTRIBUTING](CONTRIBUTING.md) for build and test instructions.
 | 
			
		||||
 | 
			
		||||
## Plugins supplied:
 | 
			
		||||
### Main: interface-creating
 | 
			
		||||
* `bridge`: Creates a bridge, adds the host and the container to it.
 | 
			
		||||
* `ipvlan`: Adds an [ipvlan](https://www.kernel.org/doc/Documentation/networking/ipvlan.txt) interface in the container
 | 
			
		||||
* `loopback`: Creates a loopback interface
 | 
			
		||||
* `macvlan`: Creates a new MAC address, forwards all traffic to that to the container
 | 
			
		||||
* `ipvlan`: Adds an [ipvlan](https://www.kernel.org/doc/Documentation/networking/ipvlan.txt) interface in the container.
 | 
			
		||||
* `loopback`: Set the state of loopback interface to up.
 | 
			
		||||
* `macvlan`: Creates a new MAC address, forwards all traffic to that to the container.
 | 
			
		||||
* `ptp`: Creates a veth pair.
 | 
			
		||||
* `vlan`: Allocates a vlan device.
 | 
			
		||||
 | 
			
		||||
* `host-device`: Move an already-existing device into a container.
 | 
			
		||||
#### Windows: windows specific
 | 
			
		||||
* `win-bridge`: Creates a bridge, adds the host and the container to it.
 | 
			
		||||
* `win-overlay`: Creates an overlay interface to the container.
 | 
			
		||||
### IPAM: IP address allocation
 | 
			
		||||
* `dhcp`: Runs a daemon on the host to make DHCP requests on behalf of the container
 | 
			
		||||
* `host-local`: maintains a local database of allocated IPs
 | 
			
		||||
* `host-local`: Maintains a local database of allocated IPs
 | 
			
		||||
* `static`:  Allocate a static IPv4/IPv6 addresses to container and it's useful in debugging purpose.
 | 
			
		||||
 | 
			
		||||
### Meta: other plugins
 | 
			
		||||
* `flannel`: generates an interface corresponding to a flannel config file
 | 
			
		||||
* `flannel`: Generates an interface corresponding to a flannel config file
 | 
			
		||||
* `tuning`: Tweaks sysctl parameters of an existing interface
 | 
			
		||||
* `portmap`: An iptables-based portmapping plugin. Maps ports from the host's address space to the container.
 | 
			
		||||
* `bandwidth`: Allows bandwidth-limiting through use of traffic control tbf (ingress/egress).
 | 
			
		||||
* `sbr`: A plugin that configures source based routing for an interface (from which it is chained).
 | 
			
		||||
* `firewall`: A firewall plugin which uses iptables or firewalld to add rules to allow traffic to/from the container.
 | 
			
		||||
 | 
			
		||||
### Sample
 | 
			
		||||
The sample plugin provides an example for building your own plugin.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/github.com/containernetworking/plugins/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/containernetworking/plugins/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
module github.com/containernetworking/plugins
 | 
			
		||||
 | 
			
		||||
go 1.12
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/Microsoft/go-winio v0.4.11 // indirect
 | 
			
		||||
	github.com/Microsoft/hcsshim v0.8.6
 | 
			
		||||
	github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae
 | 
			
		||||
	github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44
 | 
			
		||||
	github.com/containernetworking/cni v0.7.1
 | 
			
		||||
	github.com/coreos/go-iptables v0.4.5
 | 
			
		||||
	github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7
 | 
			
		||||
	github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c
 | 
			
		||||
	github.com/d2g/dhcp4client v1.0.0
 | 
			
		||||
	github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5
 | 
			
		||||
	github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 // indirect
 | 
			
		||||
	github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c
 | 
			
		||||
	github.com/golang/protobuf v1.3.1 // indirect
 | 
			
		||||
	github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56
 | 
			
		||||
	github.com/mattn/go-shellwords v1.0.3
 | 
			
		||||
	github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b
 | 
			
		||||
	github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a
 | 
			
		||||
	github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8
 | 
			
		||||
	github.com/sirupsen/logrus v1.0.6 // indirect
 | 
			
		||||
	github.com/stretchr/testify v1.3.0 // indirect
 | 
			
		||||
	github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf
 | 
			
		||||
	github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc // indirect
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941 // indirect
 | 
			
		||||
	golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1 // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f
 | 
			
		||||
	gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect
 | 
			
		||||
	gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/containernetworking/plugins/pkg/ns/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/containernetworking/plugins/pkg/ns/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -12,10 +12,6 @@ For example, you cannot rely on the `ns.Set()` namespace being the current names
 | 
			
		||||
The `ns.Do()` method provides **partial** control over network namespaces for you by implementing these strategies. All code dependent on a particular network namespace (including the root namespace) should be wrapped in the `ns.Do()` method to ensure the correct namespace is selected for the duration of your code.  For example:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
targetNs, err := ns.NewNS()
 | 
			
		||||
if err != nil {
 | 
			
		||||
    return err
 | 
			
		||||
}
 | 
			
		||||
err = targetNs.Do(func(hostNs ns.NetNS) error {
 | 
			
		||||
	dummy := &netlink.Dummy{
 | 
			
		||||
		LinkAttrs: netlink.LinkAttrs{
 | 
			
		||||
@@ -26,11 +22,16 @@ err = targetNs.Do(func(hostNs ns.NetNS) error {
 | 
			
		||||
})
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Note this requirement to wrap every network call is very onerous - any libraries you call might call out to network services such as DNS, and all such calls need to be protected after you call `ns.Do()`. The CNI plugins all exit very soon after calling `ns.Do()` which helps to minimize the problem.
 | 
			
		||||
Note this requirement to wrap every network call is very onerous - any libraries you call might call out to network services such as DNS, and all such calls need to be protected after you call `ns.Do()`. All goroutines spawned from within the `ns.Do` will not inherit the new namespace. The CNI plugins all exit very soon after calling `ns.Do()` which helps to minimize the problem.
 | 
			
		||||
 | 
			
		||||
Also:  If the runtime spawns a new OS thread, it will inherit the network namespace of the parent thread, which may have been temporarily switched, and thus the new OS thread will be permanently "stuck in the wrong namespace".
 | 
			
		||||
When a new thread is spawned in Linux, it inherits the namespace of its parent. In versions of go **prior to 1.10**, if the runtime spawns a new OS thread, it picks the parent randomly. If the chosen parent thread has been moved to a new namespace (even temporarily), the new OS thread will be permanently "stuck in the wrong namespace", and goroutines will non-deterministically switch namespaces as they are rescheduled.
 | 
			
		||||
 | 
			
		||||
In short, **there was no safe way to change network namespaces, even temporarily, from within a long-lived, multithreaded Go process**. If you wish to do this, you must use go 1.10 or greater. 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Creating network namespaces
 | 
			
		||||
Earlier versions of this library managed namespace creation, but as CNI does not actually utilize this feature (and it was essentially unmaintained), it was removed. If you're writing a container runtime, you should implement namespace management yourself. However, there are some gotchas when doing so, especially around handling `/var/run/netns`. A reasonably correct reference implementation, borrowed from `rkt`, can be found in `pkg/testutils/netns_linux.go` if you're in need of a source of inspiration.
 | 
			
		||||
 | 
			
		||||
In short, **there is no safe way to change network namespaces from within a long-lived, multithreaded Go process**.  If your daemon process needs to be namespace aware, consider spawning a separate process (like a CNI plugin) for each namespace.
 | 
			
		||||
 | 
			
		||||
### Further Reading
 | 
			
		||||
 - https://github.com/golang/go/wiki/LockOSThread
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								vendor/github.com/containernetworking/plugins/pkg/ns/ns_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										108
									
								
								vendor/github.com/containernetworking/plugins/pkg/ns/ns_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,10 +15,8 @@
 | 
			
		||||
package ns
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
@@ -38,82 +36,6 @@ func getCurrentThreadNetNSPath() string {
 | 
			
		||||
	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 {
 | 
			
		||||
	if err := ns.errorIfClosed(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -124,16 +46,6 @@ func (ns *netNS) Close() error {
 | 
			
		||||
	}
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -180,9 +92,8 @@ type NetNS interface {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type netNS struct {
 | 
			
		||||
	file    *os.File
 | 
			
		||||
	mounted bool
 | 
			
		||||
	closed  bool
 | 
			
		||||
	file   *os.File
 | 
			
		||||
	closed bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// netNS implements the NetNS interface
 | 
			
		||||
@@ -267,7 +178,16 @@ func (ns *netNS) Do(toRun func(NetNS) error) error {
 | 
			
		||||
		if err = ns.Set(); err != nil {
 | 
			
		||||
			return fmt.Errorf("error switching to ns %v: %v", ns.file.Name(), err)
 | 
			
		||||
		}
 | 
			
		||||
		defer threadNS.Set() // switch back
 | 
			
		||||
		defer func() {
 | 
			
		||||
			err := threadNS.Set() // switch back
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				// Unlock the current thread only when we successfully switched back
 | 
			
		||||
				// to the original namespace; otherwise leave the thread locked which
 | 
			
		||||
				// will force the runtime to scrap the current thread, that is maybe
 | 
			
		||||
				// not as optimal but at least always safe to do.
 | 
			
		||||
				runtime.UnlockOSThread()
 | 
			
		||||
			}
 | 
			
		||||
		}()
 | 
			
		||||
 | 
			
		||||
		return toRun(hostNS)
 | 
			
		||||
	}
 | 
			
		||||
@@ -282,6 +202,10 @@ func (ns *netNS) Do(toRun func(NetNS) error) error {
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	wg.Add(1)
 | 
			
		||||
 | 
			
		||||
	// Start the callback in a new green thread so that if we later fail
 | 
			
		||||
	// to switch the namespace back to the original one, we can safely
 | 
			
		||||
	// leave the thread locked to die without a risk of the current thread
 | 
			
		||||
	// left lingering with incorrect namespace.
 | 
			
		||||
	var innerError error
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user