libnetwork_test.go 31 KB

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