libnetwork_test.go 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540
  1. package libnetwork_test
  2. import (
  3. "bytes"
  4. "flag"
  5. "fmt"
  6. "io/ioutil"
  7. "net"
  8. "net/http"
  9. "net/http/httptest"
  10. "os"
  11. "runtime"
  12. "strconv"
  13. "sync"
  14. "testing"
  15. log "github.com/Sirupsen/logrus"
  16. "github.com/docker/docker/pkg/plugins"
  17. "github.com/docker/docker/pkg/reexec"
  18. "github.com/docker/libnetwork"
  19. "github.com/docker/libnetwork/datastore"
  20. "github.com/docker/libnetwork/driverapi"
  21. "github.com/docker/libnetwork/netlabel"
  22. "github.com/docker/libnetwork/netutils"
  23. "github.com/docker/libnetwork/options"
  24. "github.com/docker/libnetwork/types"
  25. "github.com/vishvananda/netlink"
  26. "github.com/vishvananda/netns"
  27. )
  28. const (
  29. bridgeNetType = "bridge"
  30. bridgeName = "docker0"
  31. )
  32. func TestMain(m *testing.M) {
  33. if reexec.Init() {
  34. return
  35. }
  36. os.Exit(m.Run())
  37. }
  38. func createTestController() (libnetwork.NetworkController, error) {
  39. controller, err := libnetwork.New("")
  40. if err != nil {
  41. return nil, err
  42. }
  43. libnetwork.SetTestDataStore(controller, datastore.NewCustomDataStore(datastore.NewMockStore()))
  44. return controller, nil
  45. }
  46. func createTestNetwork(networkType, networkName string, option options.Generic, netOption options.Generic) (libnetwork.Network, error) {
  47. controller, err := createTestController()
  48. if err != nil {
  49. return nil, err
  50. }
  51. genericOption := make(map[string]interface{})
  52. genericOption[netlabel.GenericData] = option
  53. err = controller.ConfigureNetworkDriver(networkType, genericOption)
  54. if err != nil {
  55. return nil, err
  56. }
  57. network, err := controller.NewNetwork(networkType, networkName,
  58. libnetwork.NetworkOptionGeneric(netOption))
  59. if err != nil {
  60. return nil, err
  61. }
  62. return network, nil
  63. }
  64. func getEmptyGenericOption() map[string]interface{} {
  65. genericOption := make(map[string]interface{})
  66. genericOption[netlabel.GenericData] = options.Generic{}
  67. return genericOption
  68. }
  69. func getPortMapping() []types.PortBinding {
  70. return []types.PortBinding{
  71. types.PortBinding{Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  72. types.PortBinding{Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  73. types.PortBinding{Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  74. }
  75. }
  76. func TestNull(t *testing.T) {
  77. network, err := createTestNetwork("null", "testnetwork", options.Generic{},
  78. options.Generic{})
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. ep, err := network.CreateEndpoint("testep")
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. _, err = ep.Join("null_container",
  87. libnetwork.JoinOptionHostname("test"),
  88. libnetwork.JoinOptionDomainname("docker.io"),
  89. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"))
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. err = ep.Leave("null_container")
  94. if err != nil {
  95. t.Fatal(err)
  96. }
  97. if err := ep.Delete(); err != nil {
  98. t.Fatal(err)
  99. }
  100. if err := network.Delete(); err != nil {
  101. t.Fatal(err)
  102. }
  103. }
  104. func TestHost(t *testing.T) {
  105. network, err := createTestNetwork("host", "testnetwork", options.Generic{}, options.Generic{})
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. ep1, err := network.CreateEndpoint("testep1")
  110. if err != nil {
  111. t.Fatal(err)
  112. }
  113. _, err = ep1.Join("host_container1",
  114. libnetwork.JoinOptionHostname("test1"),
  115. libnetwork.JoinOptionDomainname("docker.io"),
  116. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"),
  117. libnetwork.JoinOptionUseDefaultSandbox())
  118. if err != nil {
  119. t.Fatal(err)
  120. }
  121. ep2, err := network.CreateEndpoint("testep2")
  122. if err != nil {
  123. t.Fatal(err)
  124. }
  125. _, err = ep2.Join("host_container2",
  126. libnetwork.JoinOptionHostname("test2"),
  127. libnetwork.JoinOptionDomainname("docker.io"),
  128. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"),
  129. libnetwork.JoinOptionUseDefaultSandbox())
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. err = ep1.Leave("host_container1")
  134. if err != nil {
  135. t.Fatal(err)
  136. }
  137. err = ep2.Leave("host_container2")
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. if err := ep1.Delete(); err != nil {
  142. t.Fatal(err)
  143. }
  144. if err := ep2.Delete(); err != nil {
  145. t.Fatal(err)
  146. }
  147. // Try to create another host endpoint and join/leave that.
  148. ep3, err := network.CreateEndpoint("testep3")
  149. if err != nil {
  150. t.Fatal(err)
  151. }
  152. _, err = ep3.Join("host_container3",
  153. libnetwork.JoinOptionHostname("test3"),
  154. libnetwork.JoinOptionDomainname("docker.io"),
  155. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"),
  156. libnetwork.JoinOptionUseDefaultSandbox())
  157. if err != nil {
  158. t.Fatal(err)
  159. }
  160. err = ep3.Leave("host_container3")
  161. if err != nil {
  162. t.Fatal(err)
  163. }
  164. if err := ep3.Delete(); err != nil {
  165. t.Fatal(err)
  166. }
  167. if err := network.Delete(); err != nil {
  168. t.Fatal(err)
  169. }
  170. }
  171. func TestBridge(t *testing.T) {
  172. if !netutils.IsRunningInContainer() {
  173. defer netutils.SetupTestNetNS(t)()
  174. }
  175. ip, subnet, err := net.ParseCIDR("192.168.100.1/24")
  176. if err != nil {
  177. t.Fatal(err)
  178. }
  179. subnet.IP = ip
  180. ip, cidr, err := net.ParseCIDR("192.168.100.2/28")
  181. if err != nil {
  182. t.Fatal(err)
  183. }
  184. cidr.IP = ip
  185. ip, cidrv6, err := net.ParseCIDR("fe90::1/96")
  186. if err != nil {
  187. t.Fatal(err)
  188. }
  189. cidrv6.IP = ip
  190. log.Debug("Adding a bridge")
  191. option := options.Generic{
  192. "EnableIPForwarding": true,
  193. }
  194. netOption := options.Generic{
  195. netlabel.GenericData: options.Generic{
  196. "BridgeName": bridgeName,
  197. "AddressIPv4": subnet,
  198. "FixedCIDR": cidr,
  199. "FixedCIDRv6": cidrv6,
  200. "EnableIPv6": true,
  201. "EnableIPTables": true,
  202. "EnableIPMasquerade": true,
  203. "EnableICC": true,
  204. "AllowNonDefaultBridge": true,
  205. },
  206. }
  207. network, err := createTestNetwork(bridgeNetType, "testnetwork", option, netOption)
  208. if err != nil {
  209. t.Fatal(err)
  210. }
  211. ep, err := network.CreateEndpoint("testep", libnetwork.CreateOptionPortMapping(getPortMapping()))
  212. if err != nil {
  213. t.Fatal(err)
  214. }
  215. epInfo, err := ep.DriverInfo()
  216. if err != nil {
  217. t.Fatal(err)
  218. }
  219. pmd, ok := epInfo[netlabel.PortMap]
  220. if !ok {
  221. t.Fatalf("Could not find expected info in endpoint data")
  222. }
  223. pm, ok := pmd.([]types.PortBinding)
  224. if !ok {
  225. t.Fatalf("Unexpected format for port mapping in endpoint operational data")
  226. }
  227. if len(pm) != 3 {
  228. t.Fatalf("Incomplete data for port mapping in endpoint operational data: %d", len(pm))
  229. }
  230. if err := ep.Delete(); err != nil {
  231. t.Fatal(err)
  232. }
  233. if err := network.Delete(); err != nil {
  234. t.Fatal(err)
  235. }
  236. }
  237. func TestUnknownDriver(t *testing.T) {
  238. if !netutils.IsRunningInContainer() {
  239. defer netutils.SetupTestNetNS(t)()
  240. }
  241. _, err := createTestNetwork("unknowndriver", "testnetwork", options.Generic{}, options.Generic{})
  242. if err == nil {
  243. t.Fatal("Expected to fail. But instead succeeded")
  244. }
  245. if _, ok := err.(libnetwork.NetworkTypeError); !ok {
  246. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  247. }
  248. }
  249. func TestNilRemoteDriver(t *testing.T) {
  250. controller, err := createTestController()
  251. if err != nil {
  252. t.Fatal(err)
  253. }
  254. _, err = controller.NewNetwork("framerelay", "dummy",
  255. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  256. if err == nil {
  257. t.Fatal("Expected to fail. But instead succeeded")
  258. }
  259. if _, ok := err.(types.NotFoundError); !ok {
  260. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  261. }
  262. }
  263. func TestDuplicateNetwork(t *testing.T) {
  264. if !netutils.IsRunningInContainer() {
  265. defer netutils.SetupTestNetNS(t)()
  266. }
  267. controller, err := createTestController()
  268. if err != nil {
  269. t.Fatal(err)
  270. }
  271. genericOption := make(map[string]interface{})
  272. genericOption[netlabel.GenericData] = options.Generic{}
  273. err = controller.ConfigureNetworkDriver(bridgeNetType, genericOption)
  274. if err != nil {
  275. t.Fatal(err)
  276. }
  277. _, err = controller.NewNetwork(bridgeNetType, "testnetwork", nil)
  278. if err != nil {
  279. t.Fatal(err)
  280. }
  281. _, err = controller.NewNetwork(bridgeNetType, "testnetwork")
  282. if err == nil {
  283. t.Fatal("Expected to fail. But instead succeeded")
  284. }
  285. if _, ok := err.(libnetwork.NetworkNameError); !ok {
  286. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  287. }
  288. }
  289. func TestNetworkName(t *testing.T) {
  290. if !netutils.IsRunningInContainer() {
  291. defer netutils.SetupTestNetNS(t)()
  292. }
  293. _, err := createTestNetwork(bridgeNetType, "", options.Generic{}, options.Generic{})
  294. if err == nil {
  295. t.Fatal("Expected to fail. But instead succeeded")
  296. }
  297. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  298. t.Fatalf("Expected to fail with ErrInvalidName error. Got %v", err)
  299. }
  300. networkName := "testnetwork"
  301. n, err := createTestNetwork(bridgeNetType, networkName, options.Generic{}, options.Generic{})
  302. if err != nil {
  303. t.Fatal(err)
  304. }
  305. if n.Name() != networkName {
  306. t.Fatalf("Expected network name %s, got %s", networkName, n.Name())
  307. }
  308. }
  309. func TestNetworkType(t *testing.T) {
  310. if !netutils.IsRunningInContainer() {
  311. defer netutils.SetupTestNetNS(t)()
  312. }
  313. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  314. if err != nil {
  315. t.Fatal(err)
  316. }
  317. if n.Type() != bridgeNetType {
  318. t.Fatalf("Expected network type %s, got %s", bridgeNetType, n.Type())
  319. }
  320. }
  321. func TestNetworkID(t *testing.T) {
  322. if !netutils.IsRunningInContainer() {
  323. defer netutils.SetupTestNetNS(t)()
  324. }
  325. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  326. if err != nil {
  327. t.Fatal(err)
  328. }
  329. if n.ID() == "" {
  330. t.Fatal("Expected non-empty network id")
  331. }
  332. }
  333. func TestDeleteNetworkWithActiveEndpoints(t *testing.T) {
  334. if !netutils.IsRunningInContainer() {
  335. defer netutils.SetupTestNetNS(t)()
  336. }
  337. option := options.Generic{
  338. "BridgeName": bridgeName,
  339. "AllowNonDefaultBridge": true}
  340. network, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, option)
  341. if err != nil {
  342. t.Fatal(err)
  343. }
  344. ep, err := network.CreateEndpoint("testep")
  345. if err != nil {
  346. t.Fatal(err)
  347. }
  348. err = network.Delete()
  349. if err == nil {
  350. t.Fatal("Expected to fail. But instead succeeded")
  351. }
  352. if _, ok := err.(*libnetwork.ActiveEndpointsError); !ok {
  353. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  354. }
  355. // Done testing. Now cleanup.
  356. if err := ep.Delete(); err != nil {
  357. t.Fatal(err)
  358. }
  359. if err := network.Delete(); err != nil {
  360. t.Fatal(err)
  361. }
  362. }
  363. func TestUnknownNetwork(t *testing.T) {
  364. if !netutils.IsRunningInContainer() {
  365. defer netutils.SetupTestNetNS(t)()
  366. }
  367. option := options.Generic{
  368. "BridgeName": bridgeName,
  369. "AllowNonDefaultBridge": true}
  370. network, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, option)
  371. if err != nil {
  372. t.Fatal(err)
  373. }
  374. err = network.Delete()
  375. if err != nil {
  376. t.Fatal(err)
  377. }
  378. err = network.Delete()
  379. if err == nil {
  380. t.Fatal("Expected to fail. But instead succeeded")
  381. }
  382. if _, ok := err.(*libnetwork.UnknownNetworkError); !ok {
  383. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  384. }
  385. }
  386. func TestUnknownEndpoint(t *testing.T) {
  387. if !netutils.IsRunningInContainer() {
  388. defer netutils.SetupTestNetNS(t)()
  389. }
  390. ip, subnet, err := net.ParseCIDR("192.168.100.1/24")
  391. if err != nil {
  392. t.Fatal(err)
  393. }
  394. subnet.IP = ip
  395. option := options.Generic{
  396. "BridgeName": bridgeName,
  397. "AddressIPv4": subnet,
  398. "AllowNonDefaultBridge": true}
  399. network, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, option)
  400. if err != nil {
  401. t.Fatal(err)
  402. }
  403. _, err = network.CreateEndpoint("")
  404. if err == nil {
  405. t.Fatal("Expected to fail. But instead succeeded")
  406. }
  407. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  408. t.Fatalf("Expected to fail with ErrInvalidName error. Actual error: %v", err)
  409. }
  410. ep, err := network.CreateEndpoint("testep")
  411. if err != nil {
  412. t.Fatal(err)
  413. }
  414. err = ep.Delete()
  415. if err != nil {
  416. t.Fatal(err)
  417. }
  418. err = ep.Delete()
  419. if err == nil {
  420. t.Fatal("Expected to fail. But instead succeeded")
  421. }
  422. if _, ok := err.(*libnetwork.UnknownEndpointError); !ok {
  423. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  424. }
  425. // Done testing. Now cleanup
  426. if err := network.Delete(); err != nil {
  427. t.Fatal(err)
  428. }
  429. }
  430. func TestNetworkEndpointsWalkers(t *testing.T) {
  431. if !netutils.IsRunningInContainer() {
  432. defer netutils.SetupTestNetNS(t)()
  433. }
  434. controller, err := createTestController()
  435. if err != nil {
  436. t.Fatal(err)
  437. }
  438. err = controller.ConfigureNetworkDriver(bridgeNetType, getEmptyGenericOption())
  439. if err != nil {
  440. t.Fatal(err)
  441. }
  442. // Create network 1 and add 2 endpoint: ep11, ep12
  443. net1, err := controller.NewNetwork(bridgeNetType, "network1")
  444. if err != nil {
  445. t.Fatal(err)
  446. }
  447. ep11, err := net1.CreateEndpoint("ep11")
  448. if err != nil {
  449. t.Fatal(err)
  450. }
  451. ep12, err := net1.CreateEndpoint("ep12")
  452. if err != nil {
  453. t.Fatal(err)
  454. }
  455. // Test list methods on net1
  456. epList1 := net1.Endpoints()
  457. if len(epList1) != 2 {
  458. t.Fatalf("Endpoints() returned wrong number of elements: %d instead of 2", len(epList1))
  459. }
  460. // endpoint order is not guaranteed
  461. for _, e := range epList1 {
  462. if e != ep11 && e != ep12 {
  463. t.Fatal("Endpoints() did not return all the expected elements")
  464. }
  465. }
  466. // Test Endpoint Walk method
  467. var epName string
  468. var epWanted libnetwork.Endpoint
  469. wlk := func(ep libnetwork.Endpoint) bool {
  470. if ep.Name() == epName {
  471. epWanted = ep
  472. return true
  473. }
  474. return false
  475. }
  476. // Look for ep1 on network1
  477. epName = "ep11"
  478. net1.WalkEndpoints(wlk)
  479. if epWanted == nil {
  480. t.Fatal(err)
  481. }
  482. if ep11 != epWanted {
  483. t.Fatal(err)
  484. }
  485. // Test Network Walk method
  486. var netName string
  487. var netWanted libnetwork.Network
  488. nwWlk := func(nw libnetwork.Network) bool {
  489. if nw.Name() == netName {
  490. netWanted = nw
  491. return true
  492. }
  493. return false
  494. }
  495. // Look for network named "network1"
  496. netName = "network1"
  497. controller.WalkNetworks(nwWlk)
  498. if netWanted == nil {
  499. t.Fatal(err)
  500. }
  501. if net1 != netWanted {
  502. t.Fatal(err)
  503. }
  504. }
  505. func TestControllerQuery(t *testing.T) {
  506. if !netutils.IsRunningInContainer() {
  507. defer netutils.SetupTestNetNS(t)()
  508. }
  509. controller, err := createTestController()
  510. if err != nil {
  511. t.Fatal(err)
  512. }
  513. err = controller.ConfigureNetworkDriver(bridgeNetType, getEmptyGenericOption())
  514. if err != nil {
  515. t.Fatal(err)
  516. }
  517. // Create network 1
  518. net1, err := controller.NewNetwork(bridgeNetType, "network1")
  519. if err != nil {
  520. t.Fatal(err)
  521. }
  522. _, err = controller.NetworkByName("")
  523. if err == nil {
  524. t.Fatalf("NetworkByName() succeeded with invalid target name")
  525. }
  526. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  527. t.Fatalf("Expected NetworkByName() to fail with ErrInvalidName error. Got: %v", err)
  528. }
  529. _, err = controller.NetworkByID("")
  530. if err == nil {
  531. t.Fatalf("NetworkByID() succeeded with invalid target id")
  532. }
  533. if _, ok := err.(libnetwork.ErrInvalidID); !ok {
  534. t.Fatalf("NetworkByID() failed with unexpected error: %v", err)
  535. }
  536. g, err := controller.NetworkByID("network1")
  537. if err == nil {
  538. t.Fatalf("Unexpected success for NetworkByID(): %v", g)
  539. }
  540. if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok {
  541. t.Fatalf("NetworkByID() failed with unexpected error: %v", err)
  542. }
  543. g, err = controller.NetworkByName("network1")
  544. if err != nil {
  545. t.Fatalf("Unexpected failure for NetworkByName(): %v", err)
  546. }
  547. if g == nil {
  548. t.Fatalf("NetworkByName() did not find the network")
  549. }
  550. if g != net1 {
  551. t.Fatalf("NetworkByName() returned the wrong network")
  552. }
  553. g, err = controller.NetworkByID(net1.ID())
  554. if err != nil {
  555. t.Fatalf("Unexpected failure for NetworkByID(): %v", err)
  556. }
  557. if net1 != g {
  558. t.Fatalf("NetworkByID() returned unexpected element: %v", g)
  559. }
  560. }
  561. func TestNetworkQuery(t *testing.T) {
  562. if !netutils.IsRunningInContainer() {
  563. defer netutils.SetupTestNetNS(t)()
  564. }
  565. controller, err := createTestController()
  566. if err != nil {
  567. t.Fatal(err)
  568. }
  569. err = controller.ConfigureNetworkDriver(bridgeNetType, getEmptyGenericOption())
  570. if err != nil {
  571. t.Fatal(err)
  572. }
  573. // Create network 1 and add 2 endpoint: ep11, ep12
  574. net1, err := controller.NewNetwork(bridgeNetType, "network1")
  575. if err != nil {
  576. t.Fatal(err)
  577. }
  578. ep11, err := net1.CreateEndpoint("ep11")
  579. if err != nil {
  580. t.Fatal(err)
  581. }
  582. ep12, err := net1.CreateEndpoint("ep12")
  583. if err != nil {
  584. t.Fatal(err)
  585. }
  586. e, err := net1.EndpointByName("ep11")
  587. if err != nil {
  588. t.Fatal(err)
  589. }
  590. if ep11 != e {
  591. t.Fatalf("EndpointByName() returned %v instead of %v", e, ep11)
  592. }
  593. e, err = net1.EndpointByName("")
  594. if err == nil {
  595. t.Fatalf("EndpointByName() succeeded with invalid target name")
  596. }
  597. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  598. t.Fatalf("Expected EndpointByName() to fail with ErrInvalidName error. Got: %v", err)
  599. }
  600. e, err = net1.EndpointByName("IamNotAnEndpoint")
  601. if err == nil {
  602. t.Fatalf("EndpointByName() succeeded with unknown target name")
  603. }
  604. if _, ok := err.(libnetwork.ErrNoSuchEndpoint); !ok {
  605. t.Fatal(err)
  606. }
  607. if e != nil {
  608. t.Fatalf("EndpointByName(): expected nil, got %v", e)
  609. }
  610. e, err = net1.EndpointByID(ep12.ID())
  611. if err != nil {
  612. t.Fatal(err)
  613. }
  614. if ep12 != e {
  615. t.Fatalf("EndpointByID() returned %v instead of %v", e, ep12)
  616. }
  617. e, err = net1.EndpointByID("")
  618. if err == nil {
  619. t.Fatalf("EndpointByID() succeeded with invalid target id")
  620. }
  621. if _, ok := err.(libnetwork.ErrInvalidID); !ok {
  622. t.Fatalf("EndpointByID() failed with unexpected error: %v", err)
  623. }
  624. }
  625. const containerID = "valid_container"
  626. func checkSandbox(t *testing.T, info libnetwork.EndpointInfo) {
  627. origns, err := netns.Get()
  628. if err != nil {
  629. t.Fatalf("Could not get the current netns: %v", err)
  630. }
  631. defer origns.Close()
  632. key := info.SandboxKey()
  633. f, err := os.OpenFile(key, os.O_RDONLY, 0)
  634. if err != nil {
  635. t.Fatalf("Failed to open network namespace path %q: %v", key, err)
  636. }
  637. defer f.Close()
  638. runtime.LockOSThread()
  639. defer runtime.UnlockOSThread()
  640. nsFD := f.Fd()
  641. if err = netns.Set(netns.NsHandle(nsFD)); err != nil {
  642. t.Fatalf("Setting to the namespace pointed to by the sandbox %s failed: %v", key, err)
  643. }
  644. defer netns.Set(origns)
  645. _, err = netlink.LinkByName("eth0")
  646. if err != nil {
  647. t.Fatalf("Could not find the interface eth0 inside the sandbox: %v", err)
  648. }
  649. }
  650. func TestEndpointJoin(t *testing.T) {
  651. if !netutils.IsRunningInContainer() {
  652. defer netutils.SetupTestNetNS(t)()
  653. }
  654. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  655. if err != nil {
  656. t.Fatal(err)
  657. }
  658. ep, err := n.CreateEndpoint("ep1")
  659. if err != nil {
  660. t.Fatal(err)
  661. }
  662. // Validate if ep.Info() only gives me IP address info and not names and gateway during CreateEndpoint()
  663. info := ep.Info()
  664. for _, iface := range info.InterfaceList() {
  665. if iface.Address().IP.To4() == nil {
  666. t.Fatalf("Invalid IP address returned: %v", iface.Address())
  667. }
  668. }
  669. if info.Gateway().To4() != nil {
  670. t.Fatalf("Expected empty gateway for an empty endpoint. Instead found a gateway: %v", info.Gateway())
  671. }
  672. if info.SandboxKey() != "" {
  673. t.Fatalf("Expected an empty sandbox key for an empty endpoint. Instead found a non-empty sandbox key: %s", info.SandboxKey())
  674. }
  675. _, err = ep.Join(containerID,
  676. libnetwork.JoinOptionHostname("test"),
  677. libnetwork.JoinOptionDomainname("docker.io"),
  678. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"))
  679. if err != nil {
  680. t.Fatal(err)
  681. }
  682. defer func() {
  683. err = ep.Leave(containerID)
  684. if err != nil {
  685. t.Fatal(err)
  686. }
  687. }()
  688. // Validate if ep.Info() only gives valid gateway and sandbox key after has container has joined.
  689. info = ep.Info()
  690. if info.Gateway().To4() == nil {
  691. t.Fatalf("Expected a valid gateway for a joined endpoint. Instead found an invalid gateway: %v", info.Gateway())
  692. }
  693. if info.SandboxKey() == "" {
  694. t.Fatalf("Expected an non-empty sandbox key for a joined endpoint. Instead found a empty sandbox key")
  695. }
  696. checkSandbox(t, info)
  697. }
  698. func TestEndpointJoinInvalidContainerId(t *testing.T) {
  699. if !netutils.IsRunningInContainer() {
  700. defer netutils.SetupTestNetNS(t)()
  701. }
  702. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  703. if err != nil {
  704. t.Fatal(err)
  705. }
  706. ep, err := n.CreateEndpoint("ep1")
  707. if err != nil {
  708. t.Fatal(err)
  709. }
  710. _, err = ep.Join("")
  711. if err == nil {
  712. t.Fatal("Expected to fail join with empty container id string")
  713. }
  714. if _, ok := err.(libnetwork.InvalidContainerIDError); !ok {
  715. t.Fatalf("Failed for unexpected reason: %v", err)
  716. }
  717. }
  718. func TestEndpointDeleteWithActiveContainer(t *testing.T) {
  719. if !netutils.IsRunningInContainer() {
  720. defer netutils.SetupTestNetNS(t)()
  721. }
  722. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  723. if err != nil {
  724. t.Fatal(err)
  725. }
  726. ep, err := n.CreateEndpoint("ep1")
  727. if err != nil {
  728. t.Fatal(err)
  729. }
  730. _, err = ep.Join(containerID,
  731. libnetwork.JoinOptionHostname("test"),
  732. libnetwork.JoinOptionDomainname("docker.io"),
  733. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"))
  734. if err != nil {
  735. t.Fatal(err)
  736. }
  737. defer func() {
  738. err = ep.Leave(containerID)
  739. if err != nil {
  740. t.Fatal(err)
  741. }
  742. err = ep.Delete()
  743. if err != nil {
  744. t.Fatal(err)
  745. }
  746. }()
  747. err = ep.Delete()
  748. if err == nil {
  749. t.Fatal("Expected to fail. But instead succeeded")
  750. }
  751. if _, ok := err.(*libnetwork.ActiveContainerError); !ok {
  752. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  753. }
  754. }
  755. func TestEndpointMultipleJoins(t *testing.T) {
  756. if !netutils.IsRunningInContainer() {
  757. defer netutils.SetupTestNetNS(t)()
  758. }
  759. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  760. if err != nil {
  761. t.Fatal(err)
  762. }
  763. ep, err := n.CreateEndpoint("ep1")
  764. if err != nil {
  765. t.Fatal(err)
  766. }
  767. _, err = ep.Join(containerID,
  768. libnetwork.JoinOptionHostname("test"),
  769. libnetwork.JoinOptionDomainname("docker.io"),
  770. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"))
  771. if err != nil {
  772. t.Fatal(err)
  773. }
  774. defer func() {
  775. err = ep.Leave(containerID)
  776. if err != nil {
  777. t.Fatal(err)
  778. }
  779. }()
  780. _, err = ep.Join("container2")
  781. if err == nil {
  782. t.Fatal("Expected to fail multiple joins for the same endpoint")
  783. }
  784. if _, ok := err.(libnetwork.ErrInvalidJoin); !ok {
  785. t.Fatalf("Failed for unexpected reason: %v", err)
  786. }
  787. }
  788. func TestEndpointInvalidLeave(t *testing.T) {
  789. if !netutils.IsRunningInContainer() {
  790. defer netutils.SetupTestNetNS(t)()
  791. }
  792. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{}, options.Generic{})
  793. if err != nil {
  794. t.Fatal(err)
  795. }
  796. ep, err := n.CreateEndpoint("ep1")
  797. if err != nil {
  798. t.Fatal(err)
  799. }
  800. err = ep.Leave(containerID)
  801. if err == nil {
  802. t.Fatal("Expected to fail leave from an endpoint which has no active join")
  803. }
  804. if _, ok := err.(libnetwork.InvalidContainerIDError); !ok {
  805. if _, ok := err.(libnetwork.ErrNoContainer); !ok {
  806. t.Fatalf("Failed for unexpected reason: %v", err)
  807. }
  808. }
  809. _, err = ep.Join(containerID,
  810. libnetwork.JoinOptionHostname("test"),
  811. libnetwork.JoinOptionDomainname("docker.io"),
  812. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"))
  813. if err != nil {
  814. t.Fatal(err)
  815. }
  816. defer func() {
  817. err = ep.Leave(containerID)
  818. if err != nil {
  819. t.Fatal(err)
  820. }
  821. }()
  822. err = ep.Leave("")
  823. if err == nil {
  824. t.Fatal("Expected to fail leave with empty container id")
  825. }
  826. if _, ok := err.(libnetwork.InvalidContainerIDError); !ok {
  827. t.Fatalf("Failed for unexpected reason: %v", err)
  828. }
  829. err = ep.Leave("container2")
  830. if err == nil {
  831. t.Fatal("Expected to fail leave with wrong container id")
  832. }
  833. if _, ok := err.(libnetwork.InvalidContainerIDError); !ok {
  834. t.Fatalf("Failed for unexpected reason: %v", err)
  835. }
  836. }
  837. func TestEndpointUpdateParent(t *testing.T) {
  838. if !netutils.IsRunningInContainer() {
  839. defer netutils.SetupTestNetNS(t)()
  840. }
  841. n, err := createTestNetwork("bridge", "testnetwork", options.Generic{}, options.Generic{})
  842. if err != nil {
  843. t.Fatal(err)
  844. }
  845. ep1, err := n.CreateEndpoint("ep1", nil)
  846. if err != nil {
  847. t.Fatal(err)
  848. }
  849. _, err = ep1.Join(containerID,
  850. libnetwork.JoinOptionHostname("test1"),
  851. libnetwork.JoinOptionDomainname("docker.io"),
  852. libnetwork.JoinOptionExtraHost("web", "192.168.0.1"))
  853. if err != nil {
  854. t.Fatal(err)
  855. }
  856. defer func() {
  857. err = ep1.Leave(containerID)
  858. if err != nil {
  859. t.Fatal(err)
  860. }
  861. }()
  862. ep2, err := n.CreateEndpoint("ep2", nil)
  863. if err != nil {
  864. t.Fatal(err)
  865. }
  866. _, err = ep2.Join("container2",
  867. libnetwork.JoinOptionHostname("test2"),
  868. libnetwork.JoinOptionDomainname("docker.io"),
  869. libnetwork.JoinOptionHostsPath("/var/lib/docker/test_network/container2/hosts"),
  870. libnetwork.JoinOptionParentUpdate(ep1.ID(), "web", "192.168.0.2"))
  871. if err != nil {
  872. t.Fatal(err)
  873. }
  874. defer func() {
  875. err = ep2.Leave("container2")
  876. if err != nil {
  877. t.Fatal(err)
  878. }
  879. }()
  880. }
  881. func TestEnableIPv6(t *testing.T) {
  882. if !netutils.IsRunningInContainer() {
  883. defer netutils.SetupTestNetNS(t)()
  884. }
  885. tmpResolvConf := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\nnameserver 2001:4860:4860::8888")
  886. //take a copy of resolv.conf for restoring after test completes
  887. resolvConfSystem, err := ioutil.ReadFile("/etc/resolv.conf")
  888. if err != nil {
  889. t.Fatal(err)
  890. }
  891. //cleanup
  892. defer func() {
  893. if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil {
  894. t.Fatal(err)
  895. }
  896. }()
  897. ip, cidrv6, err := net.ParseCIDR("fe80::1/64")
  898. if err != nil {
  899. t.Fatal(err)
  900. }
  901. cidrv6.IP = ip
  902. netOption := options.Generic{
  903. netlabel.EnableIPv6: true,
  904. netlabel.GenericData: options.Generic{
  905. "FixedCIDRv6": cidrv6,
  906. },
  907. }
  908. n, err := createTestNetwork("bridge", "testnetwork", options.Generic{}, netOption)
  909. if err != nil {
  910. t.Fatal(err)
  911. }
  912. ep1, err := n.CreateEndpoint("ep1", nil)
  913. if err != nil {
  914. t.Fatal(err)
  915. }
  916. if err := ioutil.WriteFile("/etc/resolv.conf", tmpResolvConf, 0644); err != nil {
  917. t.Fatal(err)
  918. }
  919. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  920. defer os.Remove(resolvConfPath)
  921. _, err = ep1.Join(containerID,
  922. libnetwork.JoinOptionResolvConfPath(resolvConfPath))
  923. if err != nil {
  924. t.Fatal(err)
  925. }
  926. defer func() {
  927. err = ep1.Leave(containerID)
  928. if err != nil {
  929. t.Fatal(err)
  930. }
  931. }()
  932. content, err := ioutil.ReadFile(resolvConfPath)
  933. if err != nil {
  934. t.Fatal(err)
  935. }
  936. if !bytes.Equal(content, tmpResolvConf) {
  937. t.Fatalf("Expected %s, Got %s", string(tmpResolvConf), string(content))
  938. }
  939. if err != nil {
  940. t.Fatal(err)
  941. }
  942. }
  943. func TestResolvConf(t *testing.T) {
  944. if !netutils.IsRunningInContainer() {
  945. defer netutils.SetupTestNetNS(t)()
  946. }
  947. tmpResolvConf1 := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\nnameserver 2001:4860:4860::8888")
  948. expectedResolvConf1 := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\n")
  949. tmpResolvConf2 := []byte("search pommesfrites.fr\nnameserver 112.34.56.78\nnameserver 2001:4860:4860::8888")
  950. expectedResolvConf2 := []byte("search pommesfrites.fr\nnameserver 112.34.56.78\n")
  951. tmpResolvConf3 := []byte("search pommesfrites.fr\nnameserver 113.34.56.78\n")
  952. //take a copy of resolv.conf for restoring after test completes
  953. resolvConfSystem, err := ioutil.ReadFile("/etc/resolv.conf")
  954. if err != nil {
  955. t.Fatal(err)
  956. }
  957. //cleanup
  958. defer func() {
  959. if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil {
  960. t.Fatal(err)
  961. }
  962. }()
  963. n, err := createTestNetwork("bridge", "testnetwork", options.Generic{}, options.Generic{})
  964. if err != nil {
  965. t.Fatal(err)
  966. }
  967. ep1, err := n.CreateEndpoint("ep1", nil)
  968. if err != nil {
  969. t.Fatal(err)
  970. }
  971. if err := ioutil.WriteFile("/etc/resolv.conf", tmpResolvConf1, 0644); err != nil {
  972. t.Fatal(err)
  973. }
  974. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  975. defer os.Remove(resolvConfPath)
  976. _, err = ep1.Join(containerID,
  977. libnetwork.JoinOptionResolvConfPath(resolvConfPath))
  978. if err != nil {
  979. t.Fatal(err)
  980. }
  981. defer func() {
  982. err = ep1.Leave(containerID)
  983. if err != nil {
  984. t.Fatal(err)
  985. }
  986. }()
  987. finfo, err := os.Stat(resolvConfPath)
  988. if err != nil {
  989. t.Fatal(err)
  990. }
  991. fmode := (os.FileMode)(0644)
  992. if finfo.Mode() != fmode {
  993. t.Fatalf("Expected file mode %s, got %s", fmode.String(), finfo.Mode().String())
  994. }
  995. content, err := ioutil.ReadFile(resolvConfPath)
  996. if err != nil {
  997. t.Fatal(err)
  998. }
  999. if !bytes.Equal(content, expectedResolvConf1) {
  1000. t.Fatalf("Expected %s, Got %s", string(expectedResolvConf1), string(content))
  1001. }
  1002. err = ep1.Leave(containerID)
  1003. if err != nil {
  1004. t.Fatal(err)
  1005. }
  1006. if err := ioutil.WriteFile("/etc/resolv.conf", tmpResolvConf2, 0644); err != nil {
  1007. t.Fatal(err)
  1008. }
  1009. _, err = ep1.Join(containerID,
  1010. libnetwork.JoinOptionResolvConfPath(resolvConfPath))
  1011. if err != nil {
  1012. t.Fatal(err)
  1013. }
  1014. content, err = ioutil.ReadFile(resolvConfPath)
  1015. if err != nil {
  1016. t.Fatal(err)
  1017. }
  1018. if !bytes.Equal(content, expectedResolvConf2) {
  1019. t.Fatalf("Expected %s, Got %s", string(expectedResolvConf2), string(content))
  1020. }
  1021. if err := ioutil.WriteFile(resolvConfPath, tmpResolvConf3, 0644); err != nil {
  1022. t.Fatal(err)
  1023. }
  1024. err = ep1.Leave(containerID)
  1025. if err != nil {
  1026. t.Fatal(err)
  1027. }
  1028. _, err = ep1.Join(containerID,
  1029. libnetwork.JoinOptionResolvConfPath(resolvConfPath))
  1030. if err != nil {
  1031. t.Fatal(err)
  1032. }
  1033. content, err = ioutil.ReadFile(resolvConfPath)
  1034. if err != nil {
  1035. t.Fatal(err)
  1036. }
  1037. if !bytes.Equal(content, tmpResolvConf3) {
  1038. t.Fatalf("Expected %s, Got %s", string(tmpResolvConf3), string(content))
  1039. }
  1040. }
  1041. func TestInvalidRemoteDriver(t *testing.T) {
  1042. if !netutils.IsRunningInContainer() {
  1043. t.Skip("Skipping test when not running inside a Container")
  1044. }
  1045. mux := http.NewServeMux()
  1046. server := httptest.NewServer(mux)
  1047. if server == nil {
  1048. t.Fatal("Failed to start a HTTP Server")
  1049. }
  1050. defer server.Close()
  1051. type pluginRequest struct {
  1052. name string
  1053. }
  1054. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  1055. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1056. fmt.Fprintln(w, `{"Implements": ["InvalidDriver"]}`)
  1057. })
  1058. if err := os.MkdirAll("/usr/share/docker/plugins", 0755); err != nil {
  1059. t.Fatal(err)
  1060. }
  1061. defer func() {
  1062. if err := os.RemoveAll("/usr/share/docker/plugins"); err != nil {
  1063. t.Fatal(err)
  1064. }
  1065. }()
  1066. if err := ioutil.WriteFile("/usr/share/docker/plugins/invalid-network-driver.spec", []byte(server.URL), 0644); err != nil {
  1067. t.Fatal(err)
  1068. }
  1069. controller, err := libnetwork.New("")
  1070. if err != nil {
  1071. t.Fatal(err)
  1072. }
  1073. _, err = controller.NewNetwork("invalid-network-driver", "dummy",
  1074. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  1075. if err == nil {
  1076. t.Fatal("Expected to fail. But instead succeeded")
  1077. }
  1078. if err != plugins.ErrNotImplements {
  1079. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  1080. }
  1081. }
  1082. func TestValidRemoteDriver(t *testing.T) {
  1083. if !netutils.IsRunningInContainer() {
  1084. t.Skip("Skipping test when not running inside a Container")
  1085. }
  1086. mux := http.NewServeMux()
  1087. server := httptest.NewServer(mux)
  1088. if server == nil {
  1089. t.Fatal("Failed to start a HTTP Server")
  1090. }
  1091. defer server.Close()
  1092. type pluginRequest struct {
  1093. name string
  1094. }
  1095. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  1096. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1097. fmt.Fprintf(w, `{"Implements": ["%s"]}`, driverapi.NetworkPluginEndpointType)
  1098. })
  1099. mux.HandleFunc(fmt.Sprintf("/%s.CreateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1100. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1101. fmt.Fprintf(w, "null")
  1102. })
  1103. if err := os.MkdirAll("/usr/share/docker/plugins", 0755); err != nil {
  1104. t.Fatal(err)
  1105. }
  1106. defer func() {
  1107. if err := os.RemoveAll("/usr/share/docker/plugins"); err != nil {
  1108. t.Fatal(err)
  1109. }
  1110. }()
  1111. if err := ioutil.WriteFile("/usr/share/docker/plugins/valid-network-driver.spec", []byte(server.URL), 0644); err != nil {
  1112. t.Fatal(err)
  1113. }
  1114. controller, err := libnetwork.New("")
  1115. if err != nil {
  1116. t.Fatal(err)
  1117. }
  1118. _, err = controller.NewNetwork("valid-network-driver", "dummy",
  1119. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  1120. if err != nil {
  1121. t.Fatal(err)
  1122. }
  1123. }
  1124. var (
  1125. once sync.Once
  1126. ctrlr libnetwork.NetworkController
  1127. start = make(chan struct{})
  1128. done = make(chan chan struct{}, numThreads-1)
  1129. origns = netns.None()
  1130. testns = netns.None()
  1131. )
  1132. const (
  1133. iterCnt = 25
  1134. numThreads = 3
  1135. first = 1
  1136. last = numThreads
  1137. debug = false
  1138. )
  1139. func createGlobalInstance(t *testing.T) {
  1140. var err error
  1141. defer close(start)
  1142. origns, err = netns.Get()
  1143. if err != nil {
  1144. t.Fatal(err)
  1145. }
  1146. if netutils.IsRunningInContainer() {
  1147. testns = origns
  1148. } else {
  1149. testns, err = netns.New()
  1150. if err != nil {
  1151. t.Fatal(err)
  1152. }
  1153. }
  1154. ctrlr, err = createTestController()
  1155. if err != nil {
  1156. t.Fatal(err)
  1157. }
  1158. err = ctrlr.ConfigureNetworkDriver(bridgeNetType, getEmptyGenericOption())
  1159. if err != nil {
  1160. t.Fatal("configure driver")
  1161. }
  1162. net, err := ctrlr.NewNetwork(bridgeNetType, "network1")
  1163. if err != nil {
  1164. t.Fatal("new network")
  1165. }
  1166. _, err = net.CreateEndpoint("ep1")
  1167. if err != nil {
  1168. t.Fatal("createendpoint")
  1169. }
  1170. }
  1171. func debugf(format string, a ...interface{}) (int, error) {
  1172. if debug {
  1173. return fmt.Printf(format, a...)
  1174. }
  1175. return 0, nil
  1176. }
  1177. func parallelJoin(t *testing.T, ep libnetwork.Endpoint, thrNumber int) {
  1178. debugf("J%d.", thrNumber)
  1179. _, err := ep.Join("racing_container")
  1180. runtime.LockOSThread()
  1181. if err != nil {
  1182. if _, ok := err.(libnetwork.ErrNoContainer); !ok {
  1183. if _, ok := err.(libnetwork.ErrInvalidJoin); !ok {
  1184. t.Fatal(err)
  1185. }
  1186. }
  1187. debugf("JE%d(%v).", thrNumber, err)
  1188. }
  1189. debugf("JD%d.", thrNumber)
  1190. }
  1191. func parallelLeave(t *testing.T, ep libnetwork.Endpoint, thrNumber int) {
  1192. debugf("L%d.", thrNumber)
  1193. err := ep.Leave("racing_container")
  1194. runtime.LockOSThread()
  1195. if err != nil {
  1196. if _, ok := err.(libnetwork.ErrNoContainer); !ok {
  1197. if _, ok := err.(libnetwork.ErrInvalidJoin); !ok {
  1198. t.Fatal(err)
  1199. }
  1200. }
  1201. debugf("LE%d(%v).", thrNumber, err)
  1202. }
  1203. debugf("LD%d.", thrNumber)
  1204. }
  1205. func runParallelTests(t *testing.T, thrNumber int) {
  1206. var err error
  1207. t.Parallel()
  1208. pTest := flag.Lookup("test.parallel")
  1209. if pTest == nil {
  1210. t.Skip("Skipped because test.parallel flag not set;")
  1211. }
  1212. numParallel, err := strconv.Atoi(pTest.Value.String())
  1213. if err != nil {
  1214. t.Fatal(err)
  1215. }
  1216. if numParallel < numThreads {
  1217. t.Skip("Skipped because t.parallel was less than ", numThreads)
  1218. }
  1219. runtime.LockOSThread()
  1220. defer runtime.UnlockOSThread()
  1221. if thrNumber == first {
  1222. createGlobalInstance(t)
  1223. }
  1224. if thrNumber != first {
  1225. select {
  1226. case <-start:
  1227. }
  1228. thrdone := make(chan struct{})
  1229. done <- thrdone
  1230. defer close(thrdone)
  1231. if thrNumber == last {
  1232. defer close(done)
  1233. }
  1234. err = netns.Set(testns)
  1235. if err != nil {
  1236. t.Fatal(err)
  1237. }
  1238. }
  1239. defer netns.Set(origns)
  1240. net, err := ctrlr.NetworkByName("network1")
  1241. if err != nil {
  1242. t.Fatal(err)
  1243. }
  1244. if net == nil {
  1245. t.Fatal("Could not find network1")
  1246. }
  1247. ep, err := net.EndpointByName("ep1")
  1248. if err != nil {
  1249. t.Fatal(err)
  1250. }
  1251. if ep == nil {
  1252. t.Fatal("Got nil ep with no error")
  1253. }
  1254. for i := 0; i < iterCnt; i++ {
  1255. parallelJoin(t, ep, thrNumber)
  1256. parallelLeave(t, ep, thrNumber)
  1257. }
  1258. debugf("\n")
  1259. if thrNumber == first {
  1260. for thrdone := range done {
  1261. select {
  1262. case <-thrdone:
  1263. }
  1264. }
  1265. testns.Close()
  1266. err = ep.Delete()
  1267. if err != nil {
  1268. t.Fatal(err)
  1269. }
  1270. }
  1271. }
  1272. func TestParallel1(t *testing.T) {
  1273. runParallelTests(t, 1)
  1274. }
  1275. func TestParallel2(t *testing.T) {
  1276. runParallelTests(t, 2)
  1277. }
  1278. func TestParallel3(t *testing.T) {
  1279. runParallelTests(t, 3)
  1280. }