bridge_test.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. package bridge
  2. import (
  3. "bytes"
  4. "fmt"
  5. "net"
  6. "regexp"
  7. "testing"
  8. "github.com/docker/libnetwork/driverapi"
  9. "github.com/docker/libnetwork/ipamutils"
  10. "github.com/docker/libnetwork/iptables"
  11. "github.com/docker/libnetwork/netlabel"
  12. "github.com/docker/libnetwork/testutils"
  13. "github.com/docker/libnetwork/types"
  14. "github.com/vishvananda/netlink"
  15. )
  16. func getIPv4Data(t *testing.T) []driverapi.IPAMData {
  17. ipd := driverapi.IPAMData{AddressSpace: "full"}
  18. nw, _, err := ipamutils.ElectInterfaceAddresses("")
  19. if err != nil {
  20. t.Fatal(err)
  21. }
  22. ipd.Pool = nw
  23. // Set network gateway to X.X.X.1
  24. ipd.Gateway = types.GetIPNetCopy(nw)
  25. ipd.Gateway.IP[len(ipd.Gateway.IP)-1] = 1
  26. return []driverapi.IPAMData{ipd}
  27. }
  28. func TestCreateFullOptions(t *testing.T) {
  29. defer testutils.SetupTestOSContext(t)()
  30. d := newDriver()
  31. config := &configuration{
  32. EnableIPForwarding: true,
  33. EnableIPTables: true,
  34. }
  35. // Test this scenario: Default gw address does not belong to
  36. // container network and it's greater than bridge address
  37. cnw, _ := types.ParseCIDR("172.16.122.0/24")
  38. bnw, _ := types.ParseCIDR("172.16.0.0/24")
  39. br, _ := types.ParseCIDR("172.16.0.1/16")
  40. defgw, _ := types.ParseCIDR("172.16.0.100/16")
  41. netConfig := &networkConfiguration{
  42. BridgeName: DefaultBridgeName,
  43. EnableIPv6: true,
  44. }
  45. genericOption := make(map[string]interface{})
  46. genericOption[netlabel.GenericData] = config
  47. if err := d.configure(genericOption); err != nil {
  48. t.Fatalf("Failed to setup driver config: %v", err)
  49. }
  50. netOption := make(map[string]interface{})
  51. netOption[netlabel.GenericData] = netConfig
  52. ipdList := []driverapi.IPAMData{
  53. driverapi.IPAMData{
  54. Pool: bnw,
  55. Gateway: br,
  56. AuxAddresses: map[string]*net.IPNet{DefaultGatewayV4AuxKey: defgw},
  57. },
  58. }
  59. err := d.CreateNetwork("dummy", netOption, ipdList, nil)
  60. if err != nil {
  61. t.Fatalf("Failed to create bridge: %v", err)
  62. }
  63. // Verify the IP address allocated for the endpoint belongs to the container network
  64. epOptions := make(map[string]interface{})
  65. te := newTestEndpoint(cnw, 10)
  66. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions)
  67. if err != nil {
  68. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  69. }
  70. if !cnw.Contains(te.Interface().Address().IP) {
  71. t.Fatalf("endpoint got assigned address outside of container network(%s): %s", cnw.String(), te.Interface().Address())
  72. }
  73. }
  74. func TestCreateNoConfig(t *testing.T) {
  75. defer testutils.SetupTestOSContext(t)()
  76. d := newDriver()
  77. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  78. genericOption := make(map[string]interface{})
  79. genericOption[netlabel.GenericData] = netconfig
  80. if err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil); err != nil {
  81. t.Fatalf("Failed to create bridge: %v", err)
  82. }
  83. }
  84. func TestCreateFullOptionsLabels(t *testing.T) {
  85. defer testutils.SetupTestOSContext(t)()
  86. d := newDriver()
  87. config := &configuration{
  88. EnableIPForwarding: true,
  89. }
  90. genericOption := make(map[string]interface{})
  91. genericOption[netlabel.GenericData] = config
  92. if err := d.configure(genericOption); err != nil {
  93. t.Fatalf("Failed to setup driver config: %v", err)
  94. }
  95. bndIPs := "127.0.0.1"
  96. nwV6s := "2100:2400:2600:2700:2800::/80"
  97. gwV6s := "2100:2400:2600:2700:2800::25/80"
  98. nwV6, _ := types.ParseCIDR(nwV6s)
  99. gwV6, _ := types.ParseCIDR(gwV6s)
  100. labels := map[string]string{
  101. BridgeName: DefaultBridgeName,
  102. DefaultBridge: "true",
  103. netlabel.EnableIPv6: "true",
  104. EnableICC: "true",
  105. EnableIPMasquerade: "true",
  106. DefaultBindingIP: bndIPs,
  107. }
  108. netOption := make(map[string]interface{})
  109. netOption[netlabel.GenericData] = labels
  110. ipdList := getIPv4Data(t)
  111. ipd6List := []driverapi.IPAMData{
  112. driverapi.IPAMData{
  113. Pool: nwV6,
  114. AuxAddresses: map[string]*net.IPNet{
  115. DefaultGatewayV6AuxKey: gwV6,
  116. },
  117. },
  118. }
  119. err := d.CreateNetwork("dummy", netOption, ipdList, ipd6List)
  120. if err != nil {
  121. t.Fatalf("Failed to create bridge: %v", err)
  122. }
  123. nw, ok := d.networks["dummy"]
  124. if !ok {
  125. t.Fatalf("Cannot find dummy network in bridge driver")
  126. }
  127. if nw.config.BridgeName != DefaultBridgeName {
  128. t.Fatalf("incongruent name in bridge network")
  129. }
  130. if !nw.config.EnableIPv6 {
  131. t.Fatalf("incongruent EnableIPv6 in bridge network")
  132. }
  133. if !nw.config.EnableICC {
  134. t.Fatalf("incongruent EnableICC in bridge network")
  135. }
  136. if !nw.config.EnableIPMasquerade {
  137. t.Fatalf("incongruent EnableIPMasquerade in bridge network")
  138. }
  139. bndIP := net.ParseIP(bndIPs)
  140. if !bndIP.Equal(nw.config.DefaultBindingIP) {
  141. t.Fatalf("Unexpected: %v", nw.config.DefaultBindingIP)
  142. }
  143. if !types.CompareIPNet(nw.config.AddressIPv6, nwV6) {
  144. t.Fatalf("Unexpected: %v", nw.config.AddressIPv6)
  145. }
  146. if !gwV6.IP.Equal(nw.config.DefaultGatewayIPv6) {
  147. t.Fatalf("Unexpected: %v", nw.config.DefaultGatewayIPv6)
  148. }
  149. // In short here we are testing --fixed-cidr-v6 daemon option
  150. // plus --mac-address run option
  151. mac, _ := net.ParseMAC("aa:bb:cc:dd:ee:ff")
  152. epOptions := map[string]interface{}{netlabel.MacAddress: mac}
  153. te := newTestEndpoint(ipdList[0].Pool, 20)
  154. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions)
  155. if err != nil {
  156. t.Fatal(err)
  157. }
  158. if !nwV6.Contains(te.Interface().AddressIPv6().IP) {
  159. t.Fatalf("endpoint got assigned address outside of container network(%s): %s", nwV6.String(), te.Interface().AddressIPv6())
  160. }
  161. if te.Interface().AddressIPv6().IP.String() != "2100:2400:2600:2700:2800:aabb:ccdd:eeff" {
  162. t.Fatalf("Unexpected endpoint IPv6 address: %v", te.Interface().AddressIPv6().IP)
  163. }
  164. }
  165. func TestCreate(t *testing.T) {
  166. defer testutils.SetupTestOSContext(t)()
  167. d := newDriver()
  168. if err := d.configure(nil); err != nil {
  169. t.Fatalf("Failed to setup driver config: %v", err)
  170. }
  171. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  172. genericOption := make(map[string]interface{})
  173. genericOption[netlabel.GenericData] = netconfig
  174. if err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil); err != nil {
  175. t.Fatalf("Failed to create bridge: %v", err)
  176. }
  177. err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil)
  178. if err == nil {
  179. t.Fatalf("Expected bridge driver to refuse creation of second network with default name")
  180. }
  181. if _, ok := err.(types.ForbiddenError); !ok {
  182. t.Fatalf("Creation of second network with default name failed with unexpected error type")
  183. }
  184. }
  185. func TestCreateFail(t *testing.T) {
  186. defer testutils.SetupTestOSContext(t)()
  187. d := newDriver()
  188. if err := d.configure(nil); err != nil {
  189. t.Fatalf("Failed to setup driver config: %v", err)
  190. }
  191. netconfig := &networkConfiguration{BridgeName: "dummy0", DefaultBridge: true}
  192. genericOption := make(map[string]interface{})
  193. genericOption[netlabel.GenericData] = netconfig
  194. if err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil); err == nil {
  195. t.Fatal("Bridge creation was expected to fail")
  196. }
  197. }
  198. func TestCreateMultipleNetworks(t *testing.T) {
  199. defer testutils.SetupTestOSContext(t)()
  200. d := newDriver()
  201. config := &configuration{
  202. EnableIPTables: true,
  203. }
  204. genericOption := make(map[string]interface{})
  205. genericOption[netlabel.GenericData] = config
  206. if err := d.configure(genericOption); err != nil {
  207. t.Fatalf("Failed to setup driver config: %v", err)
  208. }
  209. config1 := &networkConfiguration{BridgeName: "net_test_1"}
  210. genericOption = make(map[string]interface{})
  211. genericOption[netlabel.GenericData] = config1
  212. if err := d.CreateNetwork("1", genericOption, getIPv4Data(t), nil); err != nil {
  213. t.Fatalf("Failed to create bridge: %v", err)
  214. }
  215. config2 := &networkConfiguration{BridgeName: "net_test_2"}
  216. genericOption[netlabel.GenericData] = config2
  217. if err := d.CreateNetwork("2", genericOption, getIPv4Data(t), nil); err != nil {
  218. t.Fatalf("Failed to create bridge: %v", err)
  219. }
  220. // Verify the network isolation rules are installed, each network subnet should appear 2 times
  221. verifyV4INCEntries(d.networks, 2, t)
  222. config3 := &networkConfiguration{BridgeName: "net_test_3"}
  223. genericOption[netlabel.GenericData] = config3
  224. if err := d.CreateNetwork("3", genericOption, getIPv4Data(t), nil); err != nil {
  225. t.Fatalf("Failed to create bridge: %v", err)
  226. }
  227. // Verify the network isolation rules are installed, each network subnet should appear 4 times
  228. verifyV4INCEntries(d.networks, 4, t)
  229. config4 := &networkConfiguration{BridgeName: "net_test_4"}
  230. genericOption[netlabel.GenericData] = config4
  231. if err := d.CreateNetwork("4", genericOption, getIPv4Data(t), nil); err != nil {
  232. t.Fatalf("Failed to create bridge: %v", err)
  233. }
  234. // Now 6 times
  235. verifyV4INCEntries(d.networks, 6, t)
  236. d.DeleteNetwork("1")
  237. verifyV4INCEntries(d.networks, 4, t)
  238. d.DeleteNetwork("2")
  239. verifyV4INCEntries(d.networks, 2, t)
  240. d.DeleteNetwork("3")
  241. verifyV4INCEntries(d.networks, 0, t)
  242. d.DeleteNetwork("4")
  243. verifyV4INCEntries(d.networks, 0, t)
  244. }
  245. func verifyV4INCEntries(networks map[string]*bridgeNetwork, numEntries int, t *testing.T) {
  246. out, err := iptables.Raw("-L", "FORWARD")
  247. if err != nil {
  248. t.Fatal(err)
  249. }
  250. for _, nw := range networks {
  251. nt := types.GetIPNetCopy(nw.bridge.bridgeIPv4)
  252. nt.IP = nt.IP.Mask(nt.Mask)
  253. re := regexp.MustCompile(nt.String())
  254. matches := re.FindAllString(string(out[:]), -1)
  255. if len(matches) != numEntries {
  256. t.Fatalf("Cannot find expected inter-network isolation rules in IP Tables:\n%s", string(out[:]))
  257. }
  258. }
  259. }
  260. type testInterface struct {
  261. mac net.HardwareAddr
  262. addr *net.IPNet
  263. addrv6 *net.IPNet
  264. srcName string
  265. dstName string
  266. }
  267. type testEndpoint struct {
  268. iface *testInterface
  269. gw net.IP
  270. gw6 net.IP
  271. hostsPath string
  272. resolvConfPath string
  273. routes []types.StaticRoute
  274. }
  275. func newTestEndpoint(nw *net.IPNet, ordinal byte) *testEndpoint {
  276. addr := types.GetIPNetCopy(nw)
  277. addr.IP[len(addr.IP)-1] = ordinal
  278. return &testEndpoint{iface: &testInterface{addr: addr}}
  279. }
  280. func (te *testEndpoint) Interface() driverapi.InterfaceInfo {
  281. if te.iface != nil {
  282. return te.iface
  283. }
  284. return nil
  285. }
  286. func (i *testInterface) MacAddress() net.HardwareAddr {
  287. return i.mac
  288. }
  289. func (i *testInterface) Address() *net.IPNet {
  290. return i.addr
  291. }
  292. func (i *testInterface) AddressIPv6() *net.IPNet {
  293. return i.addrv6
  294. }
  295. func (i *testInterface) SetMacAddress(mac net.HardwareAddr) error {
  296. if i.mac != nil {
  297. return types.ForbiddenErrorf("endpoint interface MAC address present (%s). Cannot be modified with %s.", i.mac, mac)
  298. }
  299. if mac == nil {
  300. return types.BadRequestErrorf("tried to set nil MAC address to endpoint interface")
  301. }
  302. i.mac = types.GetMacCopy(mac)
  303. return nil
  304. }
  305. func (i *testInterface) SetIPAddress(address *net.IPNet) error {
  306. if address.IP == nil {
  307. return types.BadRequestErrorf("tried to set nil IP address to endpoint interface")
  308. }
  309. if address.IP.To4() == nil {
  310. return setAddress(&i.addrv6, address)
  311. }
  312. return setAddress(&i.addr, address)
  313. }
  314. func setAddress(ifaceAddr **net.IPNet, address *net.IPNet) error {
  315. if *ifaceAddr != nil {
  316. return types.ForbiddenErrorf("endpoint interface IP present (%s). Cannot be modified with (%s).", *ifaceAddr, address)
  317. }
  318. *ifaceAddr = types.GetIPNetCopy(address)
  319. return nil
  320. }
  321. func (i *testInterface) SetNames(srcName string, dstName string) error {
  322. i.srcName = srcName
  323. i.dstName = dstName
  324. return nil
  325. }
  326. func (te *testEndpoint) InterfaceName() driverapi.InterfaceNameInfo {
  327. if te.iface != nil {
  328. return te.iface
  329. }
  330. return nil
  331. }
  332. func (te *testEndpoint) SetGateway(gw net.IP) error {
  333. te.gw = gw
  334. return nil
  335. }
  336. func (te *testEndpoint) SetGatewayIPv6(gw6 net.IP) error {
  337. te.gw6 = gw6
  338. return nil
  339. }
  340. func (te *testEndpoint) AddStaticRoute(destination *net.IPNet, routeType int, nextHop net.IP) error {
  341. te.routes = append(te.routes, types.StaticRoute{Destination: destination, RouteType: routeType, NextHop: nextHop})
  342. return nil
  343. }
  344. func (te *testEndpoint) DisableGatewayService() {}
  345. func TestQueryEndpointInfo(t *testing.T) {
  346. testQueryEndpointInfo(t, true)
  347. }
  348. func TestQueryEndpointInfoHairpin(t *testing.T) {
  349. testQueryEndpointInfo(t, false)
  350. }
  351. func testQueryEndpointInfo(t *testing.T, ulPxyEnabled bool) {
  352. defer testutils.SetupTestOSContext(t)()
  353. d := newDriver()
  354. config := &configuration{
  355. EnableIPTables: true,
  356. EnableUserlandProxy: ulPxyEnabled,
  357. }
  358. genericOption := make(map[string]interface{})
  359. genericOption[netlabel.GenericData] = config
  360. if err := d.configure(genericOption); err != nil {
  361. t.Fatalf("Failed to setup driver config: %v", err)
  362. }
  363. netconfig := &networkConfiguration{
  364. BridgeName: DefaultBridgeName,
  365. EnableICC: false,
  366. }
  367. genericOption = make(map[string]interface{})
  368. genericOption[netlabel.GenericData] = netconfig
  369. ipdList := getIPv4Data(t)
  370. err := d.CreateNetwork("net1", genericOption, ipdList, nil)
  371. if err != nil {
  372. t.Fatalf("Failed to create bridge: %v", err)
  373. }
  374. portMappings := getPortMapping()
  375. epOptions := make(map[string]interface{})
  376. epOptions[netlabel.PortMap] = portMappings
  377. te := newTestEndpoint(ipdList[0].Pool, 11)
  378. err = d.CreateEndpoint("net1", "ep1", te.Interface(), epOptions)
  379. if err != nil {
  380. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  381. }
  382. network, ok := d.networks["net1"]
  383. if !ok {
  384. t.Fatalf("Cannot find network %s inside driver", "net1")
  385. }
  386. ep, _ := network.endpoints["ep1"]
  387. data, err := d.EndpointOperInfo(network.id, ep.id)
  388. if err != nil {
  389. t.Fatalf("Failed to ask for endpoint operational data: %v", err)
  390. }
  391. pmd, ok := data[netlabel.PortMap]
  392. if !ok {
  393. t.Fatalf("Endpoint operational data does not contain port mapping data")
  394. }
  395. pm, ok := pmd.([]types.PortBinding)
  396. if !ok {
  397. t.Fatalf("Unexpected format for port mapping in endpoint operational data")
  398. }
  399. if len(ep.portMapping) != len(pm) {
  400. t.Fatalf("Incomplete data for port mapping in endpoint operational data")
  401. }
  402. for i, pb := range ep.portMapping {
  403. if !pb.Equal(&pm[i]) {
  404. t.Fatalf("Unexpected data for port mapping in endpoint operational data")
  405. }
  406. }
  407. // Cleanup as host ports are there
  408. err = network.releasePorts(ep)
  409. if err != nil {
  410. t.Fatalf("Failed to release mapped ports: %v", err)
  411. }
  412. }
  413. func TestCreateLinkWithOptions(t *testing.T) {
  414. defer testutils.SetupTestOSContext(t)()
  415. d := newDriver()
  416. if err := d.configure(nil); err != nil {
  417. t.Fatalf("Failed to setup driver config: %v", err)
  418. }
  419. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  420. netOptions := make(map[string]interface{})
  421. netOptions[netlabel.GenericData] = netconfig
  422. ipdList := getIPv4Data(t)
  423. err := d.CreateNetwork("net1", netOptions, ipdList, nil)
  424. if err != nil {
  425. t.Fatalf("Failed to create bridge: %v", err)
  426. }
  427. mac := net.HardwareAddr([]byte{0x1e, 0x67, 0x66, 0x44, 0x55, 0x66})
  428. epOptions := make(map[string]interface{})
  429. epOptions[netlabel.MacAddress] = mac
  430. te := newTestEndpoint(ipdList[0].Pool, 11)
  431. err = d.CreateEndpoint("net1", "ep", te.Interface(), epOptions)
  432. if err != nil {
  433. t.Fatalf("Failed to create an endpoint: %s", err.Error())
  434. }
  435. err = d.Join("net1", "ep", "sbox", te, nil)
  436. if err != nil {
  437. t.Fatalf("Failed to join the endpoint: %v", err)
  438. }
  439. ifaceName := te.iface.srcName
  440. veth, err := netlink.LinkByName(ifaceName)
  441. if err != nil {
  442. t.Fatal(err)
  443. }
  444. if !bytes.Equal(mac, veth.Attrs().HardwareAddr) {
  445. t.Fatalf("Failed to parse and program endpoint configuration")
  446. }
  447. }
  448. func getExposedPorts() []types.TransportPort {
  449. return []types.TransportPort{
  450. types.TransportPort{Proto: types.TCP, Port: uint16(5000)},
  451. types.TransportPort{Proto: types.UDP, Port: uint16(400)},
  452. types.TransportPort{Proto: types.TCP, Port: uint16(600)},
  453. }
  454. }
  455. func getPortMapping() []types.PortBinding {
  456. return []types.PortBinding{
  457. types.PortBinding{Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  458. types.PortBinding{Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  459. types.PortBinding{Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  460. }
  461. }
  462. func TestLinkContainers(t *testing.T) {
  463. defer testutils.SetupTestOSContext(t)()
  464. d := newDriver()
  465. config := &configuration{
  466. EnableIPTables: true,
  467. }
  468. genericOption := make(map[string]interface{})
  469. genericOption[netlabel.GenericData] = config
  470. if err := d.configure(genericOption); err != nil {
  471. t.Fatalf("Failed to setup driver config: %v", err)
  472. }
  473. netconfig := &networkConfiguration{
  474. BridgeName: DefaultBridgeName,
  475. EnableICC: false,
  476. }
  477. genericOption = make(map[string]interface{})
  478. genericOption[netlabel.GenericData] = netconfig
  479. ipdList := getIPv4Data(t)
  480. err := d.CreateNetwork("net1", genericOption, ipdList, nil)
  481. if err != nil {
  482. t.Fatalf("Failed to create bridge: %v", err)
  483. }
  484. exposedPorts := getExposedPorts()
  485. epOptions := make(map[string]interface{})
  486. epOptions[netlabel.ExposedPorts] = exposedPorts
  487. te1 := newTestEndpoint(ipdList[0].Pool, 11)
  488. err = d.CreateEndpoint("net1", "ep1", te1.Interface(), epOptions)
  489. if err != nil {
  490. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  491. }
  492. addr1 := te1.iface.addr
  493. if addr1.IP.To4() == nil {
  494. t.Fatalf("No Ipv4 address assigned to the endpoint: ep1")
  495. }
  496. te2 := newTestEndpoint(ipdList[0].Pool, 22)
  497. err = d.CreateEndpoint("net1", "ep2", te2.Interface(), nil)
  498. if err != nil {
  499. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  500. }
  501. addr2 := te2.iface.addr
  502. if addr2.IP.To4() == nil {
  503. t.Fatalf("No Ipv4 address assigned to the endpoint: ep2")
  504. }
  505. ce := []string{"ep1"}
  506. cConfig := &containerConfiguration{ChildEndpoints: ce}
  507. genericOption = make(map[string]interface{})
  508. genericOption[netlabel.GenericData] = cConfig
  509. err = d.Join("net1", "ep2", "", te2, genericOption)
  510. if err != nil {
  511. t.Fatalf("Failed to link ep1 and ep2")
  512. }
  513. out, err := iptables.Raw("-L", DockerChain)
  514. for _, pm := range exposedPorts {
  515. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  516. re := regexp.MustCompile(regex)
  517. matches := re.FindAllString(string(out[:]), -1)
  518. if len(matches) != 1 {
  519. t.Fatalf("IP Tables programming failed %s", string(out[:]))
  520. }
  521. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  522. matched, _ := regexp.MatchString(regex, string(out[:]))
  523. if !matched {
  524. t.Fatalf("IP Tables programming failed %s", string(out[:]))
  525. }
  526. }
  527. err = d.Leave("net1", "ep2")
  528. if err != nil {
  529. t.Fatalf("Failed to unlink ep1 and ep2")
  530. }
  531. out, err = iptables.Raw("-L", DockerChain)
  532. for _, pm := range exposedPorts {
  533. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  534. re := regexp.MustCompile(regex)
  535. matches := re.FindAllString(string(out[:]), -1)
  536. if len(matches) != 0 {
  537. t.Fatalf("Leave should have deleted relevant IPTables rules %s", string(out[:]))
  538. }
  539. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  540. matched, _ := regexp.MatchString(regex, string(out[:]))
  541. if matched {
  542. t.Fatalf("Leave should have deleted relevant IPTables rules %s", string(out[:]))
  543. }
  544. }
  545. // Error condition test with an invalid endpoint-id "ep4"
  546. ce = []string{"ep1", "ep4"}
  547. cConfig = &containerConfiguration{ChildEndpoints: ce}
  548. genericOption = make(map[string]interface{})
  549. genericOption[netlabel.GenericData] = cConfig
  550. err = d.Join("net1", "ep2", "", te2, genericOption)
  551. if err != nil {
  552. out, err = iptables.Raw("-L", DockerChain)
  553. for _, pm := range exposedPorts {
  554. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  555. re := regexp.MustCompile(regex)
  556. matches := re.FindAllString(string(out[:]), -1)
  557. if len(matches) != 0 {
  558. t.Fatalf("Error handling should rollback relevant IPTables rules %s", string(out[:]))
  559. }
  560. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  561. matched, _ := regexp.MatchString(regex, string(out[:]))
  562. if matched {
  563. t.Fatalf("Error handling should rollback relevant IPTables rules %s", string(out[:]))
  564. }
  565. }
  566. } else {
  567. t.Fatalf("Expected Join to fail given link conditions are not satisfied")
  568. }
  569. }
  570. func TestValidateConfig(t *testing.T) {
  571. // Test mtu
  572. c := networkConfiguration{Mtu: -2}
  573. err := c.Validate()
  574. if err == nil {
  575. t.Fatalf("Failed to detect invalid MTU number")
  576. }
  577. c.Mtu = 9000
  578. err = c.Validate()
  579. if err != nil {
  580. t.Fatalf("unexpected validation error on MTU number")
  581. }
  582. // Bridge network
  583. _, network, _ := net.ParseCIDR("172.28.0.0/16")
  584. c = networkConfiguration{
  585. AddressIPv4: network,
  586. }
  587. err = c.Validate()
  588. if err != nil {
  589. t.Fatal(err)
  590. }
  591. // Test v4 gw
  592. c.DefaultGatewayIPv4 = net.ParseIP("172.27.30.234")
  593. err = c.Validate()
  594. if err == nil {
  595. t.Fatalf("Failed to detect invalid default gateway")
  596. }
  597. c.DefaultGatewayIPv4 = net.ParseIP("172.28.30.234")
  598. err = c.Validate()
  599. if err != nil {
  600. t.Fatalf("Unexpected validation error on default gateway")
  601. }
  602. // Test v6 gw
  603. _, v6nw, _ := net.ParseCIDR("2001:1234:ae:b004::/64")
  604. c = networkConfiguration{
  605. EnableIPv6: true,
  606. AddressIPv6: v6nw,
  607. DefaultGatewayIPv6: net.ParseIP("2001:1234:ac:b004::bad:a55"),
  608. }
  609. err = c.Validate()
  610. if err == nil {
  611. t.Fatalf("Failed to detect invalid v6 default gateway")
  612. }
  613. c.DefaultGatewayIPv6 = net.ParseIP("2001:1234:ae:b004::bad:a55")
  614. err = c.Validate()
  615. if err != nil {
  616. t.Fatalf("Unexpected validation error on v6 default gateway")
  617. }
  618. c.AddressIPv6 = nil
  619. err = c.Validate()
  620. if err == nil {
  621. t.Fatalf("Failed to detect invalid v6 default gateway")
  622. }
  623. c.AddressIPv6 = nil
  624. err = c.Validate()
  625. if err == nil {
  626. t.Fatalf("Failed to detect invalid v6 default gateway")
  627. }
  628. }
  629. func TestSetDefaultGw(t *testing.T) {
  630. defer testutils.SetupTestOSContext(t)()
  631. d := newDriver()
  632. if err := d.configure(nil); err != nil {
  633. t.Fatalf("Failed to setup driver config: %v", err)
  634. }
  635. _, subnetv6, _ := net.ParseCIDR("2001:db8:ea9:9abc:b0c4::/80")
  636. ipdList := getIPv4Data(t)
  637. gw4 := types.GetIPCopy(ipdList[0].Pool.IP).To4()
  638. gw4[3] = 254
  639. gw6 := net.ParseIP("2001:db8:ea9:9abc:b0c4::254")
  640. config := &networkConfiguration{
  641. BridgeName: DefaultBridgeName,
  642. EnableIPv6: true,
  643. AddressIPv6: subnetv6,
  644. DefaultGatewayIPv4: gw4,
  645. DefaultGatewayIPv6: gw6,
  646. }
  647. genericOption := make(map[string]interface{})
  648. genericOption[netlabel.GenericData] = config
  649. err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
  650. if err != nil {
  651. t.Fatalf("Failed to create bridge: %v", err)
  652. }
  653. te := newTestEndpoint(ipdList[0].Pool, 10)
  654. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  655. if err != nil {
  656. t.Fatalf("Failed to create endpoint: %v", err)
  657. }
  658. err = d.Join("dummy", "ep", "sbox", te, nil)
  659. if err != nil {
  660. t.Fatalf("Failed to join endpoint: %v", err)
  661. }
  662. if !gw4.Equal(te.gw) {
  663. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw4, te.gw)
  664. }
  665. if !gw6.Equal(te.gw6) {
  666. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw6, te.gw6)
  667. }
  668. }