libnetwork_linux_test.go 25 KB

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