libnetwork_test.go 33 KB

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