libnetwork_linux_test.go 24 KB

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