bridge_test.go 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. //go:build linux
  2. // +build linux
  3. package bridge
  4. import (
  5. "bytes"
  6. "encoding/json"
  7. "fmt"
  8. "net"
  9. "regexp"
  10. "strconv"
  11. "testing"
  12. "github.com/docker/docker/libnetwork/driverapi"
  13. "github.com/docker/docker/libnetwork/iptables"
  14. "github.com/docker/docker/libnetwork/netlabel"
  15. "github.com/docker/docker/libnetwork/netutils"
  16. "github.com/docker/docker/libnetwork/options"
  17. "github.com/docker/docker/libnetwork/testutils"
  18. "github.com/docker/docker/libnetwork/types"
  19. "github.com/vishvananda/netlink"
  20. )
  21. func TestEndpointMarshalling(t *testing.T) {
  22. ip1, _ := types.ParseCIDR("172.22.0.9/16")
  23. ip2, _ := types.ParseCIDR("2001:db8::9")
  24. mac, _ := net.ParseMAC("ac:bd:24:57:66:77")
  25. e := &bridgeEndpoint{
  26. id: "d2c015a1fe5930650cbcd50493efba0500bcebd8ee1f4401a16319f8a567de33",
  27. nid: "ee33fbb43c323f1920b6b35a0101552ac22ede960d0e5245e9738bccc68b2415",
  28. addr: ip1,
  29. addrv6: ip2,
  30. macAddress: mac,
  31. srcName: "veth123456",
  32. config: &endpointConfiguration{MacAddress: mac},
  33. containerConfig: &containerConfiguration{
  34. ParentEndpoints: []string{"one", "due", "three"},
  35. ChildEndpoints: []string{"four", "five", "six"},
  36. },
  37. extConnConfig: &connectivityConfiguration{
  38. ExposedPorts: []types.TransportPort{
  39. {
  40. Proto: 6,
  41. Port: uint16(18),
  42. },
  43. },
  44. PortBindings: []types.PortBinding{
  45. {
  46. Proto: 6,
  47. IP: net.ParseIP("17210.33.9.56"),
  48. Port: uint16(18),
  49. HostPort: uint16(3000),
  50. HostPortEnd: uint16(14000),
  51. },
  52. },
  53. },
  54. portMapping: []types.PortBinding{
  55. {
  56. Proto: 17,
  57. IP: net.ParseIP("172.33.9.56"),
  58. Port: uint16(99),
  59. HostIP: net.ParseIP("10.10.100.2"),
  60. HostPort: uint16(9900),
  61. HostPortEnd: uint16(10000),
  62. },
  63. {
  64. Proto: 6,
  65. IP: net.ParseIP("171.33.9.56"),
  66. Port: uint16(55),
  67. HostIP: net.ParseIP("10.11.100.2"),
  68. HostPort: uint16(5500),
  69. HostPortEnd: uint16(55000),
  70. },
  71. },
  72. }
  73. b, err := json.Marshal(e)
  74. if err != nil {
  75. t.Fatal(err)
  76. }
  77. ee := &bridgeEndpoint{}
  78. err = json.Unmarshal(b, ee)
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. if e.id != ee.id || e.nid != ee.nid || e.srcName != ee.srcName || !bytes.Equal(e.macAddress, ee.macAddress) ||
  83. !types.CompareIPNet(e.addr, ee.addr) || !types.CompareIPNet(e.addrv6, ee.addrv6) ||
  84. !compareEpConfig(e.config, ee.config) ||
  85. !compareContainerConfig(e.containerConfig, ee.containerConfig) ||
  86. !compareConnConfig(e.extConnConfig, ee.extConnConfig) ||
  87. !compareBindings(e.portMapping, ee.portMapping) {
  88. t.Fatalf("JSON marsh/unmarsh failed.\nOriginal:\n%#v\nDecoded:\n%#v", e, ee)
  89. }
  90. }
  91. func compareEpConfig(a, b *endpointConfiguration) bool {
  92. if a == b {
  93. return true
  94. }
  95. if a == nil || b == nil {
  96. return false
  97. }
  98. return bytes.Equal(a.MacAddress, b.MacAddress)
  99. }
  100. func compareContainerConfig(a, b *containerConfiguration) bool {
  101. if a == b {
  102. return true
  103. }
  104. if a == nil || b == nil {
  105. return false
  106. }
  107. if len(a.ParentEndpoints) != len(b.ParentEndpoints) ||
  108. len(a.ChildEndpoints) != len(b.ChildEndpoints) {
  109. return false
  110. }
  111. for i := 0; i < len(a.ParentEndpoints); i++ {
  112. if a.ParentEndpoints[i] != b.ParentEndpoints[i] {
  113. return false
  114. }
  115. }
  116. for i := 0; i < len(a.ChildEndpoints); i++ {
  117. if a.ChildEndpoints[i] != b.ChildEndpoints[i] {
  118. return false
  119. }
  120. }
  121. return true
  122. }
  123. func compareConnConfig(a, b *connectivityConfiguration) bool {
  124. if a == b {
  125. return true
  126. }
  127. if a == nil || b == nil {
  128. return false
  129. }
  130. if len(a.ExposedPorts) != len(b.ExposedPorts) ||
  131. len(a.PortBindings) != len(b.PortBindings) {
  132. return false
  133. }
  134. for i := 0; i < len(a.ExposedPorts); i++ {
  135. if !a.ExposedPorts[i].Equal(&b.ExposedPorts[i]) {
  136. return false
  137. }
  138. }
  139. for i := 0; i < len(a.PortBindings); i++ {
  140. if !a.PortBindings[i].Equal(&b.PortBindings[i]) {
  141. return false
  142. }
  143. }
  144. return true
  145. }
  146. func compareBindings(a, b []types.PortBinding) bool {
  147. if len(a) != len(b) {
  148. return false
  149. }
  150. for i := 0; i < len(a); i++ {
  151. if !a[i].Equal(&b[i]) {
  152. return false
  153. }
  154. }
  155. return true
  156. }
  157. func getIPv4Data(t *testing.T, iface string) []driverapi.IPAMData {
  158. ipd := driverapi.IPAMData{AddressSpace: "full"}
  159. nws, _, err := netutils.ElectInterfaceAddresses(iface)
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. ipd.Pool = nws[0]
  164. // Set network gateway to X.X.X.1
  165. ipd.Gateway = types.GetIPNetCopy(nws[0])
  166. ipd.Gateway.IP[len(ipd.Gateway.IP)-1] = 1
  167. return []driverapi.IPAMData{ipd}
  168. }
  169. func TestCreateFullOptions(t *testing.T) {
  170. defer testutils.SetupTestOSContext(t)()
  171. d := newDriver()
  172. config := &configuration{
  173. EnableIPForwarding: true,
  174. EnableIPTables: true,
  175. }
  176. // Test this scenario: Default gw address does not belong to
  177. // container network and it's greater than bridge address
  178. cnw, _ := types.ParseCIDR("172.16.122.0/24")
  179. bnw, _ := types.ParseCIDR("172.16.0.0/24")
  180. br, _ := types.ParseCIDR("172.16.0.1/16")
  181. defgw, _ := types.ParseCIDR("172.16.0.100/16")
  182. genericOption := make(map[string]interface{})
  183. genericOption[netlabel.GenericData] = config
  184. if err := d.configure(genericOption); err != nil {
  185. t.Fatalf("Failed to setup driver config: %v", err)
  186. }
  187. netOption := make(map[string]interface{})
  188. netOption[netlabel.EnableIPv6] = true
  189. netOption[netlabel.GenericData] = &networkConfiguration{
  190. BridgeName: DefaultBridgeName,
  191. }
  192. ipdList := []driverapi.IPAMData{
  193. {
  194. Pool: bnw,
  195. Gateway: br,
  196. AuxAddresses: map[string]*net.IPNet{DefaultGatewayV4AuxKey: defgw},
  197. },
  198. }
  199. err := d.CreateNetwork("dummy", netOption, nil, ipdList, nil)
  200. if err != nil {
  201. t.Fatalf("Failed to create bridge: %v", err)
  202. }
  203. // Verify the IP address allocated for the endpoint belongs to the container network
  204. epOptions := make(map[string]interface{})
  205. te := newTestEndpoint(cnw, 10)
  206. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions)
  207. if err != nil {
  208. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  209. }
  210. if !cnw.Contains(te.Interface().Address().IP) {
  211. t.Fatalf("endpoint got assigned address outside of container network(%s): %s", cnw.String(), te.Interface().Address())
  212. }
  213. }
  214. func TestCreateNoConfig(t *testing.T) {
  215. defer testutils.SetupTestOSContext(t)()
  216. d := newDriver()
  217. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  218. genericOption := make(map[string]interface{})
  219. genericOption[netlabel.GenericData] = netconfig
  220. if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t, ""), nil); err != nil {
  221. t.Fatalf("Failed to create bridge: %v", err)
  222. }
  223. }
  224. func TestCreateFullOptionsLabels(t *testing.T) {
  225. defer testutils.SetupTestOSContext(t)()
  226. d := newDriver()
  227. config := &configuration{
  228. EnableIPForwarding: true,
  229. }
  230. genericOption := make(map[string]interface{})
  231. genericOption[netlabel.GenericData] = config
  232. if err := d.configure(genericOption); err != nil {
  233. t.Fatalf("Failed to setup driver config: %v", err)
  234. }
  235. bndIPs := "127.0.0.1"
  236. testHostIP := "1.2.3.4"
  237. nwV6s := "2001:db8:2600:2700:2800::/80"
  238. gwV6s := "2001:db8:2600:2700:2800::25/80"
  239. nwV6, _ := types.ParseCIDR(nwV6s)
  240. gwV6, _ := types.ParseCIDR(gwV6s)
  241. labels := map[string]string{
  242. BridgeName: DefaultBridgeName,
  243. DefaultBridge: "true",
  244. EnableICC: "true",
  245. EnableIPMasquerade: "true",
  246. DefaultBindingIP: bndIPs,
  247. netlabel.HostIP: testHostIP,
  248. }
  249. netOption := make(map[string]interface{})
  250. netOption[netlabel.EnableIPv6] = true
  251. netOption[netlabel.GenericData] = labels
  252. ipdList := getIPv4Data(t, "")
  253. ipd6List := []driverapi.IPAMData{
  254. {
  255. Pool: nwV6,
  256. AuxAddresses: map[string]*net.IPNet{
  257. DefaultGatewayV6AuxKey: gwV6,
  258. },
  259. },
  260. }
  261. err := d.CreateNetwork("dummy", netOption, nil, ipdList, ipd6List)
  262. if err != nil {
  263. t.Fatalf("Failed to create bridge: %v", err)
  264. }
  265. nw, ok := d.networks["dummy"]
  266. if !ok {
  267. t.Fatal("Cannot find dummy network in bridge driver")
  268. }
  269. if nw.config.BridgeName != DefaultBridgeName {
  270. t.Fatal("incongruent name in bridge network")
  271. }
  272. if !nw.config.EnableIPv6 {
  273. t.Fatal("incongruent EnableIPv6 in bridge network")
  274. }
  275. if !nw.config.EnableICC {
  276. t.Fatal("incongruent EnableICC in bridge network")
  277. }
  278. if !nw.config.EnableIPMasquerade {
  279. t.Fatal("incongruent EnableIPMasquerade in bridge network")
  280. }
  281. bndIP := net.ParseIP(bndIPs)
  282. if !bndIP.Equal(nw.config.DefaultBindingIP) {
  283. t.Fatalf("Unexpected: %v", nw.config.DefaultBindingIP)
  284. }
  285. hostIP := net.ParseIP(testHostIP)
  286. if !hostIP.Equal(nw.config.HostIP) {
  287. t.Fatalf("Unexpected: %v", nw.config.HostIP)
  288. }
  289. if !types.CompareIPNet(nw.config.AddressIPv6, nwV6) {
  290. t.Fatalf("Unexpected: %v", nw.config.AddressIPv6)
  291. }
  292. if !gwV6.IP.Equal(nw.config.DefaultGatewayIPv6) {
  293. t.Fatalf("Unexpected: %v", nw.config.DefaultGatewayIPv6)
  294. }
  295. // In short here we are testing --fixed-cidr-v6 daemon option
  296. // plus --mac-address run option
  297. mac, _ := net.ParseMAC("aa:bb:cc:dd:ee:ff")
  298. epOptions := map[string]interface{}{netlabel.MacAddress: mac}
  299. te := newTestEndpoint(ipdList[0].Pool, 20)
  300. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions)
  301. if err != nil {
  302. t.Fatal(err)
  303. }
  304. if !nwV6.Contains(te.Interface().AddressIPv6().IP) {
  305. t.Fatalf("endpoint got assigned address outside of container network(%s): %s", nwV6.String(), te.Interface().AddressIPv6())
  306. }
  307. if te.Interface().AddressIPv6().IP.String() != "2001:db8:2600:2700:2800:aabb:ccdd:eeff" {
  308. t.Fatalf("Unexpected endpoint IPv6 address: %v", te.Interface().AddressIPv6().IP)
  309. }
  310. }
  311. func TestCreate(t *testing.T) {
  312. defer testutils.SetupTestOSContext(t)()
  313. d := newDriver()
  314. if err := d.configure(nil); err != nil {
  315. t.Fatalf("Failed to setup driver config: %v", err)
  316. }
  317. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  318. genericOption := make(map[string]interface{})
  319. genericOption[netlabel.GenericData] = netconfig
  320. if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t, ""), nil); err != nil {
  321. t.Fatalf("Failed to create bridge: %v", err)
  322. }
  323. err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t, ""), nil)
  324. if err == nil {
  325. t.Fatal("Expected bridge driver to refuse creation of second network with default name")
  326. }
  327. if _, ok := err.(types.ForbiddenError); !ok {
  328. t.Fatal("Creation of second network with default name failed with unexpected error type")
  329. }
  330. }
  331. func TestCreateFail(t *testing.T) {
  332. defer testutils.SetupTestOSContext(t)()
  333. d := newDriver()
  334. if err := d.configure(nil); err != nil {
  335. t.Fatalf("Failed to setup driver config: %v", err)
  336. }
  337. netconfig := &networkConfiguration{BridgeName: "dummy0", DefaultBridge: true}
  338. genericOption := make(map[string]interface{})
  339. genericOption[netlabel.GenericData] = netconfig
  340. if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t, ""), nil); err == nil {
  341. t.Fatal("Bridge creation was expected to fail")
  342. }
  343. }
  344. func TestCreateMultipleNetworks(t *testing.T) {
  345. defer testutils.SetupTestOSContext(t)()
  346. d := newDriver()
  347. config := &configuration{
  348. EnableIPTables: true,
  349. }
  350. genericOption := make(map[string]interface{})
  351. genericOption[netlabel.GenericData] = config
  352. if err := d.configure(genericOption); err != nil {
  353. t.Fatalf("Failed to setup driver config: %v", err)
  354. }
  355. config1 := &networkConfiguration{BridgeName: "net_test_1"}
  356. genericOption = make(map[string]interface{})
  357. genericOption[netlabel.GenericData] = config1
  358. if err := d.CreateNetwork("1", genericOption, nil, getIPv4Data(t, ""), nil); err != nil {
  359. t.Fatalf("Failed to create bridge: %v", err)
  360. }
  361. verifyV4INCEntries(d.networks, t)
  362. config2 := &networkConfiguration{BridgeName: "net_test_2"}
  363. genericOption[netlabel.GenericData] = config2
  364. if err := d.CreateNetwork("2", genericOption, nil, getIPv4Data(t, ""), nil); err != nil {
  365. t.Fatalf("Failed to create bridge: %v", err)
  366. }
  367. verifyV4INCEntries(d.networks, t)
  368. config3 := &networkConfiguration{BridgeName: "net_test_3"}
  369. genericOption[netlabel.GenericData] = config3
  370. if err := d.CreateNetwork("3", genericOption, nil, getIPv4Data(t, ""), nil); err != nil {
  371. t.Fatalf("Failed to create bridge: %v", err)
  372. }
  373. verifyV4INCEntries(d.networks, t)
  374. config4 := &networkConfiguration{BridgeName: "net_test_4"}
  375. genericOption[netlabel.GenericData] = config4
  376. if err := d.CreateNetwork("4", genericOption, nil, getIPv4Data(t, ""), nil); err != nil {
  377. t.Fatalf("Failed to create bridge: %v", err)
  378. }
  379. verifyV4INCEntries(d.networks, t)
  380. if err := d.DeleteNetwork("1"); err != nil {
  381. t.Log(err)
  382. }
  383. verifyV4INCEntries(d.networks, t)
  384. if err := d.DeleteNetwork("2"); err != nil {
  385. t.Log(err)
  386. }
  387. verifyV4INCEntries(d.networks, t)
  388. if err := d.DeleteNetwork("3"); err != nil {
  389. t.Log(err)
  390. }
  391. verifyV4INCEntries(d.networks, t)
  392. if err := d.DeleteNetwork("4"); err != nil {
  393. t.Log(err)
  394. }
  395. verifyV4INCEntries(d.networks, t)
  396. }
  397. // Verify the network isolation rules are installed for each network
  398. func verifyV4INCEntries(networks map[string]*bridgeNetwork, t *testing.T) {
  399. iptable := iptables.GetIptable(iptables.IPv4)
  400. out1, err := iptable.Raw("-S", IsolationChain1)
  401. if err != nil {
  402. t.Fatal(err)
  403. }
  404. out2, err := iptable.Raw("-S", IsolationChain2)
  405. if err != nil {
  406. t.Fatal(err)
  407. }
  408. for _, n := range networks {
  409. re := regexp.MustCompile(fmt.Sprintf("-i %s ! -o %s -j %s", n.config.BridgeName, n.config.BridgeName, IsolationChain2))
  410. matches := re.FindAllString(string(out1[:]), -1)
  411. if len(matches) != 1 {
  412. t.Fatalf("Cannot find expected inter-network isolation rules in IP Tables for network %s:\n%s.", n.id, string(out1[:]))
  413. }
  414. re = regexp.MustCompile(fmt.Sprintf("-o %s -j DROP", n.config.BridgeName))
  415. matches = re.FindAllString(string(out2[:]), -1)
  416. if len(matches) != 1 {
  417. t.Fatalf("Cannot find expected inter-network isolation rules in IP Tables for network %s:\n%s.", n.id, string(out2[:]))
  418. }
  419. }
  420. }
  421. type testInterface struct {
  422. mac net.HardwareAddr
  423. addr *net.IPNet
  424. addrv6 *net.IPNet
  425. srcName string
  426. dstName string
  427. }
  428. type testEndpoint struct {
  429. iface *testInterface
  430. gw net.IP
  431. gw6 net.IP
  432. routes []types.StaticRoute
  433. }
  434. func newTestEndpoint(nw *net.IPNet, ordinal byte) *testEndpoint {
  435. addr := types.GetIPNetCopy(nw)
  436. addr.IP[len(addr.IP)-1] = ordinal
  437. return &testEndpoint{iface: &testInterface{addr: addr}}
  438. }
  439. func (te *testEndpoint) Interface() driverapi.InterfaceInfo {
  440. if te.iface != nil {
  441. return te.iface
  442. }
  443. return nil
  444. }
  445. func (i *testInterface) MacAddress() net.HardwareAddr {
  446. return i.mac
  447. }
  448. func (i *testInterface) Address() *net.IPNet {
  449. return i.addr
  450. }
  451. func (i *testInterface) AddressIPv6() *net.IPNet {
  452. return i.addrv6
  453. }
  454. func (i *testInterface) SetMacAddress(mac net.HardwareAddr) error {
  455. if i.mac != nil {
  456. return types.ForbiddenErrorf("endpoint interface MAC address present (%s). Cannot be modified with %s.", i.mac, mac)
  457. }
  458. if mac == nil {
  459. return types.BadRequestErrorf("tried to set nil MAC address to endpoint interface")
  460. }
  461. i.mac = types.GetMacCopy(mac)
  462. return nil
  463. }
  464. func (i *testInterface) SetIPAddress(address *net.IPNet) error {
  465. if address.IP == nil {
  466. return types.BadRequestErrorf("tried to set nil IP address to endpoint interface")
  467. }
  468. if address.IP.To4() == nil {
  469. return setAddress(&i.addrv6, address)
  470. }
  471. return setAddress(&i.addr, address)
  472. }
  473. func setAddress(ifaceAddr **net.IPNet, address *net.IPNet) error {
  474. if *ifaceAddr != nil {
  475. return types.ForbiddenErrorf("endpoint interface IP present (%s). Cannot be modified with (%s).", *ifaceAddr, address)
  476. }
  477. *ifaceAddr = types.GetIPNetCopy(address)
  478. return nil
  479. }
  480. func (i *testInterface) SetNames(srcName string, dstName string) error {
  481. i.srcName = srcName
  482. i.dstName = dstName
  483. return nil
  484. }
  485. func (te *testEndpoint) InterfaceName() driverapi.InterfaceNameInfo {
  486. if te.iface != nil {
  487. return te.iface
  488. }
  489. return nil
  490. }
  491. func (te *testEndpoint) SetGateway(gw net.IP) error {
  492. te.gw = gw
  493. return nil
  494. }
  495. func (te *testEndpoint) SetGatewayIPv6(gw6 net.IP) error {
  496. te.gw6 = gw6
  497. return nil
  498. }
  499. func (te *testEndpoint) AddStaticRoute(destination *net.IPNet, routeType int, nextHop net.IP) error {
  500. te.routes = append(te.routes, types.StaticRoute{Destination: destination, RouteType: routeType, NextHop: nextHop})
  501. return nil
  502. }
  503. func (te *testEndpoint) AddTableEntry(tableName string, key string, value []byte) error {
  504. return nil
  505. }
  506. func (te *testEndpoint) DisableGatewayService() {}
  507. func TestQueryEndpointInfo(t *testing.T) {
  508. testQueryEndpointInfo(t, true)
  509. }
  510. func TestQueryEndpointInfoHairpin(t *testing.T) {
  511. testQueryEndpointInfo(t, false)
  512. }
  513. func testQueryEndpointInfo(t *testing.T, ulPxyEnabled bool) {
  514. defer testutils.SetupTestOSContext(t)()
  515. d := newDriver()
  516. config := &configuration{
  517. EnableIPTables: true,
  518. EnableUserlandProxy: ulPxyEnabled,
  519. }
  520. genericOption := make(map[string]interface{})
  521. genericOption[netlabel.GenericData] = config
  522. if err := d.configure(genericOption); err != nil {
  523. t.Fatalf("Failed to setup driver config: %v", err)
  524. }
  525. netconfig := &networkConfiguration{
  526. BridgeName: DefaultBridgeName,
  527. EnableICC: false,
  528. }
  529. genericOption = make(map[string]interface{})
  530. genericOption[netlabel.GenericData] = netconfig
  531. ipdList := getIPv4Data(t, "")
  532. err := d.CreateNetwork("net1", genericOption, nil, ipdList, nil)
  533. if err != nil {
  534. t.Fatalf("Failed to create bridge: %v", err)
  535. }
  536. sbOptions := make(map[string]interface{})
  537. sbOptions[netlabel.PortMap] = getPortMapping()
  538. te := newTestEndpoint(ipdList[0].Pool, 11)
  539. err = d.CreateEndpoint("net1", "ep1", te.Interface(), nil)
  540. if err != nil {
  541. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  542. }
  543. err = d.Join("net1", "ep1", "sbox", te, sbOptions)
  544. if err != nil {
  545. t.Fatalf("Failed to join the endpoint: %v", err)
  546. }
  547. err = d.ProgramExternalConnectivity("net1", "ep1", sbOptions)
  548. if err != nil {
  549. t.Fatalf("Failed to program external connectivity: %v", err)
  550. }
  551. network, ok := d.networks["net1"]
  552. if !ok {
  553. t.Fatalf("Cannot find network %s inside driver", "net1")
  554. }
  555. ep := network.endpoints["ep1"]
  556. data, err := d.EndpointOperInfo(network.id, ep.id)
  557. if err != nil {
  558. t.Fatalf("Failed to ask for endpoint operational data: %v", err)
  559. }
  560. pmd, ok := data[netlabel.PortMap]
  561. if !ok {
  562. t.Fatal("Endpoint operational data does not contain port mapping data")
  563. }
  564. pm, ok := pmd.([]types.PortBinding)
  565. if !ok {
  566. t.Fatal("Unexpected format for port mapping in endpoint operational data")
  567. }
  568. if len(ep.portMapping) != len(pm) {
  569. t.Fatal("Incomplete data for port mapping in endpoint operational data")
  570. }
  571. for i, pb := range ep.portMapping {
  572. if !pb.Equal(&pm[i]) {
  573. t.Fatal("Unexpected data for port mapping in endpoint operational data")
  574. }
  575. }
  576. err = d.RevokeExternalConnectivity("net1", "ep1")
  577. if err != nil {
  578. t.Fatal(err)
  579. }
  580. // release host mapped ports
  581. err = d.Leave("net1", "ep1")
  582. if err != nil {
  583. t.Fatal(err)
  584. }
  585. }
  586. func getExposedPorts() []types.TransportPort {
  587. return []types.TransportPort{
  588. {Proto: types.TCP, Port: uint16(5000)},
  589. {Proto: types.UDP, Port: uint16(400)},
  590. {Proto: types.TCP, Port: uint16(600)},
  591. }
  592. }
  593. func getPortMapping() []types.PortBinding {
  594. return []types.PortBinding{
  595. {Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  596. {Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  597. {Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  598. }
  599. }
  600. func TestLinkContainers(t *testing.T) {
  601. defer testutils.SetupTestOSContext(t)()
  602. d := newDriver()
  603. iptable := iptables.GetIptable(iptables.IPv4)
  604. config := &configuration{
  605. EnableIPTables: true,
  606. }
  607. genericOption := make(map[string]interface{})
  608. genericOption[netlabel.GenericData] = config
  609. if err := d.configure(genericOption); err != nil {
  610. t.Fatalf("Failed to setup driver config: %v", err)
  611. }
  612. netconfig := &networkConfiguration{
  613. BridgeName: DefaultBridgeName,
  614. EnableICC: false,
  615. }
  616. genericOption = make(map[string]interface{})
  617. genericOption[netlabel.GenericData] = netconfig
  618. ipdList := getIPv4Data(t, "")
  619. err := d.CreateNetwork("net1", genericOption, nil, ipdList, nil)
  620. if err != nil {
  621. t.Fatalf("Failed to create bridge: %v", err)
  622. }
  623. te1 := newTestEndpoint(ipdList[0].Pool, 11)
  624. err = d.CreateEndpoint("net1", "ep1", te1.Interface(), nil)
  625. if err != nil {
  626. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  627. }
  628. exposedPorts := getExposedPorts()
  629. sbOptions := make(map[string]interface{})
  630. sbOptions[netlabel.ExposedPorts] = exposedPorts
  631. err = d.Join("net1", "ep1", "sbox", te1, sbOptions)
  632. if err != nil {
  633. t.Fatalf("Failed to join the endpoint: %v", err)
  634. }
  635. err = d.ProgramExternalConnectivity("net1", "ep1", sbOptions)
  636. if err != nil {
  637. t.Fatalf("Failed to program external connectivity: %v", err)
  638. }
  639. addr1 := te1.iface.addr
  640. if addr1.IP.To4() == nil {
  641. t.Fatal("No Ipv4 address assigned to the endpoint: ep1")
  642. }
  643. te2 := newTestEndpoint(ipdList[0].Pool, 22)
  644. err = d.CreateEndpoint("net1", "ep2", te2.Interface(), nil)
  645. if err != nil {
  646. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  647. }
  648. addr2 := te2.iface.addr
  649. if addr2.IP.To4() == nil {
  650. t.Fatal("No Ipv4 address assigned to the endpoint: ep2")
  651. }
  652. sbOptions = make(map[string]interface{})
  653. sbOptions[netlabel.GenericData] = options.Generic{
  654. "ChildEndpoints": []string{"ep1"},
  655. }
  656. err = d.Join("net1", "ep2", "", te2, sbOptions)
  657. if err != nil {
  658. t.Fatal("Failed to link ep1 and ep2")
  659. }
  660. err = d.ProgramExternalConnectivity("net1", "ep2", sbOptions)
  661. if err != nil {
  662. t.Fatalf("Failed to program external connectivity: %v", err)
  663. }
  664. out, _ := iptable.Raw("-L", DockerChain)
  665. for _, pm := range exposedPorts {
  666. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  667. re := regexp.MustCompile(regex)
  668. matches := re.FindAllString(string(out[:]), -1)
  669. if len(matches) != 1 {
  670. t.Fatalf("IP Tables programming failed %s", string(out[:]))
  671. }
  672. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  673. matched, _ := regexp.MatchString(regex, string(out[:]))
  674. if !matched {
  675. t.Fatalf("IP Tables programming failed %s", string(out[:]))
  676. }
  677. }
  678. err = d.RevokeExternalConnectivity("net1", "ep2")
  679. if err != nil {
  680. t.Fatalf("Failed to revoke external connectivity: %v", err)
  681. }
  682. err = d.Leave("net1", "ep2")
  683. if err != nil {
  684. t.Fatal("Failed to unlink ep1 and ep2")
  685. }
  686. out, _ = iptable.Raw("-L", DockerChain)
  687. for _, pm := range exposedPorts {
  688. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  689. re := regexp.MustCompile(regex)
  690. matches := re.FindAllString(string(out[:]), -1)
  691. if len(matches) != 0 {
  692. t.Fatalf("Leave should have deleted relevant IPTables rules %s", string(out[:]))
  693. }
  694. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  695. matched, _ := regexp.MatchString(regex, string(out[:]))
  696. if matched {
  697. t.Fatalf("Leave should have deleted relevant IPTables rules %s", string(out[:]))
  698. }
  699. }
  700. // Error condition test with an invalid endpoint-id "ep4"
  701. sbOptions = make(map[string]interface{})
  702. sbOptions[netlabel.GenericData] = options.Generic{
  703. "ChildEndpoints": []string{"ep1", "ep4"},
  704. }
  705. err = d.Join("net1", "ep2", "", te2, sbOptions)
  706. if err != nil {
  707. t.Fatal(err)
  708. }
  709. err = d.ProgramExternalConnectivity("net1", "ep2", sbOptions)
  710. if err != nil {
  711. out, _ = iptable.Raw("-L", DockerChain)
  712. for _, pm := range exposedPorts {
  713. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  714. re := regexp.MustCompile(regex)
  715. matches := re.FindAllString(string(out[:]), -1)
  716. if len(matches) != 0 {
  717. t.Fatalf("Error handling should rollback relevant IPTables rules %s", string(out[:]))
  718. }
  719. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  720. matched, _ := regexp.MatchString(regex, string(out[:]))
  721. if matched {
  722. t.Fatalf("Error handling should rollback relevant IPTables rules %s", string(out[:]))
  723. }
  724. }
  725. } else {
  726. t.Fatal("Expected Join to fail given link conditions are not satisfied")
  727. }
  728. }
  729. func TestValidateConfig(t *testing.T) {
  730. defer testutils.SetupTestOSContext(t)()
  731. // Test mtu
  732. c := networkConfiguration{Mtu: -2}
  733. err := c.Validate()
  734. if err == nil {
  735. t.Fatal("Failed to detect invalid MTU number")
  736. }
  737. c.Mtu = 9000
  738. err = c.Validate()
  739. if err != nil {
  740. t.Fatal("unexpected validation error on MTU number")
  741. }
  742. // Bridge network
  743. _, network, _ := net.ParseCIDR("172.28.0.0/16")
  744. c = networkConfiguration{
  745. AddressIPv4: network,
  746. }
  747. err = c.Validate()
  748. if err != nil {
  749. t.Fatal(err)
  750. }
  751. // Test v4 gw
  752. c.DefaultGatewayIPv4 = net.ParseIP("172.27.30.234")
  753. err = c.Validate()
  754. if err == nil {
  755. t.Fatal("Failed to detect invalid default gateway")
  756. }
  757. c.DefaultGatewayIPv4 = net.ParseIP("172.28.30.234")
  758. err = c.Validate()
  759. if err != nil {
  760. t.Fatal("Unexpected validation error on default gateway")
  761. }
  762. // Test v6 gw
  763. _, v6nw, _ := net.ParseCIDR("2001:db8:ae:b004::/64")
  764. c = networkConfiguration{
  765. EnableIPv6: true,
  766. AddressIPv6: v6nw,
  767. DefaultGatewayIPv6: net.ParseIP("2001:db8:ac:b004::bad:a55"),
  768. }
  769. err = c.Validate()
  770. if err == nil {
  771. t.Fatal("Failed to detect invalid v6 default gateway")
  772. }
  773. c.DefaultGatewayIPv6 = net.ParseIP("2001:db8:ae:b004::bad:a55")
  774. err = c.Validate()
  775. if err != nil {
  776. t.Fatal("Unexpected validation error on v6 default gateway")
  777. }
  778. c.AddressIPv6 = nil
  779. err = c.Validate()
  780. if err == nil {
  781. t.Fatal("Failed to detect invalid v6 default gateway")
  782. }
  783. c.AddressIPv6 = nil
  784. err = c.Validate()
  785. if err == nil {
  786. t.Fatal("Failed to detect invalid v6 default gateway")
  787. }
  788. }
  789. func TestSetDefaultGw(t *testing.T) {
  790. defer testutils.SetupTestOSContext(t)()
  791. d := newDriver()
  792. if err := d.configure(nil); err != nil {
  793. t.Fatalf("Failed to setup driver config: %v", err)
  794. }
  795. _, subnetv6, _ := net.ParseCIDR("2001:db8:ea9:9abc:b0c4::/80")
  796. ipdList := getIPv4Data(t, "")
  797. gw4 := types.GetIPCopy(ipdList[0].Pool.IP).To4()
  798. gw4[3] = 254
  799. gw6 := net.ParseIP("2001:db8:ea9:9abc:b0c4::254")
  800. config := &networkConfiguration{
  801. BridgeName: DefaultBridgeName,
  802. AddressIPv6: subnetv6,
  803. DefaultGatewayIPv4: gw4,
  804. DefaultGatewayIPv6: gw6,
  805. }
  806. genericOption := make(map[string]interface{})
  807. genericOption[netlabel.EnableIPv6] = true
  808. genericOption[netlabel.GenericData] = config
  809. err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
  810. if err != nil {
  811. t.Fatalf("Failed to create bridge: %v", err)
  812. }
  813. te := newTestEndpoint(ipdList[0].Pool, 10)
  814. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  815. if err != nil {
  816. t.Fatalf("Failed to create endpoint: %v", err)
  817. }
  818. err = d.Join("dummy", "ep", "sbox", te, nil)
  819. if err != nil {
  820. t.Fatalf("Failed to join endpoint: %v", err)
  821. }
  822. if !gw4.Equal(te.gw) {
  823. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw4, te.gw)
  824. }
  825. if !gw6.Equal(te.gw6) {
  826. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw6, te.gw6)
  827. }
  828. }
  829. func TestCleanupIptableRules(t *testing.T) {
  830. defer testutils.SetupTestOSContext(t)()
  831. bridgeChain := []iptables.ChainInfo{
  832. {Name: DockerChain, Table: iptables.Nat},
  833. {Name: DockerChain, Table: iptables.Filter},
  834. {Name: IsolationChain1, Table: iptables.Filter},
  835. }
  836. ipVersions := []iptables.IPVersion{iptables.IPv4, iptables.IPv6}
  837. for _, version := range ipVersions {
  838. if _, _, _, _, err := setupIPChains(configuration{EnableIPTables: true}, version); err != nil {
  839. t.Fatalf("Error setting up ip chains for %s: %v", version, err)
  840. }
  841. iptable := iptables.GetIptable(version)
  842. for _, chainInfo := range bridgeChain {
  843. if !iptable.ExistChain(chainInfo.Name, chainInfo.Table) {
  844. t.Fatalf("iptables version %s chain %s of %s table should have been created", version, chainInfo.Name, chainInfo.Table)
  845. }
  846. }
  847. removeIPChains(version)
  848. for _, chainInfo := range bridgeChain {
  849. if iptable.ExistChain(chainInfo.Name, chainInfo.Table) {
  850. t.Fatalf("iptables version %s chain %s of %s table should have been deleted", version, chainInfo.Name, chainInfo.Table)
  851. }
  852. }
  853. }
  854. }
  855. func TestCreateWithExistingBridge(t *testing.T) {
  856. defer testutils.SetupTestOSContext(t)()
  857. d := newDriver()
  858. if err := d.configure(nil); err != nil {
  859. t.Fatalf("Failed to setup driver config: %v", err)
  860. }
  861. brName := "br111"
  862. br := &netlink.Bridge{
  863. LinkAttrs: netlink.LinkAttrs{
  864. Name: brName,
  865. },
  866. }
  867. if err := netlink.LinkAdd(br); err != nil {
  868. t.Fatalf("Failed to create bridge interface: %v", err)
  869. }
  870. defer netlink.LinkDel(br)
  871. if err := netlink.LinkSetUp(br); err != nil {
  872. t.Fatalf("Failed to set bridge interface up: %v", err)
  873. }
  874. ip := net.IP{192, 168, 122, 1}
  875. addr := &netlink.Addr{IPNet: &net.IPNet{
  876. IP: ip,
  877. Mask: net.IPv4Mask(255, 255, 255, 0),
  878. }}
  879. if err := netlink.AddrAdd(br, addr); err != nil {
  880. t.Fatalf("Failed to add IP address to bridge: %v", err)
  881. }
  882. netconfig := &networkConfiguration{BridgeName: brName}
  883. genericOption := make(map[string]interface{})
  884. genericOption[netlabel.GenericData] = netconfig
  885. if err := d.CreateNetwork(brName, genericOption, nil, getIPv4Data(t, brName), nil); err != nil {
  886. t.Fatalf("Failed to create bridge network: %v", err)
  887. }
  888. nw, err := d.getNetwork(brName)
  889. if err != nil {
  890. t.Fatalf("Failed to getNetwork(%s): %v", brName, err)
  891. }
  892. addrs4, _, err := nw.bridge.addresses()
  893. if err != nil {
  894. t.Fatalf("Failed to get the bridge network's address: %v", err)
  895. }
  896. if !addrs4[0].IP.Equal(ip) {
  897. t.Fatal("Creating bridge network with existing bridge interface unexpectedly modified the IP address of the bridge")
  898. }
  899. if err := d.DeleteNetwork(brName); err != nil {
  900. t.Fatalf("Failed to delete network %s: %v", brName, err)
  901. }
  902. if _, err := netlink.LinkByName(brName); err != nil {
  903. t.Fatal("Deleting bridge network that using existing bridge interface unexpectedly deleted the bridge interface")
  904. }
  905. }
  906. func TestCreateParallel(t *testing.T) {
  907. defer testutils.SetupTestOSContext(t)()
  908. d := newDriver()
  909. if err := d.configure(nil); err != nil {
  910. t.Fatalf("Failed to setup driver config: %v", err)
  911. }
  912. ch := make(chan error, 100)
  913. for i := 0; i < 100; i++ {
  914. go func(name string, ch chan<- error) {
  915. config := &networkConfiguration{BridgeName: name}
  916. genericOption := make(map[string]interface{})
  917. genericOption[netlabel.GenericData] = config
  918. if err := d.CreateNetwork(name, genericOption, nil, getIPv4Data(t, "docker0"), nil); err != nil {
  919. ch <- fmt.Errorf("failed to create %s", name)
  920. return
  921. }
  922. if err := d.CreateNetwork(name, genericOption, nil, getIPv4Data(t, "docker0"), nil); err == nil {
  923. ch <- fmt.Errorf("failed was able to create overlap %s", name)
  924. return
  925. }
  926. ch <- nil
  927. }("net"+strconv.Itoa(i), ch)
  928. }
  929. // wait for the go routines
  930. var success int
  931. for i := 0; i < 100; i++ {
  932. val := <-ch
  933. if val == nil {
  934. success++
  935. }
  936. }
  937. if success != 1 {
  938. t.Fatalf("Success should be 1 instead: %d", success)
  939. }
  940. }