libnetwork_test.go 30 KB

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