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