mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
![Jana Radhakrishnan](/assets/img/avatar_default.png)
This PR attempts to work around bugs present in kernel version 3.18-4.0.1 relating to namespace creation and destruction. This fix attempts to avoid certain systemmcalls to not get in the kkernel bug path as well as lazily garbage collecting the name paths when they are removed. Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
214 lines
4.9 KiB
Go
214 lines
4.9 KiB
Go
package sandbox
|
|
|
|
import (
|
|
"net"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/docker/docker/pkg/reexec"
|
|
)
|
|
|
|
func TestMain(m *testing.M) {
|
|
if reexec.Init() {
|
|
return
|
|
}
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
func TestSandboxCreate(t *testing.T) {
|
|
key, err := newKey(t)
|
|
if err != nil {
|
|
t.Fatalf("Failed to obtain a key: %v", err)
|
|
}
|
|
|
|
s, err := NewSandbox(key, true)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create a new sandbox: %v", err)
|
|
}
|
|
|
|
if s.Key() != key {
|
|
t.Fatalf("s.Key() returned %s. Expected %s", s.Key(), key)
|
|
}
|
|
|
|
info, err := newInfo(t)
|
|
if err != nil {
|
|
t.Fatalf("Failed to generate new sandbox info: %v", err)
|
|
}
|
|
|
|
for _, i := range info.Interfaces {
|
|
err = s.AddInterface(i)
|
|
if err != nil {
|
|
t.Fatalf("Failed to add interfaces to sandbox: %v", err)
|
|
}
|
|
}
|
|
|
|
err = s.SetGateway(info.Gateway)
|
|
if err != nil {
|
|
t.Fatalf("Failed to set gateway to sandbox: %v", err)
|
|
}
|
|
|
|
err = s.SetGatewayIPv6(info.GatewayIPv6)
|
|
if err != nil {
|
|
t.Fatalf("Failed to set ipv6 gateway to sandbox: %v", err)
|
|
}
|
|
|
|
verifySandbox(t, s)
|
|
s.Destroy()
|
|
verifyCleanup(t, s)
|
|
}
|
|
|
|
func TestSandboxCreateTwice(t *testing.T) {
|
|
key, err := newKey(t)
|
|
if err != nil {
|
|
t.Fatalf("Failed to obtain a key: %v", err)
|
|
}
|
|
|
|
_, err = NewSandbox(key, true)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create a new sandbox: %v", err)
|
|
}
|
|
|
|
// Create another sandbox with the same key to see if we handle it
|
|
// gracefully.
|
|
s, err := NewSandbox(key, true)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create a new sandbox: %v", err)
|
|
}
|
|
s.Destroy()
|
|
}
|
|
|
|
func TestAddRemoveInterface(t *testing.T) {
|
|
key, err := newKey(t)
|
|
if err != nil {
|
|
t.Fatalf("Failed to obtain a key: %v", err)
|
|
}
|
|
|
|
s, err := NewSandbox(key, true)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create a new sandbox: %v", err)
|
|
}
|
|
|
|
if s.Key() != key {
|
|
t.Fatalf("s.Key() returned %s. Expected %s", s.Key(), key)
|
|
}
|
|
|
|
info, err := newInfo(t)
|
|
if err != nil {
|
|
t.Fatalf("Failed to generate new sandbox info: %v", err)
|
|
}
|
|
|
|
for _, i := range info.Interfaces {
|
|
err = s.AddInterface(i)
|
|
if err != nil {
|
|
t.Fatalf("Failed to add interfaces to sandbox: %v", err)
|
|
}
|
|
}
|
|
|
|
interfaces := s.Interfaces()
|
|
if !(interfaces[0].Equal(info.Interfaces[0]) && interfaces[1].Equal(info.Interfaces[1])) {
|
|
t.Fatalf("Failed to update Sandbox.sinfo.Interfaces in AddInterfaces")
|
|
}
|
|
|
|
if err := s.RemoveInterface(info.Interfaces[0]); err != nil {
|
|
t.Fatalf("Failed to remove interfaces from sandbox: %v", err)
|
|
}
|
|
|
|
if !s.Interfaces()[0].Equal(info.Interfaces[1]) {
|
|
t.Fatalf("Failed to update the sanbox.sinfo.Interfaces in RemoveInterferce")
|
|
}
|
|
|
|
if err := s.AddInterface(info.Interfaces[0]); err != nil {
|
|
t.Fatalf("Failed to add interfaces to sandbox: %v", err)
|
|
}
|
|
|
|
interfaces = s.Interfaces()
|
|
if !(interfaces[0].Equal(info.Interfaces[1]) && interfaces[1].Equal(info.Interfaces[0])) {
|
|
t.Fatalf("Failed to update Sandbox.sinfo.Interfaces in AddInterfaces")
|
|
}
|
|
|
|
s.Destroy()
|
|
}
|
|
|
|
func TestInterfaceEqual(t *testing.T) {
|
|
list := getInterfaceList()
|
|
|
|
if !list[0].Equal(list[0]) {
|
|
t.Fatalf("Interface.Equal() returned false negative")
|
|
}
|
|
|
|
if list[0].Equal(list[1]) {
|
|
t.Fatalf("Interface.Equal() returned false positive")
|
|
}
|
|
|
|
if list[0].Equal(list[1]) != list[1].Equal(list[0]) {
|
|
t.Fatalf("Interface.Equal() failed commutative check")
|
|
}
|
|
}
|
|
|
|
func TestSandboxInfoEqual(t *testing.T) {
|
|
si1 := &Info{Interfaces: getInterfaceList(), Gateway: net.ParseIP("192.168.1.254"), GatewayIPv6: net.ParseIP("2001:2345::abcd:8889")}
|
|
si2 := &Info{Interfaces: getInterfaceList(), Gateway: net.ParseIP("172.18.255.254"), GatewayIPv6: net.ParseIP("2001:2345::abcd:8888")}
|
|
|
|
if !si1.Equal(si1) {
|
|
t.Fatalf("Info.Equal() returned false negative")
|
|
}
|
|
|
|
if si1.Equal(si2) {
|
|
t.Fatalf("Info.Equal() returned false positive")
|
|
}
|
|
|
|
if si1.Equal(si2) != si2.Equal(si1) {
|
|
t.Fatalf("Info.Equal() failed commutative check")
|
|
}
|
|
}
|
|
|
|
func TestInterfaceCopy(t *testing.T) {
|
|
for _, iface := range getInterfaceList() {
|
|
cp := iface.GetCopy()
|
|
|
|
if !iface.Equal(cp) {
|
|
t.Fatalf("Failed to return a copy of Interface")
|
|
}
|
|
|
|
if iface == cp {
|
|
t.Fatalf("Failed to return a true copy of Interface")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSandboxInfoCopy(t *testing.T) {
|
|
si := Info{Interfaces: getInterfaceList(), Gateway: net.ParseIP("192.168.1.254"), GatewayIPv6: net.ParseIP("2001:2345::abcd:8889")}
|
|
cp := si.GetCopy()
|
|
|
|
if !si.Equal(cp) {
|
|
t.Fatalf("Failed to return a copy of Info")
|
|
}
|
|
|
|
if &si == cp {
|
|
t.Fatalf("Failed to return a true copy of Info")
|
|
}
|
|
}
|
|
|
|
func getInterfaceList() []*Interface {
|
|
_, netv4a, _ := net.ParseCIDR("192.168.30.1/24")
|
|
_, netv4b, _ := net.ParseCIDR("172.18.255.2/23")
|
|
_, netv6a, _ := net.ParseCIDR("2001:2345::abcd:8888/80")
|
|
_, netv6b, _ := net.ParseCIDR("2001:2345::abcd:8889/80")
|
|
|
|
return []*Interface{
|
|
&Interface{
|
|
SrcName: "veth1234567",
|
|
DstName: "eth0",
|
|
Address: netv4a,
|
|
AddressIPv6: netv6a,
|
|
Routes: []*net.IPNet{netv4a, netv6a},
|
|
},
|
|
&Interface{
|
|
SrcName: "veth7654321",
|
|
DstName: "eth1",
|
|
Address: netv4b,
|
|
AddressIPv6: netv6b,
|
|
Routes: []*net.IPNet{netv4b, netv6b},
|
|
},
|
|
}
|
|
}
|