libnetwork_test.go 29 KB

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