libnetwork_test.go 29 KB

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