libnetwork_linux_test.go 26 KB

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