libnetwork_test.go 33 KB

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