github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drivers/bridge/network_linux_test.go (about) 1 package bridge 2 3 import ( 4 "testing" 5 6 "github.com/Prakhar-Agarwal-byte/moby/internal/testutils/netnsutils" 7 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/driverapi" 8 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/netlabel" 9 "github.com/vishvananda/netlink" 10 ) 11 12 func TestLinkCreate(t *testing.T) { 13 defer netnsutils.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 netnsutils.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 } 119 genericOption := make(map[string]interface{}) 120 genericOption[netlabel.GenericData] = config 121 122 ipdList := getIPv4Data(t) 123 err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil) 124 if err != nil { 125 t.Fatalf("Failed to create bridge: %v", err) 126 } 127 128 te1 := newTestEndpoint(ipdList[0].Pool, 11) 129 err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil) 130 if err != nil { 131 t.Fatalf("Failed to create a link: %s", err.Error()) 132 } 133 134 te2 := newTestEndpoint(ipdList[0].Pool, 12) 135 err = d.CreateEndpoint("dummy", "ep", te2.Interface(), nil) 136 if err != nil { 137 if _, ok := err.(driverapi.ErrEndpointExists); !ok { 138 t.Fatalf("Failed with a wrong error: %s", err.Error()) 139 } 140 } else { 141 t.Fatal("Expected to fail while trying to add same endpoint twice") 142 } 143 } 144 145 func TestLinkCreateNoEnableIPv6(t *testing.T) { 146 defer netnsutils.SetupTestOSContext(t)() 147 d := newDriver() 148 149 if err := d.configure(nil); err != nil { 150 t.Fatalf("Failed to setup driver config: %v", err) 151 } 152 153 config := &networkConfiguration{ 154 BridgeName: DefaultBridgeName, 155 } 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 netnsutils.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 } 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 }