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 }