bridge_linux_test.go 31 KB

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