libnetwork_linux_test.go 26 KB

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