github.com/rawahars/moby@v24.0.4+incompatible/libnetwork/drivers/bridge/network_test.go (about)

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