libnetwork_test.go 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366
  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. defer func() {
  870. if err := sbx1.Delete(); err != nil {
  871. t.Fatal(err)
  872. }
  873. }()
  874. sbx2, err := controller.NewSandbox("c2")
  875. defer func() {
  876. if err := sbx2.Delete(); err != nil {
  877. t.Fatal(err)
  878. }
  879. }()
  880. err = ep.Join(sbx1)
  881. if err != nil {
  882. t.Fatal(err)
  883. }
  884. defer func() {
  885. err = ep.Leave(sbx1)
  886. if err != nil {
  887. t.Fatal(err)
  888. }
  889. }()
  890. err = ep.Join(sbx2)
  891. if err == nil {
  892. t.Fatal("Expected to fail multiple joins for the same endpoint")
  893. }
  894. if _, ok := err.(types.ForbiddenError); !ok {
  895. t.Fatalf("Failed with unexpected error type: %T. Desc: %s", err, err.Error())
  896. }
  897. }
  898. func TestLeaveAll(t *testing.T) {
  899. if !testutils.IsRunningInContainer() {
  900. defer testutils.SetupTestOSContext(t)()
  901. }
  902. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{
  903. netlabel.GenericData: options.Generic{
  904. "BridgeName": "testnetwork",
  905. },
  906. }, nil, nil)
  907. if err != nil {
  908. t.Fatal(err)
  909. }
  910. defer func() {
  911. // If this goes through, it means cnt.Delete() effectively detached from all the endpoints
  912. if err := n.Delete(); err != nil {
  913. t.Fatal(err)
  914. }
  915. }()
  916. n2, err := createTestNetwork(bridgeNetType, "testnetwork2", options.Generic{
  917. netlabel.GenericData: options.Generic{
  918. "BridgeName": "testnetwork2",
  919. },
  920. }, nil, nil)
  921. if err != nil {
  922. t.Fatal(err)
  923. }
  924. defer func() {
  925. if err := n2.Delete(); err != nil {
  926. t.Fatal(err)
  927. }
  928. }()
  929. ep1, err := n.CreateEndpoint("ep1")
  930. if err != nil {
  931. t.Fatal(err)
  932. }
  933. ep2, err := n2.CreateEndpoint("ep2")
  934. if err != nil {
  935. t.Fatal(err)
  936. }
  937. cnt, err := controller.NewSandbox("leaveall")
  938. if err != nil {
  939. t.Fatal(err)
  940. }
  941. err = ep1.Join(cnt)
  942. if err != nil {
  943. t.Fatalf("Failed to join ep1: %v", err)
  944. }
  945. err = ep2.Join(cnt)
  946. if err != nil {
  947. t.Fatalf("Failed to join ep2: %v", err)
  948. }
  949. err = cnt.Delete()
  950. if err != nil {
  951. t.Fatal(err)
  952. }
  953. }
  954. func TestContainerInvalidLeave(t *testing.T) {
  955. if !testutils.IsRunningInContainer() {
  956. defer testutils.SetupTestOSContext(t)()
  957. }
  958. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{
  959. netlabel.GenericData: options.Generic{
  960. "BridgeName": "testnetwork",
  961. },
  962. }, nil, nil)
  963. if err != nil {
  964. t.Fatal(err)
  965. }
  966. defer func() {
  967. if err := n.Delete(); err != nil {
  968. t.Fatal(err)
  969. }
  970. }()
  971. ep, err := n.CreateEndpoint("ep1")
  972. if err != nil {
  973. t.Fatal(err)
  974. }
  975. defer func() {
  976. if err := ep.Delete(false); err != nil {
  977. t.Fatal(err)
  978. }
  979. }()
  980. cnt, err := controller.NewSandbox(containerID,
  981. libnetwork.OptionHostname("test"),
  982. libnetwork.OptionDomainname("docker.io"),
  983. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  984. if err != nil {
  985. t.Fatal(err)
  986. }
  987. defer func() {
  988. if err := cnt.Delete(); err != nil {
  989. t.Fatal(err)
  990. }
  991. }()
  992. err = ep.Leave(cnt)
  993. if err == nil {
  994. t.Fatal("Expected to fail leave from an endpoint which has no active join")
  995. }
  996. if _, ok := err.(types.ForbiddenError); !ok {
  997. t.Fatalf("Failed with unexpected error type: %T. Desc: %s", err, err.Error())
  998. }
  999. if err = ep.Leave(nil); err == nil {
  1000. t.Fatalf("Expected to fail leave nil Sandbox")
  1001. }
  1002. if _, ok := err.(types.BadRequestError); !ok {
  1003. t.Fatalf("Unexpected error type returned: %T. Desc: %s", err, err.Error())
  1004. }
  1005. fsbx := &fakeSandbox{}
  1006. if err = ep.Leave(fsbx); err == nil {
  1007. t.Fatalf("Expected to fail leave with invalid Sandbox")
  1008. }
  1009. if _, ok := err.(types.BadRequestError); !ok {
  1010. t.Fatalf("Unexpected error type returned: %T. Desc: %s", err, err.Error())
  1011. }
  1012. }
  1013. func TestEndpointUpdateParent(t *testing.T) {
  1014. if !testutils.IsRunningInContainer() {
  1015. defer testutils.SetupTestOSContext(t)()
  1016. }
  1017. n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{
  1018. netlabel.GenericData: options.Generic{
  1019. "BridgeName": "testnetwork",
  1020. },
  1021. }, nil, nil)
  1022. if err != nil {
  1023. t.Fatal(err)
  1024. }
  1025. defer func() {
  1026. if err := n.Delete(); err != nil {
  1027. t.Fatal(err)
  1028. }
  1029. }()
  1030. ep1, err := n.CreateEndpoint("ep1")
  1031. if err != nil {
  1032. t.Fatal(err)
  1033. }
  1034. ep2, err := n.CreateEndpoint("ep2")
  1035. if err != nil {
  1036. t.Fatal(err)
  1037. }
  1038. sbx1, err := controller.NewSandbox(containerID,
  1039. libnetwork.OptionHostname("test"),
  1040. libnetwork.OptionDomainname("docker.io"),
  1041. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  1042. if err != nil {
  1043. t.Fatal(err)
  1044. }
  1045. defer func() {
  1046. if err := sbx1.Delete(); err != nil {
  1047. t.Fatal(err)
  1048. }
  1049. }()
  1050. sbx2, err := controller.NewSandbox("c2",
  1051. libnetwork.OptionHostname("test2"),
  1052. libnetwork.OptionDomainname("docker.io"),
  1053. libnetwork.OptionHostsPath("/var/lib/docker/test_network/container2/hosts"),
  1054. libnetwork.OptionExtraHost("web", "192.168.0.2"))
  1055. if err != nil {
  1056. t.Fatal(err)
  1057. }
  1058. defer func() {
  1059. if err := sbx2.Delete(); err != nil {
  1060. t.Fatal(err)
  1061. }
  1062. }()
  1063. err = ep1.Join(sbx1)
  1064. if err != nil {
  1065. t.Fatal(err)
  1066. }
  1067. err = ep2.Join(sbx2)
  1068. if err != nil {
  1069. t.Fatal(err)
  1070. }
  1071. }
  1072. func TestInvalidRemoteDriver(t *testing.T) {
  1073. mux := http.NewServeMux()
  1074. server := httptest.NewServer(mux)
  1075. if server == nil {
  1076. t.Fatal("Failed to start an HTTP Server")
  1077. }
  1078. defer server.Close()
  1079. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  1080. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1081. fmt.Fprintln(w, `{"Implements": ["InvalidDriver"]}`)
  1082. })
  1083. if err := os.MkdirAll(specPath, 0755); err != nil {
  1084. t.Fatal(err)
  1085. }
  1086. defer func() {
  1087. if err := os.RemoveAll(specPath); err != nil {
  1088. t.Fatal(err)
  1089. }
  1090. }()
  1091. if err := os.WriteFile(filepath.Join(specPath, "invalid-network-driver.spec"), []byte(server.URL), 0644); err != nil {
  1092. t.Fatal(err)
  1093. }
  1094. ctrlr, err := libnetwork.New()
  1095. if err != nil {
  1096. t.Fatal(err)
  1097. }
  1098. defer ctrlr.Stop()
  1099. _, err = ctrlr.NewNetwork("invalid-network-driver", "dummy", "",
  1100. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  1101. if err == nil {
  1102. t.Fatal("Expected to fail. But instead succeeded")
  1103. }
  1104. if !errors.Is(err, plugins.ErrNotImplements) {
  1105. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  1106. }
  1107. }
  1108. func TestValidRemoteDriver(t *testing.T) {
  1109. mux := http.NewServeMux()
  1110. server := httptest.NewServer(mux)
  1111. if server == nil {
  1112. t.Fatal("Failed to start an HTTP Server")
  1113. }
  1114. defer server.Close()
  1115. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  1116. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1117. fmt.Fprintf(w, `{"Implements": ["%s"]}`, driverapi.NetworkPluginEndpointType)
  1118. })
  1119. mux.HandleFunc(fmt.Sprintf("/%s.GetCapabilities", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1120. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1121. fmt.Fprintf(w, `{"Scope":"local"}`)
  1122. })
  1123. mux.HandleFunc(fmt.Sprintf("/%s.CreateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1124. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1125. fmt.Fprintf(w, "null")
  1126. })
  1127. mux.HandleFunc(fmt.Sprintf("/%s.DeleteNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1128. w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
  1129. fmt.Fprintf(w, "null")
  1130. })
  1131. if err := os.MkdirAll(specPath, 0755); err != nil {
  1132. t.Fatal(err)
  1133. }
  1134. defer func() {
  1135. if err := os.RemoveAll(specPath); err != nil {
  1136. t.Fatal(err)
  1137. }
  1138. }()
  1139. if err := os.WriteFile(filepath.Join(specPath, "valid-network-driver.spec"), []byte(server.URL), 0644); err != nil {
  1140. t.Fatal(err)
  1141. }
  1142. n, err := controller.NewNetwork("valid-network-driver", "dummy", "",
  1143. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  1144. if err != nil {
  1145. // Only fail if we could not find the plugin driver
  1146. if isNotFound(err) {
  1147. t.Fatal(err)
  1148. }
  1149. return
  1150. }
  1151. defer func() {
  1152. if err := n.Delete(); err != nil {
  1153. t.Fatal(err)
  1154. }
  1155. }()
  1156. }
  1157. var (
  1158. start = make(chan struct{})
  1159. done = make(chan chan struct{}, numThreads-1)
  1160. sboxes = make([]libnetwork.Sandbox, numThreads)
  1161. )
  1162. const (
  1163. iterCnt = 25
  1164. numThreads = 3
  1165. first = 1
  1166. last = numThreads
  1167. debug = false
  1168. )
  1169. func debugf(format string, a ...interface{}) {
  1170. if debug {
  1171. fmt.Printf(format, a...)
  1172. }
  1173. }