github.com/jfrazelle/docker@v1.1.2-0.20210712172922-bf78e25fe508/libnetwork/drivers/bridge/network_test.go (about)

     1  // +build linux
     2  
     3  package bridge
     4  
     5  import (
     6  	"testing"
     7  
     8  	"github.com/docker/docker/libnetwork/driverapi"
     9  	"github.com/docker/docker/libnetwork/netlabel"
    10  	"github.com/docker/docker/libnetwork/testutils"
    11  	"github.com/vishvananda/netlink"
    12  )
    13  
    14  func TestLinkCreate(t *testing.T) {
    15  	defer testutils.SetupTestOSContext(t)()
    16  	d := newDriver()
    17  
    18  	if err := d.configure(nil); err != nil {
    19  		t.Fatalf("Failed to setup driver config: %v", err)
    20  	}
    21  
    22  	mtu := 1490
    23  	config := &networkConfiguration{
    24  		BridgeName: DefaultBridgeName,
    25  		Mtu:        mtu,
    26  		EnableIPv6: true,
    27  	}
    28  	genericOption := make(map[string]interface{})
    29  	genericOption[netlabel.GenericData] = config
    30  
    31  	ipdList := getIPv4Data(t, "")
    32  	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
    33  	if err != nil {
    34  		t.Fatalf("Failed to create bridge: %v", err)
    35  	}
    36  
    37  	te := newTestEndpoint(ipdList[0].Pool, 10)
    38  	err = d.CreateEndpoint("dummy", "", te.Interface(), nil)
    39  	if err != nil {
    40  		if _, ok := err.(InvalidEndpointIDError); !ok {
    41  			t.Fatalf("Failed with a wrong error :%s", err.Error())
    42  		}
    43  	} else {
    44  		t.Fatal("Failed to detect invalid config")
    45  	}
    46  
    47  	// Good endpoint creation
    48  	err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
    49  	if err != nil {
    50  		t.Fatalf("Failed to create a link: %s", err.Error())
    51  	}
    52  
    53  	err = d.Join("dummy", "ep", "sbox", te, nil)
    54  	if err != nil {
    55  		t.Fatalf("Failed to create a link: %s", err.Error())
    56  	}
    57  
    58  	// Verify sbox endpoint interface inherited MTU value from bridge config
    59  	sboxLnk, err := netlink.LinkByName(te.iface.srcName)
    60  	if err != nil {
    61  		t.Fatal(err)
    62  	}
    63  	if mtu != sboxLnk.Attrs().MTU {
    64  		t.Fatal("Sandbox endpoint interface did not inherit bridge interface MTU config")
    65  	}
    66  	// TODO: if we could get peer name from (sboxLnk.(*netlink.Veth)).PeerName
    67  	// then we could check the MTU on hostLnk as well.
    68  
    69  	te1 := newTestEndpoint(ipdList[0].Pool, 11)
    70  	err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
    71  	if err == nil {
    72  		t.Fatal("Failed to detect duplicate endpoint id on same network")
    73  	}
    74  
    75  	if te.iface.dstName == "" {
    76  		t.Fatal("Invalid Dstname returned")
    77  	}
    78  
    79  	_, err = netlink.LinkByName(te.iface.srcName)
    80  	if err != nil {
    81  		t.Fatalf("Could not find source link %s: %v", te.iface.srcName, err)
    82  	}
    83  
    84  	n, ok := d.networks["dummy"]
    85  	if !ok {
    86  		t.Fatalf("Cannot find network %s inside driver", "dummy")
    87  	}
    88  	ip := te.iface.addr.IP
    89  	if !n.bridge.bridgeIPv4.Contains(ip) {
    90  		t.Fatalf("IP %s is not a valid ip in the subnet %s", ip.String(), n.bridge.bridgeIPv4.String())
    91  	}
    92  
    93  	ip6 := te.iface.addrv6.IP
    94  	if !n.bridge.bridgeIPv6.Contains(ip6) {
    95  		t.Fatalf("IP %s is not a valid ip in the subnet %s", ip6.String(), bridgeIPv6.String())
    96  	}
    97  
    98  	if !te.gw.Equal(n.bridge.bridgeIPv4.IP) {
    99  		t.Fatalf("Invalid default gateway. Expected %s. Got %s", n.bridge.bridgeIPv4.IP.String(),
   100  			te.gw.String())
   101  	}
   102  
   103  	if !te.gw6.Equal(n.bridge.bridgeIPv6.IP) {
   104  		t.Fatalf("Invalid default gateway for IPv6. Expected %s. Got %s", n.bridge.bridgeIPv6.IP.String(),
   105  			te.gw6.String())
   106  	}
   107  }
   108  
   109  func TestLinkCreateTwo(t *testing.T) {
   110  	defer testutils.SetupTestOSContext(t)()
   111  	d := newDriver()
   112  
   113  	if err := d.configure(nil); err != nil {
   114  		t.Fatalf("Failed to setup driver config: %v", err)
   115  	}
   116  
   117  	config := &networkConfiguration{
   118  		BridgeName: DefaultBridgeName,
   119  		EnableIPv6: true}
   120  	genericOption := make(map[string]interface{})
   121  	genericOption[netlabel.GenericData] = config
   122  
   123  	ipdList := getIPv4Data(t, "")
   124  	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
   125  	if err != nil {
   126  		t.Fatalf("Failed to create bridge: %v", err)
   127  	}
   128  
   129  	te1 := newTestEndpoint(ipdList[0].Pool, 11)
   130  	err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
   131  	if err != nil {
   132  		t.Fatalf("Failed to create a link: %s", err.Error())
   133  	}
   134  
   135  	te2 := newTestEndpoint(ipdList[0].Pool, 12)
   136  	err = d.CreateEndpoint("dummy", "ep", te2.Interface(), nil)
   137  	if err != nil {
   138  		if _, ok := err.(driverapi.ErrEndpointExists); !ok {
   139  			t.Fatalf("Failed with a wrong error: %s", err.Error())
   140  		}
   141  	} else {
   142  		t.Fatal("Expected to fail while trying to add same endpoint twice")
   143  	}
   144  }
   145  
   146  func TestLinkCreateNoEnableIPv6(t *testing.T) {
   147  	defer testutils.SetupTestOSContext(t)()
   148  	d := newDriver()
   149  
   150  	if err := d.configure(nil); err != nil {
   151  		t.Fatalf("Failed to setup driver config: %v", err)
   152  	}
   153  
   154  	config := &networkConfiguration{
   155  		BridgeName: DefaultBridgeName}
   156  	genericOption := make(map[string]interface{})
   157  	genericOption[netlabel.GenericData] = config
   158  
   159  	ipdList := getIPv4Data(t, "")
   160  	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
   161  	if err != nil {
   162  		t.Fatalf("Failed to create bridge: %v", err)
   163  	}
   164  	te := newTestEndpoint(ipdList[0].Pool, 30)
   165  	err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
   166  	if err != nil {
   167  		t.Fatalf("Failed to create a link: %s", err.Error())
   168  	}
   169  
   170  	iface := te.iface
   171  	if iface.addrv6 != nil && iface.addrv6.IP.To16() != nil {
   172  		t.Fatalf("Expected IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", iface.addrv6.String())
   173  	}
   174  
   175  	if te.gw6.To16() != nil {
   176  		t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", te.gw6.String())
   177  	}
   178  }
   179  
   180  func TestLinkDelete(t *testing.T) {
   181  	defer testutils.SetupTestOSContext(t)()
   182  	d := newDriver()
   183  
   184  	if err := d.configure(nil); err != nil {
   185  		t.Fatalf("Failed to setup driver config: %v", err)
   186  	}
   187  
   188  	config := &networkConfiguration{
   189  		BridgeName: DefaultBridgeName,
   190  		EnableIPv6: true}
   191  	genericOption := make(map[string]interface{})
   192  	genericOption[netlabel.GenericData] = config
   193  
   194  	ipdList := getIPv4Data(t, "")
   195  	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
   196  	if err != nil {
   197  		t.Fatalf("Failed to create bridge: %v", err)
   198  	}
   199  
   200  	te := newTestEndpoint(ipdList[0].Pool, 30)
   201  	err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
   202  	if err != nil {
   203  		t.Fatalf("Failed to create a link: %s", err.Error())
   204  	}
   205  
   206  	err = d.DeleteEndpoint("dummy", "")
   207  	if err != nil {
   208  		if _, ok := err.(InvalidEndpointIDError); !ok {
   209  			t.Fatalf("Failed with a wrong error :%s", err.Error())
   210  		}
   211  	} else {
   212  		t.Fatal("Failed to detect invalid config")
   213  	}
   214  
   215  	err = d.DeleteEndpoint("dummy", "ep1")
   216  	if err != nil {
   217  		t.Fatal(err)
   218  	}
   219  }