bridge_test.go 30 KB

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