libnetwork_linux_test.go 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151
  1. package libnetwork_test
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "net"
  8. "os"
  9. "os/exec"
  10. "runtime"
  11. "strconv"
  12. "strings"
  13. "sync"
  14. "testing"
  15. "github.com/docker/docker/libnetwork"
  16. "github.com/docker/docker/libnetwork/ipamapi"
  17. "github.com/docker/docker/libnetwork/netlabel"
  18. "github.com/docker/docker/libnetwork/options"
  19. "github.com/docker/docker/libnetwork/osl"
  20. "github.com/docker/docker/libnetwork/testutils"
  21. "github.com/docker/docker/libnetwork/types"
  22. "github.com/docker/docker/pkg/reexec"
  23. "github.com/sirupsen/logrus"
  24. "github.com/vishvananda/netlink"
  25. "github.com/vishvananda/netns"
  26. )
  27. const (
  28. bridgeNetType = "bridge"
  29. )
  30. var (
  31. origins = netns.None()
  32. testns = netns.None()
  33. )
  34. var createTesthostNetworkOnce sync.Once
  35. func getTesthostNetwork(t *testing.T) libnetwork.Network {
  36. t.Helper()
  37. createTesthostNetworkOnce.Do(func() {
  38. _, err := createTestNetwork("host", "testhost", options.Generic{}, nil, nil)
  39. if err != nil {
  40. t.Fatal(err)
  41. }
  42. })
  43. n, err := controller.NetworkByName("testhost")
  44. if err != nil {
  45. t.Fatal(err)
  46. }
  47. return n
  48. }
  49. func createGlobalInstance(t *testing.T) {
  50. var err error
  51. defer close(start)
  52. origins, err = netns.Get()
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. testns, err = netns.New()
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. netOption := options.Generic{
  61. netlabel.GenericData: options.Generic{
  62. "BridgeName": "network",
  63. },
  64. }
  65. net1 := getTesthostNetwork(t)
  66. net2, err := createTestNetwork("bridge", "network2", netOption, nil, nil)
  67. if err != nil {
  68. t.Fatal(err)
  69. }
  70. _, err = net1.CreateEndpoint("pep1")
  71. if err != nil {
  72. t.Fatal(err)
  73. }
  74. _, err = net2.CreateEndpoint("pep2")
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. _, err = net2.CreateEndpoint("pep3")
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. if sboxes[first-1], err = controller.NewSandbox(fmt.Sprintf("%drace", first), libnetwork.OptionUseDefaultSandbox()); err != nil {
  83. t.Fatal(err)
  84. }
  85. for thd := first + 1; thd <= last; thd++ {
  86. if sboxes[thd-1], err = controller.NewSandbox(fmt.Sprintf("%drace", thd)); err != nil {
  87. t.Fatal(err)
  88. }
  89. }
  90. }
  91. func TestHost(t *testing.T) {
  92. sbx1, err := controller.NewSandbox("host_c1",
  93. libnetwork.OptionHostname("test1"),
  94. libnetwork.OptionDomainname("docker.io"),
  95. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  96. libnetwork.OptionUseDefaultSandbox())
  97. if err != nil {
  98. t.Fatal(err)
  99. }
  100. defer func() {
  101. if err := sbx1.Delete(); err != nil {
  102. t.Fatal(err)
  103. }
  104. }()
  105. sbx2, err := controller.NewSandbox("host_c2",
  106. libnetwork.OptionHostname("test2"),
  107. libnetwork.OptionDomainname("docker.io"),
  108. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  109. libnetwork.OptionUseDefaultSandbox())
  110. if err != nil {
  111. t.Fatal(err)
  112. }
  113. defer func() {
  114. if err := sbx2.Delete(); err != nil {
  115. t.Fatal(err)
  116. }
  117. }()
  118. network := getTesthostNetwork(t)
  119. ep1, err := network.CreateEndpoint("testep1")
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. if err := ep1.Join(sbx1); err != nil {
  124. t.Fatal(err)
  125. }
  126. ep2, err := network.CreateEndpoint("testep2")
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. if err := ep2.Join(sbx2); err != nil {
  131. t.Fatal(err)
  132. }
  133. if err := ep1.Leave(sbx1); err != nil {
  134. t.Fatal(err)
  135. }
  136. if err := ep2.Leave(sbx2); err != nil {
  137. t.Fatal(err)
  138. }
  139. if err := ep1.Delete(false); err != nil {
  140. t.Fatal(err)
  141. }
  142. if err := ep2.Delete(false); err != nil {
  143. t.Fatal(err)
  144. }
  145. // Try to create another host endpoint and join/leave that.
  146. cnt3, err := controller.NewSandbox("host_c3",
  147. libnetwork.OptionHostname("test3"),
  148. libnetwork.OptionDomainname("docker.io"),
  149. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  150. libnetwork.OptionUseDefaultSandbox())
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. defer func() {
  155. if err := cnt3.Delete(); err != nil {
  156. t.Fatal(err)
  157. }
  158. }()
  159. ep3, err := network.CreateEndpoint("testep3")
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. if err := ep3.Join(sbx2); err != nil {
  164. t.Fatal(err)
  165. }
  166. if err := ep3.Leave(sbx2); err != nil {
  167. t.Fatal(err)
  168. }
  169. if err := ep3.Delete(false); err != nil {
  170. t.Fatal(err)
  171. }
  172. }
  173. // Testing IPV6 from MAC address
  174. func TestBridgeIpv6FromMac(t *testing.T) {
  175. defer testutils.SetupTestOSContext(t)()
  176. netOption := options.Generic{
  177. netlabel.GenericData: options.Generic{
  178. "BridgeName": "testipv6mac",
  179. "EnableICC": true,
  180. "EnableIPMasquerade": true,
  181. },
  182. }
  183. ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", Gateway: "192.168.100.1"}}
  184. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
  185. network, err := controller.NewNetwork(bridgeNetType, "testipv6mac", "",
  186. libnetwork.NetworkOptionGeneric(netOption),
  187. libnetwork.NetworkOptionEnableIPv6(true),
  188. libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4ConfList, ipamV6ConfList, nil),
  189. libnetwork.NetworkOptionDeferIPv6Alloc(true))
  190. if err != nil {
  191. t.Fatal(err)
  192. }
  193. mac := net.HardwareAddr{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
  194. epOption := options.Generic{netlabel.MacAddress: mac}
  195. ep, err := network.CreateEndpoint("testep", libnetwork.EndpointOptionGeneric(epOption))
  196. if err != nil {
  197. t.Fatal(err)
  198. }
  199. iface := ep.Info().Iface()
  200. if !bytes.Equal(iface.MacAddress(), mac) {
  201. t.Fatalf("Unexpected mac address: %v", iface.MacAddress())
  202. }
  203. ip, expIP, _ := net.ParseCIDR("fe90::aabb:ccdd:eeff/64")
  204. expIP.IP = ip
  205. if !types.CompareIPNet(expIP, iface.AddressIPv6()) {
  206. t.Fatalf("Expected %v. Got: %v", expIP, iface.AddressIPv6())
  207. }
  208. if err := ep.Delete(false); err != nil {
  209. t.Fatal(err)
  210. }
  211. if err := network.Delete(); err != nil {
  212. t.Fatal(err)
  213. }
  214. }
  215. func checkSandbox(t *testing.T, info libnetwork.EndpointInfo) {
  216. key := info.Sandbox().Key()
  217. sbNs, err := netns.GetFromPath(key)
  218. if err != nil {
  219. t.Fatalf("Failed to get network namespace path %q: %v", key, err)
  220. }
  221. defer sbNs.Close()
  222. nh, err := netlink.NewHandleAt(sbNs)
  223. if err != nil {
  224. t.Fatal(err)
  225. }
  226. _, err = nh.LinkByName("eth0")
  227. if err != nil {
  228. t.Fatalf("Could not find the interface eth0 inside the sandbox: %v", err)
  229. }
  230. _, err = nh.LinkByName("eth1")
  231. if err != nil {
  232. t.Fatalf("Could not find the interface eth1 inside the sandbox: %v", err)
  233. }
  234. }
  235. func TestEndpointJoin(t *testing.T) {
  236. defer testutils.SetupTestOSContext(t)()
  237. // Create network 1 and add 2 endpoint: ep11, ep12
  238. netOption := options.Generic{
  239. netlabel.GenericData: options.Generic{
  240. "BridgeName": "testnetwork1",
  241. "EnableICC": true,
  242. "EnableIPMasquerade": true,
  243. },
  244. }
  245. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
  246. n1, err := controller.NewNetwork(bridgeNetType, "testnetwork1", "",
  247. libnetwork.NetworkOptionGeneric(netOption),
  248. libnetwork.NetworkOptionEnableIPv6(true),
  249. libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", nil, ipamV6ConfList, nil),
  250. libnetwork.NetworkOptionDeferIPv6Alloc(true))
  251. if err != nil {
  252. t.Fatal(err)
  253. }
  254. defer func() {
  255. if err := n1.Delete(); err != nil {
  256. t.Fatal(err)
  257. }
  258. }()
  259. ep1, err := n1.CreateEndpoint("ep1")
  260. if err != nil {
  261. t.Fatal(err)
  262. }
  263. defer func() {
  264. if err := ep1.Delete(false); err != nil {
  265. t.Fatal(err)
  266. }
  267. }()
  268. // Validate if ep.Info() only gives me IP address info and not names and gateway during CreateEndpoint()
  269. info := ep1.Info()
  270. iface := info.Iface()
  271. if iface.Address() != nil && iface.Address().IP.To4() == nil {
  272. t.Fatalf("Invalid IP address returned: %v", iface.Address())
  273. }
  274. if iface.AddressIPv6() != nil && iface.AddressIPv6().IP == nil {
  275. t.Fatalf("Invalid IPv6 address returned: %v", iface.Address())
  276. }
  277. if len(info.Gateway()) != 0 {
  278. t.Fatalf("Expected empty gateway for an empty endpoint. Instead found a gateway: %v", info.Gateway())
  279. }
  280. if len(info.GatewayIPv6()) != 0 {
  281. t.Fatalf("Expected empty gateway for an empty ipv6 endpoint. Instead found a gateway: %v", info.GatewayIPv6())
  282. }
  283. if info.Sandbox() != nil {
  284. t.Fatalf("Expected an empty sandbox key for an empty endpoint. Instead found a non-empty sandbox key: %s", info.Sandbox().Key())
  285. }
  286. // test invalid joins
  287. err = ep1.Join(nil)
  288. if err == nil {
  289. t.Fatalf("Expected to fail join with nil Sandbox")
  290. }
  291. if _, ok := err.(types.BadRequestError); !ok {
  292. t.Fatalf("Unexpected error type returned: %T", err)
  293. }
  294. fsbx := &fakeSandbox{}
  295. if err = ep1.Join(fsbx); err == nil {
  296. t.Fatalf("Expected to fail join with invalid Sandbox")
  297. }
  298. if _, ok := err.(types.BadRequestError); !ok {
  299. t.Fatalf("Unexpected error type returned: %T", err)
  300. }
  301. sb, err := controller.NewSandbox(containerID,
  302. libnetwork.OptionHostname("test"),
  303. libnetwork.OptionDomainname("docker.io"),
  304. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  305. if err != nil {
  306. t.Fatal(err)
  307. }
  308. defer func() {
  309. if err := sb.Delete(); err != nil {
  310. t.Fatal(err)
  311. }
  312. }()
  313. err = ep1.Join(sb)
  314. if err != nil {
  315. t.Fatal(err)
  316. }
  317. defer func() {
  318. err = ep1.Leave(sb)
  319. if err != nil {
  320. t.Fatal(err)
  321. }
  322. }()
  323. // Validate if ep.Info() only gives valid gateway and sandbox key after has container has joined.
  324. info = ep1.Info()
  325. if len(info.Gateway()) == 0 {
  326. t.Fatalf("Expected a valid gateway for a joined endpoint. Instead found an invalid gateway: %v", info.Gateway())
  327. }
  328. if len(info.GatewayIPv6()) == 0 {
  329. t.Fatalf("Expected a valid ipv6 gateway for a joined endpoint. Instead found an invalid gateway: %v", info.GatewayIPv6())
  330. }
  331. if info.Sandbox() == nil {
  332. t.Fatalf("Expected an non-empty sandbox key for a joined endpoint. Instead found an empty sandbox key")
  333. }
  334. // Check endpoint provided container information
  335. if ep1.Info().Sandbox().Key() != sb.Key() {
  336. t.Fatalf("Endpoint Info returned unexpected sandbox key: %s", sb.Key())
  337. }
  338. // Attempt retrieval of endpoint interfaces statistics
  339. stats, err := sb.Statistics()
  340. if err != nil {
  341. t.Fatal(err)
  342. }
  343. if _, ok := stats["eth0"]; !ok {
  344. t.Fatalf("Did not find eth0 statistics")
  345. }
  346. // Now test the container joining another network
  347. n2, err := createTestNetwork(bridgeNetType, "testnetwork2",
  348. options.Generic{
  349. netlabel.GenericData: options.Generic{
  350. "BridgeName": "testnetwork2",
  351. },
  352. }, nil, nil)
  353. if err != nil {
  354. t.Fatal(err)
  355. }
  356. defer func() {
  357. if err := n2.Delete(); err != nil {
  358. t.Fatal(err)
  359. }
  360. }()
  361. ep2, err := n2.CreateEndpoint("ep2")
  362. if err != nil {
  363. t.Fatal(err)
  364. }
  365. defer func() {
  366. if err := ep2.Delete(false); err != nil {
  367. t.Fatal(err)
  368. }
  369. }()
  370. err = ep2.Join(sb)
  371. if err != nil {
  372. t.Fatal(err)
  373. }
  374. defer func() {
  375. err = ep2.Leave(sb)
  376. if err != nil {
  377. t.Fatal(err)
  378. }
  379. }()
  380. if ep1.Info().Sandbox().Key() != ep2.Info().Sandbox().Key() {
  381. t.Fatalf("ep1 and ep2 returned different container sandbox key")
  382. }
  383. checkSandbox(t, info)
  384. }
  385. func TestExternalKey(t *testing.T) {
  386. externalKeyTest(t, false)
  387. }
  388. func externalKeyTest(t *testing.T, reexec bool) {
  389. defer testutils.SetupTestOSContext(t)()
  390. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{
  391. netlabel.GenericData: options.Generic{
  392. "BridgeName": "testnetwork",
  393. },
  394. }, nil, nil)
  395. if err != nil {
  396. t.Fatal(err)
  397. }
  398. defer func() {
  399. if err := n.Delete(); err != nil {
  400. t.Fatal(err)
  401. }
  402. }()
  403. n2, err := createTestNetwork(bridgeNetType, "testnetwork2", options.Generic{
  404. netlabel.GenericData: options.Generic{
  405. "BridgeName": "testnetwork2",
  406. },
  407. }, nil, nil)
  408. if err != nil {
  409. t.Fatal(err)
  410. }
  411. defer func() {
  412. if err := n2.Delete(); err != nil {
  413. t.Fatal(err)
  414. }
  415. }()
  416. ep, err := n.CreateEndpoint("ep1")
  417. if err != nil {
  418. t.Fatal(err)
  419. }
  420. defer func() {
  421. err = ep.Delete(false)
  422. if err != nil {
  423. t.Fatal(err)
  424. }
  425. }()
  426. ep2, err := n2.CreateEndpoint("ep2")
  427. if err != nil {
  428. t.Fatal(err)
  429. }
  430. defer func() {
  431. err = ep2.Delete(false)
  432. if err != nil {
  433. t.Fatal(err)
  434. }
  435. }()
  436. cnt, err := controller.NewSandbox(containerID,
  437. libnetwork.OptionHostname("test"),
  438. libnetwork.OptionDomainname("docker.io"),
  439. libnetwork.OptionUseExternalKey(),
  440. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  441. defer func() {
  442. if err := cnt.Delete(); err != nil {
  443. t.Fatal(err)
  444. }
  445. osl.GC()
  446. }()
  447. // Join endpoint to sandbox before SetKey
  448. err = ep.Join(cnt)
  449. if err != nil {
  450. t.Fatal(err)
  451. }
  452. defer func() {
  453. err = ep.Leave(cnt)
  454. if err != nil {
  455. t.Fatal(err)
  456. }
  457. }()
  458. sbox := ep.Info().Sandbox()
  459. if sbox == nil {
  460. t.Fatalf("Expected to have a valid Sandbox")
  461. }
  462. if reexec {
  463. err := reexecSetKey("this-must-fail", containerID, controller.ID())
  464. if err == nil {
  465. t.Fatalf("SetExternalKey must fail if the corresponding namespace is not created")
  466. }
  467. } else {
  468. // Setting an non-existing key (namespace) must fail
  469. if err := sbox.SetKey("this-must-fail"); err == nil {
  470. t.Fatalf("Setkey must fail if the corresponding namespace is not created")
  471. }
  472. }
  473. // Create a new OS sandbox using the osl API before using it in SetKey
  474. if extOsBox, err := osl.NewSandbox("ValidKey", true, false); err != nil {
  475. t.Fatalf("Failed to create new osl sandbox")
  476. } else {
  477. defer func() {
  478. if err := extOsBox.Destroy(); err != nil {
  479. logrus.Warnf("Failed to remove os sandbox: %v", err)
  480. }
  481. }()
  482. }
  483. if reexec {
  484. err := reexecSetKey("ValidKey", containerID, controller.ID())
  485. if err != nil {
  486. t.Fatalf("SetExternalKey failed with %v", err)
  487. }
  488. } else {
  489. if err := sbox.SetKey("ValidKey"); err != nil {
  490. t.Fatalf("Setkey failed with %v", err)
  491. }
  492. }
  493. // Join endpoint to sandbox after SetKey
  494. err = ep2.Join(sbox)
  495. if err != nil {
  496. t.Fatal(err)
  497. }
  498. defer func() {
  499. err = ep2.Leave(sbox)
  500. if err != nil {
  501. t.Fatal(err)
  502. }
  503. }()
  504. if ep.Info().Sandbox().Key() != ep2.Info().Sandbox().Key() {
  505. t.Fatalf("ep1 and ep2 returned different container sandbox key")
  506. }
  507. checkSandbox(t, ep.Info())
  508. }
  509. func reexecSetKey(key string, containerID string, controllerID string) error {
  510. type libcontainerState struct {
  511. NamespacePaths map[string]string
  512. }
  513. var (
  514. state libcontainerState
  515. b []byte
  516. err error
  517. )
  518. state.NamespacePaths = make(map[string]string)
  519. state.NamespacePaths["NEWNET"] = key
  520. if b, err = json.Marshal(state); err != nil {
  521. return err
  522. }
  523. cmd := &exec.Cmd{
  524. Path: reexec.Self(),
  525. Args: append([]string{"libnetwork-setkey"}, containerID, controllerID),
  526. Stdin: strings.NewReader(string(b)),
  527. Stdout: os.Stdout,
  528. Stderr: os.Stderr,
  529. }
  530. return cmd.Run()
  531. }
  532. func TestEnableIPv6(t *testing.T) {
  533. defer testutils.SetupTestOSContext(t)()
  534. tmpResolvConf := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\nnameserver 2001:4860:4860::8888\n")
  535. expectedResolvConf := []byte("search pommesfrites.fr\nnameserver 127.0.0.11\nnameserver 2001:4860:4860::8888\noptions ndots:0\n")
  536. // take a copy of resolv.conf for restoring after test completes
  537. resolvConfSystem, err := os.ReadFile("/etc/resolv.conf")
  538. if err != nil {
  539. t.Fatal(err)
  540. }
  541. // cleanup
  542. defer func() {
  543. if err := os.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil {
  544. t.Fatal(err)
  545. }
  546. }()
  547. netOption := options.Generic{
  548. netlabel.EnableIPv6: true,
  549. netlabel.GenericData: options.Generic{
  550. "BridgeName": "testnetwork",
  551. },
  552. }
  553. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe99::/64", Gateway: "fe99::9"}}
  554. n, err := createTestNetwork("bridge", "testnetwork", netOption, nil, ipamV6ConfList)
  555. if err != nil {
  556. t.Fatal(err)
  557. }
  558. defer func() {
  559. if err := n.Delete(); err != nil {
  560. t.Fatal(err)
  561. }
  562. }()
  563. ep1, err := n.CreateEndpoint("ep1")
  564. if err != nil {
  565. t.Fatal(err)
  566. }
  567. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf, 0644); err != nil {
  568. t.Fatal(err)
  569. }
  570. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  571. defer os.Remove(resolvConfPath)
  572. sb, err := controller.NewSandbox(containerID, libnetwork.OptionResolvConfPath(resolvConfPath))
  573. if err != nil {
  574. t.Fatal(err)
  575. }
  576. defer func() {
  577. if err := sb.Delete(); err != nil {
  578. t.Fatal(err)
  579. }
  580. }()
  581. err = ep1.Join(sb)
  582. if err != nil {
  583. t.Fatal(err)
  584. }
  585. content, err := os.ReadFile(resolvConfPath)
  586. if err != nil {
  587. t.Fatal(err)
  588. }
  589. if !bytes.Equal(content, expectedResolvConf) {
  590. t.Fatalf("Expected:\n%s\nGot:\n%s", string(expectedResolvConf), string(content))
  591. }
  592. if err != nil {
  593. t.Fatal(err)
  594. }
  595. }
  596. func TestResolvConfHost(t *testing.T) {
  597. defer testutils.SetupTestOSContext(t)()
  598. tmpResolvConf := []byte("search localhost.net\nnameserver 127.0.0.1\nnameserver 2001:4860:4860::8888\n")
  599. // take a copy of resolv.conf for restoring after test completes
  600. resolvConfSystem, err := os.ReadFile("/etc/resolv.conf")
  601. if err != nil {
  602. t.Fatal(err)
  603. }
  604. // cleanup
  605. defer func() {
  606. if err := os.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil {
  607. t.Fatal(err)
  608. }
  609. }()
  610. n := getTesthostNetwork(t)
  611. ep1, err := n.CreateEndpoint("ep1", libnetwork.CreateOptionDisableResolution())
  612. if err != nil {
  613. t.Fatal(err)
  614. }
  615. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf, 0644); err != nil {
  616. t.Fatal(err)
  617. }
  618. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  619. defer os.Remove(resolvConfPath)
  620. sb, err := controller.NewSandbox(containerID,
  621. libnetwork.OptionUseDefaultSandbox(),
  622. libnetwork.OptionResolvConfPath(resolvConfPath),
  623. libnetwork.OptionOriginResolvConfPath("/etc/resolv.conf"))
  624. if err != nil {
  625. t.Fatal(err)
  626. }
  627. defer func() {
  628. if err := sb.Delete(); err != nil {
  629. t.Fatal(err)
  630. }
  631. }()
  632. err = ep1.Join(sb)
  633. if err != nil {
  634. t.Fatal(err)
  635. }
  636. defer func() {
  637. err = ep1.Leave(sb)
  638. if err != nil {
  639. t.Fatal(err)
  640. }
  641. }()
  642. finfo, err := os.Stat(resolvConfPath)
  643. if err != nil {
  644. t.Fatal(err)
  645. }
  646. fmode := (os.FileMode)(0644)
  647. if finfo.Mode() != fmode {
  648. t.Fatalf("Expected file mode %s, got %s", fmode.String(), finfo.Mode().String())
  649. }
  650. content, err := os.ReadFile(resolvConfPath)
  651. if err != nil {
  652. t.Fatal(err)
  653. }
  654. if !bytes.Equal(content, tmpResolvConf) {
  655. t.Fatalf("Expected:\n%s\nGot:\n%s", string(tmpResolvConf), string(content))
  656. }
  657. }
  658. func TestResolvConf(t *testing.T) {
  659. defer testutils.SetupTestOSContext(t)()
  660. tmpResolvConf1 := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\nnameserver 2001:4860:4860::8888\n")
  661. tmpResolvConf2 := []byte("search pommesfrites.fr\nnameserver 112.34.56.78\nnameserver 2001:4860:4860::8888\n")
  662. expectedResolvConf1 := []byte("search pommesfrites.fr\nnameserver 127.0.0.11\noptions ndots:0\n")
  663. tmpResolvConf3 := []byte("search pommesfrites.fr\nnameserver 113.34.56.78\n")
  664. // take a copy of resolv.conf for restoring after test completes
  665. resolvConfSystem, err := os.ReadFile("/etc/resolv.conf")
  666. if err != nil {
  667. t.Fatal(err)
  668. }
  669. // cleanup
  670. defer func() {
  671. if err := os.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil {
  672. t.Fatal(err)
  673. }
  674. }()
  675. netOption := options.Generic{
  676. netlabel.GenericData: options.Generic{
  677. "BridgeName": "testnetwork",
  678. },
  679. }
  680. n, err := createTestNetwork("bridge", "testnetwork", netOption, nil, nil)
  681. if err != nil {
  682. t.Fatal(err)
  683. }
  684. defer func() {
  685. if err := n.Delete(); err != nil {
  686. t.Fatal(err)
  687. }
  688. }()
  689. ep, err := n.CreateEndpoint("ep")
  690. if err != nil {
  691. t.Fatal(err)
  692. }
  693. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf1, 0644); err != nil {
  694. t.Fatal(err)
  695. }
  696. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  697. defer os.Remove(resolvConfPath)
  698. sb1, err := controller.NewSandbox(containerID, libnetwork.OptionResolvConfPath(resolvConfPath))
  699. if err != nil {
  700. t.Fatal(err)
  701. }
  702. defer func() {
  703. if err := sb1.Delete(); err != nil {
  704. t.Fatal(err)
  705. }
  706. }()
  707. err = ep.Join(sb1)
  708. if err != nil {
  709. t.Fatal(err)
  710. }
  711. finfo, err := os.Stat(resolvConfPath)
  712. if err != nil {
  713. t.Fatal(err)
  714. }
  715. fmode := (os.FileMode)(0644)
  716. if finfo.Mode() != fmode {
  717. t.Fatalf("Expected file mode %s, got %s", fmode.String(), finfo.Mode().String())
  718. }
  719. content, err := os.ReadFile(resolvConfPath)
  720. if err != nil {
  721. t.Fatal(err)
  722. }
  723. if !bytes.Equal(content, expectedResolvConf1) {
  724. fmt.Printf("\n%v\n%v\n", expectedResolvConf1, content)
  725. t.Fatalf("Expected:\n%s\nGot:\n%s", string(expectedResolvConf1), string(content))
  726. }
  727. err = ep.Leave(sb1)
  728. if err != nil {
  729. t.Fatal(err)
  730. }
  731. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf2, 0644); err != nil {
  732. t.Fatal(err)
  733. }
  734. sb2, err := controller.NewSandbox(containerID+"_2", libnetwork.OptionResolvConfPath(resolvConfPath))
  735. if err != nil {
  736. t.Fatal(err)
  737. }
  738. defer func() {
  739. if err := sb2.Delete(); err != nil {
  740. t.Fatal(err)
  741. }
  742. }()
  743. err = ep.Join(sb2)
  744. if err != nil {
  745. t.Fatal(err)
  746. }
  747. content, err = os.ReadFile(resolvConfPath)
  748. if err != nil {
  749. t.Fatal(err)
  750. }
  751. if !bytes.Equal(content, expectedResolvConf1) {
  752. t.Fatalf("Expected:\n%s\nGot:\n%s", string(expectedResolvConf1), string(content))
  753. }
  754. if err := os.WriteFile(resolvConfPath, tmpResolvConf3, 0644); err != nil {
  755. t.Fatal(err)
  756. }
  757. err = ep.Leave(sb2)
  758. if err != nil {
  759. t.Fatal(err)
  760. }
  761. err = ep.Join(sb2)
  762. if err != nil {
  763. t.Fatal(err)
  764. }
  765. content, err = os.ReadFile(resolvConfPath)
  766. if err != nil {
  767. t.Fatal(err)
  768. }
  769. if !bytes.Equal(content, tmpResolvConf3) {
  770. t.Fatalf("Expected:\n%s\nGot:\n%s", string(tmpResolvConf3), string(content))
  771. }
  772. }
  773. func parallelJoin(t *testing.T, rc libnetwork.Sandbox, ep libnetwork.Endpoint, thrNumber int) {
  774. debugf("J%d.", thrNumber)
  775. var err error
  776. sb := sboxes[thrNumber-1]
  777. err = ep.Join(sb)
  778. if err != nil {
  779. if _, ok := err.(types.ForbiddenError); !ok {
  780. t.Fatalf("thread %d: %v", thrNumber, err)
  781. }
  782. debugf("JE%d(%v).", thrNumber, err)
  783. }
  784. debugf("JD%d.", thrNumber)
  785. }
  786. func parallelLeave(t *testing.T, rc libnetwork.Sandbox, ep libnetwork.Endpoint, thrNumber int) {
  787. debugf("L%d.", thrNumber)
  788. var err error
  789. sb := sboxes[thrNumber-1]
  790. err = ep.Leave(sb)
  791. if err != nil {
  792. if _, ok := err.(types.ForbiddenError); !ok {
  793. t.Fatalf("thread %d: %v", thrNumber, err)
  794. }
  795. debugf("LE%d(%v).", thrNumber, err)
  796. }
  797. debugf("LD%d.", thrNumber)
  798. }
  799. func runParallelTests(t *testing.T, thrNumber int) {
  800. var (
  801. ep libnetwork.Endpoint
  802. sb libnetwork.Sandbox
  803. err error
  804. )
  805. t.Parallel()
  806. pTest := flag.Lookup("test.parallel")
  807. if pTest == nil {
  808. t.Skip("Skipped because test.parallel flag not set;")
  809. }
  810. numParallel, err := strconv.Atoi(pTest.Value.String())
  811. if err != nil {
  812. t.Fatal(err)
  813. }
  814. if numParallel < numThreads {
  815. t.Skip("Skipped because t.parallel was less than ", numThreads)
  816. }
  817. runtime.LockOSThread()
  818. if thrNumber == first {
  819. createGlobalInstance(t)
  820. } else {
  821. <-start
  822. thrdone := make(chan struct{})
  823. done <- thrdone
  824. defer close(thrdone)
  825. if thrNumber == last {
  826. defer close(done)
  827. }
  828. err = netns.Set(testns)
  829. if err != nil {
  830. runtime.UnlockOSThread()
  831. t.Fatal(err)
  832. }
  833. }
  834. defer func() {
  835. if err := netns.Set(origins); err != nil {
  836. t.Fatalf("Error restoring the current thread's netns: %v", err)
  837. } else {
  838. runtime.UnlockOSThread()
  839. }
  840. }()
  841. net1 := getTesthostNetwork(t)
  842. if net1 == nil {
  843. t.Fatal("Could not find testhost")
  844. }
  845. net2, err := controller.NetworkByName("network2")
  846. if err != nil {
  847. t.Fatal(err)
  848. }
  849. if net2 == nil {
  850. t.Fatal("Could not find network2")
  851. }
  852. epName := fmt.Sprintf("pep%d", thrNumber)
  853. if thrNumber == first {
  854. ep, err = net1.EndpointByName(epName)
  855. } else {
  856. ep, err = net2.EndpointByName(epName)
  857. }
  858. if err != nil {
  859. t.Fatal(err)
  860. }
  861. if ep == nil {
  862. t.Fatal("Got nil ep with no error")
  863. }
  864. cid := fmt.Sprintf("%drace", thrNumber)
  865. controller.WalkSandboxes(libnetwork.SandboxContainerWalker(&sb, cid))
  866. if sb == nil {
  867. t.Fatalf("Got nil sandbox for container: %s", cid)
  868. }
  869. for i := 0; i < iterCnt; i++ {
  870. parallelJoin(t, sb, ep, thrNumber)
  871. parallelLeave(t, sb, ep, thrNumber)
  872. }
  873. debugf("\n")
  874. err = sb.Delete()
  875. if err != nil {
  876. t.Fatal(err)
  877. }
  878. if thrNumber == first {
  879. for thrdone := range done {
  880. <-thrdone
  881. }
  882. if testns != origins {
  883. testns.Close()
  884. }
  885. if err := net2.Delete(); err != nil {
  886. t.Fatal(err)
  887. }
  888. } else {
  889. err = ep.Delete(false)
  890. if err != nil {
  891. t.Fatal(err)
  892. }
  893. }
  894. }
  895. func TestParallel1(t *testing.T) {
  896. runParallelTests(t, 1)
  897. }
  898. func TestParallel2(t *testing.T) {
  899. runParallelTests(t, 2)
  900. }
  901. func TestBridge(t *testing.T) {
  902. defer testutils.SetupTestOSContext(t)()
  903. netOption := options.Generic{
  904. netlabel.EnableIPv6: true,
  905. netlabel.GenericData: options.Generic{
  906. "BridgeName": "testnetwork",
  907. "EnableICC": true,
  908. "EnableIPMasquerade": true,
  909. },
  910. }
  911. ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", Gateway: "192.168.100.1"}}
  912. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
  913. network, err := createTestNetwork(bridgeNetType, "testnetwork", netOption, ipamV4ConfList, ipamV6ConfList)
  914. if err != nil {
  915. t.Fatal(err)
  916. }
  917. defer func() {
  918. if err := network.Delete(); err != nil {
  919. t.Fatal(err)
  920. }
  921. }()
  922. ep, err := network.CreateEndpoint("testep")
  923. if err != nil {
  924. t.Fatal(err)
  925. }
  926. sb, err := controller.NewSandbox(containerID, libnetwork.OptionPortMapping(getPortMapping()))
  927. if err != nil {
  928. t.Fatal(err)
  929. }
  930. defer func() {
  931. if err := sb.Delete(); err != nil {
  932. t.Fatal(err)
  933. }
  934. }()
  935. err = ep.Join(sb)
  936. if err != nil {
  937. t.Fatal(err)
  938. }
  939. epInfo, err := ep.DriverInfo()
  940. if err != nil {
  941. t.Fatal(err)
  942. }
  943. pmd, ok := epInfo[netlabel.PortMap]
  944. if !ok {
  945. t.Fatalf("Could not find expected info in endpoint data")
  946. }
  947. pm, ok := pmd.([]types.PortBinding)
  948. if !ok {
  949. t.Fatalf("Unexpected format for port mapping in endpoint operational data")
  950. }
  951. expectedLen := 10
  952. if !isV6Listenable() {
  953. expectedLen = 5
  954. }
  955. if len(pm) != expectedLen {
  956. t.Fatalf("Incomplete data for port mapping in endpoint operational data: %d", len(pm))
  957. }
  958. }
  959. var (
  960. v6ListenableCached bool
  961. v6ListenableOnce sync.Once
  962. )
  963. // This is copied from the bridge driver package b/c the bridge driver is not platform agnostic.
  964. func isV6Listenable() bool {
  965. v6ListenableOnce.Do(func() {
  966. ln, err := net.Listen("tcp6", "[::1]:0")
  967. if err != nil {
  968. // When the kernel was booted with `ipv6.disable=1`,
  969. // we get err "listen tcp6 [::1]:0: socket: address family not supported by protocol"
  970. // https://github.com/moby/moby/issues/42288
  971. logrus.Debugf("port_mapping: v6Listenable=false (%v)", err)
  972. } else {
  973. v6ListenableCached = true
  974. ln.Close()
  975. }
  976. })
  977. return v6ListenableCached
  978. }
  979. func TestParallel3(t *testing.T) {
  980. runParallelTests(t, 3)
  981. }
  982. func TestNullIpam(t *testing.T) {
  983. _, err := controller.NewNetwork(bridgeNetType, "testnetworkinternal", "", libnetwork.NetworkOptionIpam(ipamapi.NullIPAM, "", nil, nil, nil))
  984. if err == nil || err.Error() != "ipv4 pool is empty" {
  985. t.Fatal("bridge network should complain empty pool")
  986. }
  987. }