libnetwork_test.go 34 KB

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