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 }