libnetwork_linux_test.go 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303
  1. package libnetwork_test
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "net"
  8. "net/http"
  9. "net/http/httptest"
  10. "os"
  11. "os/exec"
  12. "path/filepath"
  13. "strings"
  14. "sync"
  15. "testing"
  16. "github.com/containerd/log"
  17. "github.com/docker/docker/internal/testutils/netnsutils"
  18. "github.com/docker/docker/libnetwork"
  19. "github.com/docker/docker/libnetwork/config"
  20. "github.com/docker/docker/libnetwork/datastore"
  21. "github.com/docker/docker/libnetwork/driverapi"
  22. "github.com/docker/docker/libnetwork/ipamapi"
  23. "github.com/docker/docker/libnetwork/netlabel"
  24. "github.com/docker/docker/libnetwork/options"
  25. "github.com/docker/docker/libnetwork/osl"
  26. "github.com/docker/docker/libnetwork/types"
  27. "github.com/docker/docker/pkg/plugins"
  28. "github.com/docker/docker/pkg/reexec"
  29. "github.com/pkg/errors"
  30. "github.com/vishvananda/netlink"
  31. "github.com/vishvananda/netns"
  32. "golang.org/x/sync/errgroup"
  33. )
  34. const (
  35. bridgeNetType = "bridge"
  36. )
  37. func TestMain(m *testing.M) {
  38. // Cleanup local datastore file
  39. _ = os.Remove(datastore.DefaultScope("").Client.Address)
  40. os.Exit(m.Run())
  41. }
  42. func newController(t *testing.T) *libnetwork.Controller {
  43. t.Helper()
  44. c, err := libnetwork.New(
  45. libnetwork.OptionBoltdbWithRandomDBFile(t),
  46. config.OptionDriverConfig(bridgeNetType, map[string]interface{}{
  47. netlabel.GenericData: options.Generic{
  48. "EnableIPForwarding": true,
  49. },
  50. }),
  51. )
  52. if err != nil {
  53. t.Fatal(err)
  54. }
  55. t.Cleanup(c.Stop)
  56. return c
  57. }
  58. func createTestNetwork(c *libnetwork.Controller, networkType, networkName string, netOption options.Generic, ipamV4Configs, ipamV6Configs []*libnetwork.IpamConf) (*libnetwork.Network, error) {
  59. return c.NewNetwork(networkType, networkName, "",
  60. libnetwork.NetworkOptionGeneric(netOption),
  61. libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4Configs, ipamV6Configs, nil))
  62. }
  63. func getEmptyGenericOption() map[string]interface{} {
  64. return map[string]interface{}{netlabel.GenericData: map[string]string{}}
  65. }
  66. func getPortMapping() []types.PortBinding {
  67. return []types.PortBinding{
  68. {Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  69. {Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  70. {Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  71. {Proto: types.TCP, Port: uint16(320), HostPort: uint16(32000), HostPortEnd: uint16(32999)},
  72. {Proto: types.UDP, Port: uint16(420), HostPort: uint16(42000), HostPortEnd: uint16(42001)},
  73. }
  74. }
  75. func isNotFound(err error) bool {
  76. _, ok := (err).(types.NotFoundError)
  77. return ok
  78. }
  79. func TestNull(t *testing.T) {
  80. defer netnsutils.SetupTestOSContext(t)()
  81. controller := newController(t)
  82. cnt, err := controller.NewSandbox("null_container",
  83. libnetwork.OptionHostname("test"),
  84. libnetwork.OptionDomainname("example.com"),
  85. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. network, err := createTestNetwork(controller, "null", "testnull", options.Generic{}, nil, nil)
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. ep, err := network.CreateEndpoint("testep")
  94. if err != nil {
  95. t.Fatal(err)
  96. }
  97. err = ep.Join(cnt)
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. err = ep.Leave(cnt)
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. if err := ep.Delete(false); err != nil {
  106. t.Fatal(err)
  107. }
  108. if err := cnt.Delete(); err != nil {
  109. t.Fatal(err)
  110. }
  111. // host type is special network. Cannot be removed.
  112. err = network.Delete()
  113. if err == nil {
  114. t.Fatal(err)
  115. }
  116. if _, ok := err.(types.ForbiddenError); !ok {
  117. t.Fatalf("Unexpected error type")
  118. }
  119. }
  120. func TestUnknownDriver(t *testing.T) {
  121. defer netnsutils.SetupTestOSContext(t)()
  122. controller := newController(t)
  123. _, err := createTestNetwork(controller, "unknowndriver", "testnetwork", options.Generic{}, nil, nil)
  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 TestNilRemoteDriver(t *testing.T) {
  132. defer netnsutils.SetupTestOSContext(t)()
  133. controller := newController(t)
  134. _, err := controller.NewNetwork("framerelay", "dummy", "",
  135. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  136. if err == nil {
  137. t.Fatal("Expected to fail. But instead succeeded")
  138. }
  139. if !isNotFound(err) {
  140. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  141. }
  142. }
  143. func TestNetworkName(t *testing.T) {
  144. defer netnsutils.SetupTestOSContext(t)()
  145. controller := newController(t)
  146. netOption := options.Generic{
  147. netlabel.GenericData: options.Generic{
  148. "BridgeName": "testnetwork",
  149. },
  150. }
  151. _, err := createTestNetwork(controller, bridgeNetType, "", netOption, nil, nil)
  152. if err == nil {
  153. t.Fatal("Expected to fail. But instead succeeded")
  154. }
  155. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  156. t.Fatalf("Expected to fail with ErrInvalidName error. Got %v", err)
  157. }
  158. networkName := "testnetwork"
  159. n, err := createTestNetwork(controller, bridgeNetType, networkName, netOption, nil, nil)
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. defer func() {
  164. if err := n.Delete(); err != nil {
  165. t.Fatal(err)
  166. }
  167. }()
  168. if n.Name() != networkName {
  169. t.Fatalf("Expected network name %s, got %s", networkName, n.Name())
  170. }
  171. }
  172. func TestNetworkType(t *testing.T) {
  173. defer netnsutils.SetupTestOSContext(t)()
  174. controller := newController(t)
  175. netOption := options.Generic{
  176. netlabel.GenericData: options.Generic{
  177. "BridgeName": "testnetwork",
  178. },
  179. }
  180. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", netOption, nil, nil)
  181. if err != nil {
  182. t.Fatal(err)
  183. }
  184. defer func() {
  185. if err := n.Delete(); err != nil {
  186. t.Fatal(err)
  187. }
  188. }()
  189. if n.Type() != bridgeNetType {
  190. t.Fatalf("Expected network type %s, got %s", bridgeNetType, n.Type())
  191. }
  192. }
  193. func TestNetworkID(t *testing.T) {
  194. defer netnsutils.SetupTestOSContext(t)()
  195. controller := newController(t)
  196. netOption := options.Generic{
  197. netlabel.GenericData: options.Generic{
  198. "BridgeName": "testnetwork",
  199. },
  200. }
  201. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", netOption, nil, nil)
  202. if err != nil {
  203. t.Fatal(err)
  204. }
  205. defer func() {
  206. if err := n.Delete(); err != nil {
  207. t.Fatal(err)
  208. }
  209. }()
  210. if n.ID() == "" {
  211. t.Fatal("Expected non-empty network id")
  212. }
  213. }
  214. func TestDeleteNetworkWithActiveEndpoints(t *testing.T) {
  215. defer netnsutils.SetupTestOSContext(t)()
  216. controller := newController(t)
  217. netOption := options.Generic{
  218. "BridgeName": "testnetwork",
  219. }
  220. option := options.Generic{
  221. netlabel.GenericData: netOption,
  222. }
  223. network, err := createTestNetwork(controller, bridgeNetType, "testnetwork", option, nil, nil)
  224. if err != nil {
  225. t.Fatal(err)
  226. }
  227. ep, err := network.CreateEndpoint("testep")
  228. if err != nil {
  229. t.Fatal(err)
  230. }
  231. err = network.Delete()
  232. if err == nil {
  233. t.Fatal("Expected to fail. But instead succeeded")
  234. }
  235. if _, ok := err.(*libnetwork.ActiveEndpointsError); !ok {
  236. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  237. }
  238. // Done testing. Now cleanup.
  239. if err := ep.Delete(false); err != nil {
  240. t.Fatal(err)
  241. }
  242. if err := network.Delete(); err != nil {
  243. t.Fatal(err)
  244. }
  245. }
  246. func TestNetworkConfig(t *testing.T) {
  247. defer netnsutils.SetupTestOSContext(t)()
  248. controller := newController(t)
  249. // Verify config network cannot inherit another config network
  250. _, err := controller.NewNetwork("bridge", "config_network0", "",
  251. libnetwork.NetworkOptionConfigOnly(),
  252. libnetwork.NetworkOptionConfigFrom("anotherConfigNw"))
  253. if err == nil {
  254. t.Fatal("Expected to fail. But instead succeeded")
  255. }
  256. if _, ok := err.(types.ForbiddenError); !ok {
  257. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  258. }
  259. // Create supported config network
  260. netOption := options.Generic{
  261. "EnableICC": false,
  262. }
  263. option := options.Generic{
  264. netlabel.GenericData: netOption,
  265. }
  266. ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", SubPool: "192.168.100.128/25", Gateway: "192.168.100.1"}}
  267. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "2001:db8:abcd::/64", SubPool: "2001:db8:abcd::ef99/80", Gateway: "2001:db8:abcd::22"}}
  268. netOptions := []libnetwork.NetworkOption{
  269. libnetwork.NetworkOptionConfigOnly(),
  270. libnetwork.NetworkOptionEnableIPv6(true),
  271. libnetwork.NetworkOptionGeneric(option),
  272. libnetwork.NetworkOptionIpam("default", "", ipamV4ConfList, ipamV6ConfList, nil),
  273. }
  274. configNetwork, err := controller.NewNetwork(bridgeNetType, "config_network0", "", netOptions...)
  275. if err != nil {
  276. t.Fatal(err)
  277. }
  278. // Verify a config-only network cannot be created with network operator configurations
  279. for i, opt := range []libnetwork.NetworkOption{
  280. libnetwork.NetworkOptionInternalNetwork(),
  281. libnetwork.NetworkOptionAttachable(true),
  282. libnetwork.NetworkOptionIngress(true),
  283. } {
  284. _, err = controller.NewNetwork(bridgeNetType, "testBR", "",
  285. libnetwork.NetworkOptionConfigOnly(), opt)
  286. if err == nil {
  287. t.Fatalf("Expected to fail. But instead succeeded for option: %d", i)
  288. }
  289. if _, ok := err.(types.ForbiddenError); !ok {
  290. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  291. }
  292. }
  293. // Verify a network cannot be created with both config-from and network specific configurations
  294. for i, opt := range []libnetwork.NetworkOption{
  295. libnetwork.NetworkOptionEnableIPv6(true),
  296. libnetwork.NetworkOptionIpam("my-ipam", "", nil, nil, nil),
  297. libnetwork.NetworkOptionIpam("", "", ipamV4ConfList, nil, nil),
  298. libnetwork.NetworkOptionIpam("", "", nil, ipamV6ConfList, nil),
  299. libnetwork.NetworkOptionLabels(map[string]string{"number": "two"}),
  300. libnetwork.NetworkOptionDriverOpts(map[string]string{"com.docker.network.driver.mtu": "1600"}),
  301. } {
  302. _, err = controller.NewNetwork(bridgeNetType, "testBR", "",
  303. libnetwork.NetworkOptionConfigFrom("config_network0"), opt)
  304. if err == nil {
  305. t.Fatalf("Expected to fail. But instead succeeded for option: %d", i)
  306. }
  307. if _, ok := err.(types.ForbiddenError); !ok {
  308. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  309. }
  310. }
  311. // Create a valid network
  312. network, err := controller.NewNetwork(bridgeNetType, "testBR", "",
  313. libnetwork.NetworkOptionConfigFrom("config_network0"))
  314. if err != nil {
  315. t.Fatal(err)
  316. }
  317. // Verify the config network cannot be removed
  318. err = configNetwork.Delete()
  319. if err == nil {
  320. t.Fatal("Expected to fail. But instead succeeded")
  321. }
  322. if _, ok := err.(types.ForbiddenError); !ok {
  323. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  324. }
  325. // Delete network
  326. if err := network.Delete(); err != nil {
  327. t.Fatal(err)
  328. }
  329. // Verify the config network can now be removed
  330. if err := configNetwork.Delete(); err != nil {
  331. t.Fatal(err)
  332. }
  333. }
  334. func TestUnknownNetwork(t *testing.T) {
  335. defer netnsutils.SetupTestOSContext(t)()
  336. controller := newController(t)
  337. netOption := options.Generic{
  338. "BridgeName": "testnetwork",
  339. }
  340. option := options.Generic{
  341. netlabel.GenericData: netOption,
  342. }
  343. network, err := createTestNetwork(controller, bridgeNetType, "testnetwork", option, nil, nil)
  344. if err != nil {
  345. t.Fatal(err)
  346. }
  347. err = network.Delete()
  348. if err != nil {
  349. t.Fatal(err)
  350. }
  351. err = network.Delete()
  352. if err == nil {
  353. t.Fatal("Expected to fail. But instead succeeded")
  354. }
  355. if _, ok := err.(*libnetwork.UnknownNetworkError); !ok {
  356. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  357. }
  358. }
  359. func TestUnknownEndpoint(t *testing.T) {
  360. defer netnsutils.SetupTestOSContext(t)()
  361. controller := newController(t)
  362. netOption := options.Generic{
  363. "BridgeName": "testnetwork",
  364. }
  365. option := options.Generic{
  366. netlabel.GenericData: netOption,
  367. }
  368. ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24"}}
  369. network, err := createTestNetwork(controller, bridgeNetType, "testnetwork", option, ipamV4ConfList, nil)
  370. if err != nil {
  371. t.Fatal(err)
  372. }
  373. _, err = network.CreateEndpoint("")
  374. if err == nil {
  375. t.Fatal("Expected to fail. But instead succeeded")
  376. }
  377. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  378. t.Fatalf("Expected to fail with ErrInvalidName error. Actual error: %v", err)
  379. }
  380. ep, err := network.CreateEndpoint("testep")
  381. if err != nil {
  382. t.Fatal(err)
  383. }
  384. err = ep.Delete(false)
  385. if err != nil {
  386. t.Fatal(err)
  387. }
  388. // Done testing. Now cleanup
  389. if err := network.Delete(); err != nil {
  390. t.Fatal(err)
  391. }
  392. }
  393. func TestNetworkEndpointsWalkers(t *testing.T) {
  394. defer netnsutils.SetupTestOSContext(t)()
  395. controller := newController(t)
  396. // Create network 1 and add 2 endpoint: ep11, ep12
  397. netOption := options.Generic{
  398. netlabel.GenericData: options.Generic{
  399. "BridgeName": "network1",
  400. },
  401. }
  402. net1, err := createTestNetwork(controller, bridgeNetType, "network1", netOption, nil, nil)
  403. if err != nil {
  404. t.Fatal(err)
  405. }
  406. defer func() {
  407. if err := net1.Delete(); err != nil {
  408. t.Fatal(err)
  409. }
  410. }()
  411. ep11, err := net1.CreateEndpoint("ep11")
  412. if err != nil {
  413. t.Fatal(err)
  414. }
  415. defer func() {
  416. if err := ep11.Delete(false); err != nil {
  417. t.Fatal(err)
  418. }
  419. }()
  420. ep12, err := net1.CreateEndpoint("ep12")
  421. if err != nil {
  422. t.Fatal(err)
  423. }
  424. defer func() {
  425. if err := ep12.Delete(false); err != nil {
  426. t.Fatal(err)
  427. }
  428. }()
  429. // Test list methods on net1
  430. epList1 := net1.Endpoints()
  431. if len(epList1) != 2 {
  432. t.Fatalf("Endpoints() returned wrong number of elements: %d instead of 2", len(epList1))
  433. }
  434. // endpoint order is not guaranteed
  435. for _, e := range epList1 {
  436. if e != ep11 && e != ep12 {
  437. t.Fatal("Endpoints() did not return all the expected elements")
  438. }
  439. }
  440. // Test Endpoint Walk method
  441. var epName string
  442. var epWanted *libnetwork.Endpoint
  443. wlk := func(ep *libnetwork.Endpoint) bool {
  444. if ep.Name() == epName {
  445. epWanted = ep
  446. return true
  447. }
  448. return false
  449. }
  450. // Look for ep1 on network1
  451. epName = "ep11"
  452. net1.WalkEndpoints(wlk)
  453. if epWanted == nil {
  454. t.Fatal(err)
  455. }
  456. if ep11 != epWanted {
  457. t.Fatal(err)
  458. }
  459. ctx := context.TODO()
  460. current := len(controller.Networks(ctx))
  461. // Create network 2
  462. netOption = options.Generic{
  463. netlabel.GenericData: options.Generic{
  464. "BridgeName": "network2",
  465. },
  466. }
  467. net2, err := createTestNetwork(controller, bridgeNetType, "network2", netOption, nil, nil)
  468. if err != nil {
  469. t.Fatal(err)
  470. }
  471. defer func() {
  472. if err := net2.Delete(); err != nil {
  473. t.Fatal(err)
  474. }
  475. }()
  476. // Test Networks method
  477. if len(controller.Networks(ctx)) != current+1 {
  478. t.Fatalf("Did not find the expected number of networks")
  479. }
  480. // Test Network Walk method
  481. var netName string
  482. var netWanted *libnetwork.Network
  483. nwWlk := func(nw *libnetwork.Network) bool {
  484. if nw.Name() == netName {
  485. netWanted = nw
  486. return true
  487. }
  488. return false
  489. }
  490. // Look for network named "network1" and "network2"
  491. netName = "network1"
  492. controller.WalkNetworks(nwWlk)
  493. if netWanted == nil {
  494. t.Fatal(err)
  495. }
  496. if net1.ID() != netWanted.ID() {
  497. t.Fatal(err)
  498. }
  499. netName = "network2"
  500. controller.WalkNetworks(nwWlk)
  501. if netWanted == nil {
  502. t.Fatal(err)
  503. }
  504. if net2.ID() != netWanted.ID() {
  505. t.Fatal(err)
  506. }
  507. }
  508. func TestDuplicateEndpoint(t *testing.T) {
  509. defer netnsutils.SetupTestOSContext(t)()
  510. controller := newController(t)
  511. netOption := options.Generic{
  512. netlabel.GenericData: options.Generic{
  513. "BridgeName": "testnetwork",
  514. },
  515. }
  516. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", netOption, nil, nil)
  517. if err != nil {
  518. t.Fatal(err)
  519. }
  520. defer func() {
  521. if err := n.Delete(); err != nil {
  522. t.Fatal(err)
  523. }
  524. }()
  525. ep, err := n.CreateEndpoint("ep1")
  526. if err != nil {
  527. t.Fatal(err)
  528. }
  529. defer func() {
  530. if err := ep.Delete(false); err != nil {
  531. t.Fatal(err)
  532. }
  533. }()
  534. ep2, err := n.CreateEndpoint("ep1")
  535. defer func() {
  536. // Cleanup ep2 as well, else network cleanup might fail for failure cases
  537. if ep2 != nil {
  538. if err := ep2.Delete(false); err != nil {
  539. t.Fatal(err)
  540. }
  541. }
  542. }()
  543. if err == nil {
  544. t.Fatal("Expected to fail. But instead succeeded")
  545. }
  546. if _, ok := err.(types.ForbiddenError); !ok {
  547. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  548. }
  549. }
  550. func TestControllerQuery(t *testing.T) {
  551. defer netnsutils.SetupTestOSContext(t)()
  552. controller := newController(t)
  553. // Create network 1
  554. netOption := options.Generic{
  555. netlabel.GenericData: options.Generic{
  556. "BridgeName": "network1",
  557. },
  558. }
  559. net1, err := createTestNetwork(controller, bridgeNetType, "network1", netOption, nil, nil)
  560. if err != nil {
  561. t.Fatal(err)
  562. }
  563. defer func() {
  564. if err := net1.Delete(); err != nil {
  565. t.Fatal(err)
  566. }
  567. }()
  568. // Create network 2
  569. netOption = options.Generic{
  570. netlabel.GenericData: options.Generic{
  571. "BridgeName": "network2",
  572. },
  573. }
  574. net2, err := createTestNetwork(controller, bridgeNetType, "network2", netOption, nil, nil)
  575. if err != nil {
  576. t.Fatal(err)
  577. }
  578. defer func() {
  579. if err := net2.Delete(); err != nil {
  580. t.Fatal(err)
  581. }
  582. }()
  583. _, err = controller.NetworkByName("")
  584. if err == nil {
  585. t.Fatalf("NetworkByName() succeeded with invalid target name")
  586. }
  587. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  588. t.Fatalf("Expected NetworkByName() to fail with ErrInvalidName error. Got: %v", err)
  589. }
  590. _, err = controller.NetworkByID("")
  591. if err == nil {
  592. t.Fatalf("NetworkByID() succeeded with invalid target id")
  593. }
  594. if _, ok := err.(libnetwork.ErrInvalidID); !ok {
  595. t.Fatalf("NetworkByID() failed with unexpected error: %v", err)
  596. }
  597. g, err := controller.NetworkByID("network1")
  598. if err == nil {
  599. t.Fatalf("Unexpected success for NetworkByID(): %v", g)
  600. }
  601. if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok {
  602. t.Fatalf("NetworkByID() failed with unexpected error: %v", err)
  603. }
  604. g, err = controller.NetworkByName("network1")
  605. if err != nil {
  606. t.Fatalf("Unexpected failure for NetworkByName(): %v", err)
  607. }
  608. if g == nil {
  609. t.Fatalf("NetworkByName() did not find the network")
  610. }
  611. if g != net1 {
  612. t.Fatalf("NetworkByName() returned the wrong network")
  613. }
  614. g, err = controller.NetworkByID(net1.ID())
  615. if err != nil {
  616. t.Fatalf("Unexpected failure for NetworkByID(): %v", err)
  617. }
  618. if net1.ID() != g.ID() {
  619. t.Fatalf("NetworkByID() returned unexpected element: %v", g)
  620. }
  621. g, err = controller.NetworkByName("network2")
  622. if err != nil {
  623. t.Fatalf("Unexpected failure for NetworkByName(): %v", err)
  624. }
  625. if g == nil {
  626. t.Fatalf("NetworkByName() did not find the network")
  627. }
  628. if g != net2 {
  629. t.Fatalf("NetworkByName() returned the wrong network")
  630. }
  631. g, err = controller.NetworkByID(net2.ID())
  632. if err != nil {
  633. t.Fatalf("Unexpected failure for NetworkByID(): %v", err)
  634. }
  635. if net2.ID() != g.ID() {
  636. t.Fatalf("NetworkByID() returned unexpected element: %v", g)
  637. }
  638. }
  639. func TestNetworkQuery(t *testing.T) {
  640. defer netnsutils.SetupTestOSContext(t)()
  641. controller := newController(t)
  642. // Create network 1 and add 2 endpoint: ep11, ep12
  643. netOption := options.Generic{
  644. netlabel.GenericData: options.Generic{
  645. "BridgeName": "network1",
  646. },
  647. }
  648. net1, err := createTestNetwork(controller, bridgeNetType, "network1", netOption, nil, nil)
  649. if err != nil {
  650. t.Fatal(err)
  651. }
  652. defer func() {
  653. if err := net1.Delete(); err != nil {
  654. t.Fatal(err)
  655. }
  656. }()
  657. ep11, err := net1.CreateEndpoint("ep11")
  658. if err != nil {
  659. t.Fatal(err)
  660. }
  661. defer func() {
  662. if err := ep11.Delete(false); err != nil {
  663. t.Fatal(err)
  664. }
  665. }()
  666. ep12, err := net1.CreateEndpoint("ep12")
  667. if err != nil {
  668. t.Fatal(err)
  669. }
  670. defer func() {
  671. if err := ep12.Delete(false); err != nil {
  672. t.Fatal(err)
  673. }
  674. }()
  675. e, err := net1.EndpointByName("ep11")
  676. if err != nil {
  677. t.Fatal(err)
  678. }
  679. if ep11 != e {
  680. t.Fatalf("EndpointByName() returned %v instead of %v", e, ep11)
  681. }
  682. _, err = net1.EndpointByName("")
  683. if err == nil {
  684. t.Fatalf("EndpointByName() succeeded with invalid target name")
  685. }
  686. if _, ok := err.(libnetwork.ErrInvalidName); !ok {
  687. t.Fatalf("Expected EndpointByName() to fail with ErrInvalidName error. Got: %v", err)
  688. }
  689. e, err = net1.EndpointByName("IamNotAnEndpoint")
  690. if err == nil {
  691. t.Fatalf("EndpointByName() succeeded with unknown target name")
  692. }
  693. if _, ok := err.(libnetwork.ErrNoSuchEndpoint); !ok {
  694. t.Fatal(err)
  695. }
  696. if e != nil {
  697. t.Fatalf("EndpointByName(): expected nil, got %v", e)
  698. }
  699. e, err = net1.EndpointByID(ep12.ID())
  700. if err != nil {
  701. t.Fatal(err)
  702. }
  703. if ep12.ID() != e.ID() {
  704. t.Fatalf("EndpointByID() returned %v instead of %v", e, ep12)
  705. }
  706. _, err = net1.EndpointByID("")
  707. if err == nil {
  708. t.Fatalf("EndpointByID() succeeded with invalid target id")
  709. }
  710. if _, ok := err.(libnetwork.ErrInvalidID); !ok {
  711. t.Fatalf("EndpointByID() failed with unexpected error: %v", err)
  712. }
  713. }
  714. const containerID = "valid_c"
  715. func TestEndpointDeleteWithActiveContainer(t *testing.T) {
  716. defer netnsutils.SetupTestOSContext(t)()
  717. controller := newController(t)
  718. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", options.Generic{
  719. netlabel.GenericData: options.Generic{
  720. "BridgeName": "testnetwork",
  721. },
  722. }, nil, nil)
  723. if err != nil {
  724. t.Fatal(err)
  725. }
  726. defer func() {
  727. if err := n.Delete(); err != nil {
  728. t.Fatal(err)
  729. }
  730. }()
  731. n2, err := createTestNetwork(controller, bridgeNetType, "testnetwork2", options.Generic{
  732. netlabel.GenericData: options.Generic{
  733. "BridgeName": "testnetwork2",
  734. },
  735. }, nil, nil)
  736. if err != nil {
  737. t.Fatal(err)
  738. }
  739. defer func() {
  740. if err := n2.Delete(); err != nil {
  741. t.Fatal(err)
  742. }
  743. }()
  744. ep, err := n.CreateEndpoint("ep1")
  745. if err != nil {
  746. t.Fatal(err)
  747. }
  748. defer func() {
  749. err = ep.Delete(false)
  750. if err != nil {
  751. t.Fatal(err)
  752. }
  753. }()
  754. cnt, err := controller.NewSandbox(containerID,
  755. libnetwork.OptionHostname("test"),
  756. libnetwork.OptionDomainname("example.com"),
  757. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  758. defer func() {
  759. if err := cnt.Delete(); err != nil {
  760. t.Fatal(err)
  761. }
  762. }()
  763. err = ep.Join(cnt)
  764. if err != nil {
  765. t.Fatal(err)
  766. }
  767. defer func() {
  768. err = ep.Leave(cnt)
  769. if err != nil {
  770. t.Fatal(err)
  771. }
  772. }()
  773. err = ep.Delete(false)
  774. if err == nil {
  775. t.Fatal("Expected to fail. But instead succeeded")
  776. }
  777. if _, ok := err.(*libnetwork.ActiveContainerError); !ok {
  778. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  779. }
  780. }
  781. func TestEndpointMultipleJoins(t *testing.T) {
  782. defer netnsutils.SetupTestOSContext(t)()
  783. controller := newController(t)
  784. n, err := createTestNetwork(controller, bridgeNetType, "testmultiple", options.Generic{
  785. netlabel.GenericData: options.Generic{
  786. "BridgeName": "testmultiple",
  787. },
  788. }, nil, nil)
  789. if err != nil {
  790. t.Fatal(err)
  791. }
  792. defer func() {
  793. if err := n.Delete(); err != nil {
  794. t.Fatal(err)
  795. }
  796. }()
  797. ep, err := n.CreateEndpoint("ep1")
  798. if err != nil {
  799. t.Fatal(err)
  800. }
  801. defer func() {
  802. if err := ep.Delete(false); err != nil {
  803. t.Fatal(err)
  804. }
  805. }()
  806. sbx1, err := controller.NewSandbox(containerID,
  807. libnetwork.OptionHostname("test"),
  808. libnetwork.OptionDomainname("example.com"),
  809. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  810. )
  811. if err != nil {
  812. t.Fatal(err)
  813. }
  814. defer func() {
  815. if err := sbx1.Delete(); err != nil {
  816. t.Fatal(err)
  817. }
  818. }()
  819. sbx2, err := controller.NewSandbox("c2")
  820. if err != nil {
  821. t.Fatal(err)
  822. }
  823. defer func() {
  824. if err := sbx2.Delete(); err != nil {
  825. t.Fatal(err)
  826. }
  827. }()
  828. err = ep.Join(sbx1)
  829. if err != nil {
  830. t.Fatal(err)
  831. }
  832. defer func() {
  833. err = ep.Leave(sbx1)
  834. if err != nil {
  835. t.Fatal(err)
  836. }
  837. }()
  838. err = ep.Join(sbx2)
  839. if err == nil {
  840. t.Fatal("Expected to fail multiple joins for the same endpoint")
  841. }
  842. if _, ok := err.(types.ForbiddenError); !ok {
  843. t.Fatalf("Failed with unexpected error type: %T. Desc: %s", err, err.Error())
  844. }
  845. }
  846. func TestLeaveAll(t *testing.T) {
  847. defer netnsutils.SetupTestOSContext(t)()
  848. controller := newController(t)
  849. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", options.Generic{
  850. netlabel.GenericData: options.Generic{
  851. "BridgeName": "testnetwork",
  852. },
  853. }, nil, nil)
  854. if err != nil {
  855. t.Fatal(err)
  856. }
  857. defer func() {
  858. // If this goes through, it means cnt.Delete() effectively detached from all the endpoints
  859. if err := n.Delete(); err != nil {
  860. t.Fatal(err)
  861. }
  862. }()
  863. n2, err := createTestNetwork(controller, bridgeNetType, "testnetwork2", options.Generic{
  864. netlabel.GenericData: options.Generic{
  865. "BridgeName": "testnetwork2",
  866. },
  867. }, nil, nil)
  868. if err != nil {
  869. t.Fatal(err)
  870. }
  871. defer func() {
  872. if err := n2.Delete(); err != nil {
  873. t.Fatal(err)
  874. }
  875. }()
  876. ep1, err := n.CreateEndpoint("ep1")
  877. if err != nil {
  878. t.Fatal(err)
  879. }
  880. ep2, err := n2.CreateEndpoint("ep2")
  881. if err != nil {
  882. t.Fatal(err)
  883. }
  884. cnt, err := controller.NewSandbox("leaveall")
  885. if err != nil {
  886. t.Fatal(err)
  887. }
  888. err = ep1.Join(cnt)
  889. if err != nil {
  890. t.Fatalf("Failed to join ep1: %v", err)
  891. }
  892. err = ep2.Join(cnt)
  893. if err != nil {
  894. t.Fatalf("Failed to join ep2: %v", err)
  895. }
  896. err = cnt.Delete()
  897. if err != nil {
  898. t.Fatal(err)
  899. }
  900. }
  901. func TestContainerInvalidLeave(t *testing.T) {
  902. defer netnsutils.SetupTestOSContext(t)()
  903. controller := newController(t)
  904. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", options.Generic{
  905. netlabel.GenericData: options.Generic{
  906. "BridgeName": "testnetwork",
  907. },
  908. }, nil, nil)
  909. if err != nil {
  910. t.Fatal(err)
  911. }
  912. defer func() {
  913. if err := n.Delete(); err != nil {
  914. t.Fatal(err)
  915. }
  916. }()
  917. ep, err := n.CreateEndpoint("ep1")
  918. if err != nil {
  919. t.Fatal(err)
  920. }
  921. defer func() {
  922. if err := ep.Delete(false); err != nil {
  923. t.Fatal(err)
  924. }
  925. }()
  926. cnt, err := controller.NewSandbox(containerID,
  927. libnetwork.OptionHostname("test"),
  928. libnetwork.OptionDomainname("example.com"),
  929. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  930. if err != nil {
  931. t.Fatal(err)
  932. }
  933. defer func() {
  934. if err := cnt.Delete(); err != nil {
  935. t.Fatal(err)
  936. }
  937. }()
  938. err = ep.Leave(cnt)
  939. if err == nil {
  940. t.Fatal("Expected to fail leave from an endpoint which has no active join")
  941. }
  942. if _, ok := err.(types.ForbiddenError); !ok {
  943. t.Fatalf("Failed with unexpected error type: %T. Desc: %s", err, err.Error())
  944. }
  945. if err = ep.Leave(nil); err == nil {
  946. t.Fatalf("Expected to fail leave nil Sandbox")
  947. }
  948. if _, ok := err.(types.InvalidParameterError); !ok {
  949. t.Fatalf("Unexpected error type returned: %T. Desc: %s", err, err.Error())
  950. }
  951. fsbx := &libnetwork.Sandbox{}
  952. if err = ep.Leave(fsbx); err == nil {
  953. t.Fatalf("Expected to fail leave with invalid Sandbox")
  954. }
  955. if _, ok := err.(types.InvalidParameterError); !ok {
  956. t.Fatalf("Unexpected error type returned: %T. Desc: %s", err, err.Error())
  957. }
  958. }
  959. func TestEndpointUpdateParent(t *testing.T) {
  960. defer netnsutils.SetupTestOSContext(t)()
  961. controller := newController(t)
  962. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", options.Generic{
  963. netlabel.GenericData: options.Generic{
  964. "BridgeName": "testnetwork",
  965. },
  966. }, nil, nil)
  967. if err != nil {
  968. t.Fatal(err)
  969. }
  970. defer func() {
  971. if err := n.Delete(); err != nil {
  972. t.Fatal(err)
  973. }
  974. }()
  975. ep1, err := n.CreateEndpoint("ep1")
  976. if err != nil {
  977. t.Fatal(err)
  978. }
  979. ep2, err := n.CreateEndpoint("ep2")
  980. if err != nil {
  981. t.Fatal(err)
  982. }
  983. sbx1, err := controller.NewSandbox(containerID,
  984. libnetwork.OptionHostname("test"),
  985. libnetwork.OptionDomainname("example.com"),
  986. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  987. if err != nil {
  988. t.Fatal(err)
  989. }
  990. defer func() {
  991. if err := sbx1.Delete(); err != nil {
  992. t.Fatal(err)
  993. }
  994. }()
  995. sbx2, err := controller.NewSandbox("c2",
  996. libnetwork.OptionHostname("test2"),
  997. libnetwork.OptionDomainname("example.com"),
  998. libnetwork.OptionHostsPath("/var/lib/docker/test_network/container2/hosts"),
  999. libnetwork.OptionExtraHost("web", "192.168.0.2"))
  1000. if err != nil {
  1001. t.Fatal(err)
  1002. }
  1003. defer func() {
  1004. if err := sbx2.Delete(); err != nil {
  1005. t.Fatal(err)
  1006. }
  1007. }()
  1008. err = ep1.Join(sbx1)
  1009. if err != nil {
  1010. t.Fatal(err)
  1011. }
  1012. err = ep2.Join(sbx2)
  1013. if err != nil {
  1014. t.Fatal(err)
  1015. }
  1016. }
  1017. func TestInvalidRemoteDriver(t *testing.T) {
  1018. mux := http.NewServeMux()
  1019. server := httptest.NewServer(mux)
  1020. if server == nil {
  1021. t.Fatal("Failed to start an HTTP Server")
  1022. }
  1023. defer server.Close()
  1024. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  1025. w.Header().Set("Content-Type", plugins.VersionMimetype)
  1026. fmt.Fprintln(w, `{"Implements": ["InvalidDriver"]}`)
  1027. })
  1028. if err := os.MkdirAll(specPath, 0o755); err != nil {
  1029. t.Fatal(err)
  1030. }
  1031. defer func() {
  1032. if err := os.RemoveAll(specPath); err != nil {
  1033. t.Fatal(err)
  1034. }
  1035. }()
  1036. if err := os.WriteFile(filepath.Join(specPath, "invalid-network-driver.spec"), []byte(server.URL), 0o644); err != nil {
  1037. t.Fatal(err)
  1038. }
  1039. ctrlr, err := libnetwork.New()
  1040. if err != nil {
  1041. t.Fatal(err)
  1042. }
  1043. defer ctrlr.Stop()
  1044. _, err = ctrlr.NewNetwork("invalid-network-driver", "dummy", "",
  1045. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  1046. if err == nil {
  1047. t.Fatal("Expected to fail. But instead succeeded")
  1048. }
  1049. if !errors.Is(err, plugins.ErrNotImplements) {
  1050. t.Fatalf("Did not fail with expected error. Actual error: %v", err)
  1051. }
  1052. }
  1053. func TestValidRemoteDriver(t *testing.T) {
  1054. mux := http.NewServeMux()
  1055. server := httptest.NewServer(mux)
  1056. if server == nil {
  1057. t.Fatal("Failed to start an HTTP Server")
  1058. }
  1059. defer server.Close()
  1060. mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
  1061. w.Header().Set("Content-Type", plugins.VersionMimetype)
  1062. fmt.Fprintf(w, `{"Implements": ["%s"]}`, driverapi.NetworkPluginEndpointType)
  1063. })
  1064. mux.HandleFunc(fmt.Sprintf("/%s.GetCapabilities", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1065. w.Header().Set("Content-Type", plugins.VersionMimetype)
  1066. fmt.Fprintf(w, `{"Scope":"local"}`)
  1067. })
  1068. mux.HandleFunc(fmt.Sprintf("/%s.CreateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1069. w.Header().Set("Content-Type", plugins.VersionMimetype)
  1070. fmt.Fprintf(w, "null")
  1071. })
  1072. mux.HandleFunc(fmt.Sprintf("/%s.DeleteNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) {
  1073. w.Header().Set("Content-Type", plugins.VersionMimetype)
  1074. fmt.Fprintf(w, "null")
  1075. })
  1076. if err := os.MkdirAll(specPath, 0o755); err != nil {
  1077. t.Fatal(err)
  1078. }
  1079. defer func() {
  1080. if err := os.RemoveAll(specPath); err != nil {
  1081. t.Fatal(err)
  1082. }
  1083. }()
  1084. if err := os.WriteFile(filepath.Join(specPath, "valid-network-driver.spec"), []byte(server.URL), 0o644); err != nil {
  1085. t.Fatal(err)
  1086. }
  1087. controller := newController(t)
  1088. n, err := controller.NewNetwork("valid-network-driver", "dummy", "",
  1089. libnetwork.NetworkOptionGeneric(getEmptyGenericOption()))
  1090. if err != nil {
  1091. // Only fail if we could not find the plugin driver
  1092. if isNotFound(err) {
  1093. t.Fatal(err)
  1094. }
  1095. return
  1096. }
  1097. defer func() {
  1098. if err := n.Delete(); err != nil {
  1099. t.Fatal(err)
  1100. }
  1101. }()
  1102. }
  1103. func makeTesthostNetwork(t *testing.T, c *libnetwork.Controller) *libnetwork.Network {
  1104. t.Helper()
  1105. n, err := createTestNetwork(c, "host", "testhost", options.Generic{}, nil, nil)
  1106. if err != nil {
  1107. t.Fatal(err)
  1108. }
  1109. return n
  1110. }
  1111. func TestHost(t *testing.T) {
  1112. defer netnsutils.SetupTestOSContext(t)()
  1113. controller := newController(t)
  1114. sbx1, err := controller.NewSandbox("host_c1",
  1115. libnetwork.OptionHostname("test1"),
  1116. libnetwork.OptionDomainname("example.com"),
  1117. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  1118. libnetwork.OptionUseDefaultSandbox())
  1119. if err != nil {
  1120. t.Fatal(err)
  1121. }
  1122. defer func() {
  1123. if err := sbx1.Delete(); err != nil {
  1124. t.Fatal(err)
  1125. }
  1126. }()
  1127. sbx2, err := controller.NewSandbox("host_c2",
  1128. libnetwork.OptionHostname("test2"),
  1129. libnetwork.OptionDomainname("example.com"),
  1130. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  1131. libnetwork.OptionUseDefaultSandbox())
  1132. if err != nil {
  1133. t.Fatal(err)
  1134. }
  1135. defer func() {
  1136. if err := sbx2.Delete(); err != nil {
  1137. t.Fatal(err)
  1138. }
  1139. }()
  1140. network := makeTesthostNetwork(t, controller)
  1141. ep1, err := network.CreateEndpoint("testep1")
  1142. if err != nil {
  1143. t.Fatal(err)
  1144. }
  1145. if err := ep1.Join(sbx1); err != nil {
  1146. t.Fatal(err)
  1147. }
  1148. ep2, err := network.CreateEndpoint("testep2")
  1149. if err != nil {
  1150. t.Fatal(err)
  1151. }
  1152. if err := ep2.Join(sbx2); err != nil {
  1153. t.Fatal(err)
  1154. }
  1155. if err := ep1.Leave(sbx1); err != nil {
  1156. t.Fatal(err)
  1157. }
  1158. if err := ep2.Leave(sbx2); err != nil {
  1159. t.Fatal(err)
  1160. }
  1161. if err := ep1.Delete(false); err != nil {
  1162. t.Fatal(err)
  1163. }
  1164. if err := ep2.Delete(false); err != nil {
  1165. t.Fatal(err)
  1166. }
  1167. // Try to create another host endpoint and join/leave that.
  1168. cnt3, err := controller.NewSandbox("host_c3",
  1169. libnetwork.OptionHostname("test3"),
  1170. libnetwork.OptionDomainname("example.com"),
  1171. libnetwork.OptionExtraHost("web", "192.168.0.1"),
  1172. libnetwork.OptionUseDefaultSandbox())
  1173. if err != nil {
  1174. t.Fatal(err)
  1175. }
  1176. defer func() {
  1177. if err := cnt3.Delete(); err != nil {
  1178. t.Fatal(err)
  1179. }
  1180. }()
  1181. ep3, err := network.CreateEndpoint("testep3")
  1182. if err != nil {
  1183. t.Fatal(err)
  1184. }
  1185. if err := ep3.Join(sbx2); err != nil {
  1186. t.Fatal(err)
  1187. }
  1188. if err := ep3.Leave(sbx2); err != nil {
  1189. t.Fatal(err)
  1190. }
  1191. if err := ep3.Delete(false); err != nil {
  1192. t.Fatal(err)
  1193. }
  1194. }
  1195. // Testing IPV6 from MAC address
  1196. func TestBridgeIpv6FromMac(t *testing.T) {
  1197. defer netnsutils.SetupTestOSContext(t)()
  1198. controller := newController(t)
  1199. netOption := options.Generic{
  1200. netlabel.GenericData: options.Generic{
  1201. "BridgeName": "testipv6mac",
  1202. "EnableICC": true,
  1203. "EnableIPMasquerade": true,
  1204. },
  1205. }
  1206. ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", Gateway: "192.168.100.1"}}
  1207. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
  1208. network, err := controller.NewNetwork(bridgeNetType, "testipv6mac", "",
  1209. libnetwork.NetworkOptionGeneric(netOption),
  1210. libnetwork.NetworkOptionEnableIPv6(true),
  1211. libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4ConfList, ipamV6ConfList, nil),
  1212. libnetwork.NetworkOptionDeferIPv6Alloc(true))
  1213. if err != nil {
  1214. t.Fatal(err)
  1215. }
  1216. mac := net.HardwareAddr{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
  1217. epOption := options.Generic{netlabel.MacAddress: mac}
  1218. ep, err := network.CreateEndpoint("testep", libnetwork.EndpointOptionGeneric(epOption))
  1219. if err != nil {
  1220. t.Fatal(err)
  1221. }
  1222. iface := ep.Info().Iface()
  1223. if !bytes.Equal(iface.MacAddress(), mac) {
  1224. t.Fatalf("Unexpected mac address: %v", iface.MacAddress())
  1225. }
  1226. ip, expIP, _ := net.ParseCIDR("fe90::aabb:ccdd:eeff/64")
  1227. expIP.IP = ip
  1228. if !types.CompareIPNet(expIP, iface.AddressIPv6()) {
  1229. t.Fatalf("Expected %v. Got: %v", expIP, iface.AddressIPv6())
  1230. }
  1231. if err := ep.Delete(false); err != nil {
  1232. t.Fatal(err)
  1233. }
  1234. if err := network.Delete(); err != nil {
  1235. t.Fatal(err)
  1236. }
  1237. }
  1238. func checkSandbox(t *testing.T, info libnetwork.EndpointInfo) {
  1239. key := info.Sandbox().Key()
  1240. sbNs, err := netns.GetFromPath(key)
  1241. if err != nil {
  1242. t.Fatalf("Failed to get network namespace path %q: %v", key, err)
  1243. }
  1244. defer sbNs.Close()
  1245. nh, err := netlink.NewHandleAt(sbNs)
  1246. if err != nil {
  1247. t.Fatal(err)
  1248. }
  1249. _, err = nh.LinkByName("eth0")
  1250. if err != nil {
  1251. t.Fatalf("Could not find the interface eth0 inside the sandbox: %v", err)
  1252. }
  1253. _, err = nh.LinkByName("eth1")
  1254. if err != nil {
  1255. t.Fatalf("Could not find the interface eth1 inside the sandbox: %v", err)
  1256. }
  1257. }
  1258. func TestEndpointJoin(t *testing.T) {
  1259. defer netnsutils.SetupTestOSContext(t)()
  1260. controller := newController(t)
  1261. // Create network 1 and add 2 endpoint: ep11, ep12
  1262. netOption := options.Generic{
  1263. netlabel.GenericData: options.Generic{
  1264. "BridgeName": "testnetwork1",
  1265. "EnableICC": true,
  1266. "EnableIPMasquerade": true,
  1267. },
  1268. }
  1269. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
  1270. n1, err := controller.NewNetwork(bridgeNetType, "testnetwork1", "",
  1271. libnetwork.NetworkOptionGeneric(netOption),
  1272. libnetwork.NetworkOptionEnableIPv6(true),
  1273. libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", nil, ipamV6ConfList, nil),
  1274. libnetwork.NetworkOptionDeferIPv6Alloc(true))
  1275. if err != nil {
  1276. t.Fatal(err)
  1277. }
  1278. defer func() {
  1279. if err := n1.Delete(); err != nil {
  1280. t.Fatal(err)
  1281. }
  1282. }()
  1283. ep1, err := n1.CreateEndpoint("ep1")
  1284. if err != nil {
  1285. t.Fatal(err)
  1286. }
  1287. defer func() {
  1288. if err := ep1.Delete(false); err != nil {
  1289. t.Fatal(err)
  1290. }
  1291. }()
  1292. // Validate if ep.Info() only gives me IP address info and not names and gateway during CreateEndpoint()
  1293. info := ep1.Info()
  1294. iface := info.Iface()
  1295. if iface.Address() != nil && iface.Address().IP.To4() == nil {
  1296. t.Fatalf("Invalid IP address returned: %v", iface.Address())
  1297. }
  1298. if iface.AddressIPv6() != nil && iface.AddressIPv6().IP == nil {
  1299. t.Fatalf("Invalid IPv6 address returned: %v", iface.Address())
  1300. }
  1301. if len(info.Gateway()) != 0 {
  1302. t.Fatalf("Expected empty gateway for an empty endpoint. Instead found a gateway: %v", info.Gateway())
  1303. }
  1304. if len(info.GatewayIPv6()) != 0 {
  1305. t.Fatalf("Expected empty gateway for an empty ipv6 endpoint. Instead found a gateway: %v", info.GatewayIPv6())
  1306. }
  1307. if info.Sandbox() != nil {
  1308. t.Fatalf("Expected an empty sandbox key for an empty endpoint. Instead found a non-empty sandbox key: %s", info.Sandbox().Key())
  1309. }
  1310. // test invalid joins
  1311. err = ep1.Join(nil)
  1312. if err == nil {
  1313. t.Fatalf("Expected to fail join with nil Sandbox")
  1314. }
  1315. if _, ok := err.(types.InvalidParameterError); !ok {
  1316. t.Fatalf("Unexpected error type returned: %T", err)
  1317. }
  1318. fsbx := &libnetwork.Sandbox{}
  1319. if err = ep1.Join(fsbx); err == nil {
  1320. t.Fatalf("Expected to fail join with invalid Sandbox")
  1321. }
  1322. if _, ok := err.(types.InvalidParameterError); !ok {
  1323. t.Fatalf("Unexpected error type returned: %T", err)
  1324. }
  1325. sb, err := controller.NewSandbox(containerID,
  1326. libnetwork.OptionHostname("test"),
  1327. libnetwork.OptionDomainname("example.com"),
  1328. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  1329. if err != nil {
  1330. t.Fatal(err)
  1331. }
  1332. defer func() {
  1333. if err := sb.Delete(); err != nil {
  1334. t.Fatal(err)
  1335. }
  1336. }()
  1337. err = ep1.Join(sb)
  1338. if err != nil {
  1339. t.Fatal(err)
  1340. }
  1341. defer func() {
  1342. err = ep1.Leave(sb)
  1343. if err != nil {
  1344. t.Fatal(err)
  1345. }
  1346. }()
  1347. // Validate if ep.Info() only gives valid gateway and sandbox key after has container has joined.
  1348. info = ep1.Info()
  1349. if len(info.Gateway()) == 0 {
  1350. t.Fatalf("Expected a valid gateway for a joined endpoint. Instead found an invalid gateway: %v", info.Gateway())
  1351. }
  1352. if len(info.GatewayIPv6()) == 0 {
  1353. t.Fatalf("Expected a valid ipv6 gateway for a joined endpoint. Instead found an invalid gateway: %v", info.GatewayIPv6())
  1354. }
  1355. if info.Sandbox() == nil {
  1356. t.Fatalf("Expected an non-empty sandbox key for a joined endpoint. Instead found an empty sandbox key")
  1357. }
  1358. // Check endpoint provided container information
  1359. if ep1.Info().Sandbox().Key() != sb.Key() {
  1360. t.Fatalf("Endpoint Info returned unexpected sandbox key: %s", sb.Key())
  1361. }
  1362. // Attempt retrieval of endpoint interfaces statistics
  1363. stats, err := sb.Statistics()
  1364. if err != nil {
  1365. t.Fatal(err)
  1366. }
  1367. if _, ok := stats["eth0"]; !ok {
  1368. t.Fatalf("Did not find eth0 statistics")
  1369. }
  1370. // Now test the container joining another network
  1371. n2, err := createTestNetwork(controller, bridgeNetType, "testnetwork2",
  1372. options.Generic{
  1373. netlabel.GenericData: options.Generic{
  1374. "BridgeName": "testnetwork2",
  1375. },
  1376. }, nil, nil)
  1377. if err != nil {
  1378. t.Fatal(err)
  1379. }
  1380. defer func() {
  1381. if err := n2.Delete(); err != nil {
  1382. t.Fatal(err)
  1383. }
  1384. }()
  1385. ep2, err := n2.CreateEndpoint("ep2")
  1386. if err != nil {
  1387. t.Fatal(err)
  1388. }
  1389. defer func() {
  1390. if err := ep2.Delete(false); err != nil {
  1391. t.Fatal(err)
  1392. }
  1393. }()
  1394. err = ep2.Join(sb)
  1395. if err != nil {
  1396. t.Fatal(err)
  1397. }
  1398. defer func() {
  1399. err = ep2.Leave(sb)
  1400. if err != nil {
  1401. t.Fatal(err)
  1402. }
  1403. }()
  1404. if ep1.Info().Sandbox().Key() != ep2.Info().Sandbox().Key() {
  1405. t.Fatalf("ep1 and ep2 returned different container sandbox key")
  1406. }
  1407. checkSandbox(t, info)
  1408. }
  1409. func TestExternalKey(t *testing.T) {
  1410. externalKeyTest(t, false)
  1411. }
  1412. func externalKeyTest(t *testing.T, reexec bool) {
  1413. defer netnsutils.SetupTestOSContext(t)()
  1414. controller := newController(t)
  1415. n, err := createTestNetwork(controller, bridgeNetType, "testnetwork", options.Generic{
  1416. netlabel.GenericData: options.Generic{
  1417. "BridgeName": "testnetwork",
  1418. },
  1419. }, nil, nil)
  1420. if err != nil {
  1421. t.Fatal(err)
  1422. }
  1423. defer func() {
  1424. if err := n.Delete(); err != nil {
  1425. t.Fatal(err)
  1426. }
  1427. }()
  1428. n2, err := createTestNetwork(controller, bridgeNetType, "testnetwork2", options.Generic{
  1429. netlabel.GenericData: options.Generic{
  1430. "BridgeName": "testnetwork2",
  1431. },
  1432. }, nil, nil)
  1433. if err != nil {
  1434. t.Fatal(err)
  1435. }
  1436. defer func() {
  1437. if err := n2.Delete(); err != nil {
  1438. t.Fatal(err)
  1439. }
  1440. }()
  1441. ep, err := n.CreateEndpoint("ep1")
  1442. if err != nil {
  1443. t.Fatal(err)
  1444. }
  1445. defer func() {
  1446. err = ep.Delete(false)
  1447. if err != nil {
  1448. t.Fatal(err)
  1449. }
  1450. }()
  1451. ep2, err := n2.CreateEndpoint("ep2")
  1452. if err != nil {
  1453. t.Fatal(err)
  1454. }
  1455. defer func() {
  1456. err = ep2.Delete(false)
  1457. if err != nil {
  1458. t.Fatal(err)
  1459. }
  1460. }()
  1461. cnt, err := controller.NewSandbox(containerID,
  1462. libnetwork.OptionHostname("test"),
  1463. libnetwork.OptionDomainname("example.com"),
  1464. libnetwork.OptionUseExternalKey(),
  1465. libnetwork.OptionExtraHost("web", "192.168.0.1"))
  1466. defer func() {
  1467. if err := cnt.Delete(); err != nil {
  1468. t.Fatal(err)
  1469. }
  1470. osl.GC()
  1471. }()
  1472. // Join endpoint to sandbox before SetKey
  1473. err = ep.Join(cnt)
  1474. if err != nil {
  1475. t.Fatal(err)
  1476. }
  1477. defer func() {
  1478. err = ep.Leave(cnt)
  1479. if err != nil {
  1480. t.Fatal(err)
  1481. }
  1482. }()
  1483. sbox := ep.Info().Sandbox()
  1484. if sbox == nil {
  1485. t.Fatalf("Expected to have a valid Sandbox")
  1486. }
  1487. if reexec {
  1488. err := reexecSetKey("this-must-fail", containerID, controller.ID())
  1489. if err == nil {
  1490. t.Fatalf("libnetwork-setkey must fail if the corresponding namespace is not created")
  1491. }
  1492. } else {
  1493. // Setting an non-existing key (namespace) must fail
  1494. if err := sbox.SetKey("this-must-fail"); err == nil {
  1495. t.Fatalf("Setkey must fail if the corresponding namespace is not created")
  1496. }
  1497. }
  1498. // Create a new OS sandbox using the osl API before using it in SetKey
  1499. if extOsBox, err := osl.NewSandbox("ValidKey", true, false); err != nil {
  1500. t.Fatalf("Failed to create new osl sandbox")
  1501. } else {
  1502. defer func() {
  1503. if err := extOsBox.Destroy(); err != nil {
  1504. log.G(context.TODO()).Warnf("Failed to remove os sandbox: %v", err)
  1505. }
  1506. }()
  1507. }
  1508. if reexec {
  1509. err := reexecSetKey("ValidKey", containerID, controller.ID())
  1510. if err != nil {
  1511. t.Fatalf("libnetwork-setkey failed with %v", err)
  1512. }
  1513. } else {
  1514. if err := sbox.SetKey("ValidKey"); err != nil {
  1515. t.Fatalf("Setkey failed with %v", err)
  1516. }
  1517. }
  1518. // Join endpoint to sandbox after SetKey
  1519. err = ep2.Join(sbox)
  1520. if err != nil {
  1521. t.Fatal(err)
  1522. }
  1523. defer func() {
  1524. err = ep2.Leave(sbox)
  1525. if err != nil {
  1526. t.Fatal(err)
  1527. }
  1528. }()
  1529. if ep.Info().Sandbox().Key() != ep2.Info().Sandbox().Key() {
  1530. t.Fatalf("ep1 and ep2 returned different container sandbox key")
  1531. }
  1532. checkSandbox(t, ep.Info())
  1533. }
  1534. func reexecSetKey(key string, containerID string, controllerID string) error {
  1535. type libcontainerState struct {
  1536. NamespacePaths map[string]string
  1537. }
  1538. var (
  1539. state libcontainerState
  1540. b []byte
  1541. err error
  1542. )
  1543. state.NamespacePaths = make(map[string]string)
  1544. state.NamespacePaths["NEWNET"] = key
  1545. if b, err = json.Marshal(state); err != nil {
  1546. return err
  1547. }
  1548. cmd := &exec.Cmd{
  1549. Path: reexec.Self(),
  1550. Args: append([]string{"libnetwork-setkey"}, containerID, controllerID),
  1551. Stdin: strings.NewReader(string(b)),
  1552. Stdout: os.Stdout,
  1553. Stderr: os.Stderr,
  1554. }
  1555. return cmd.Run()
  1556. }
  1557. func TestEnableIPv6(t *testing.T) {
  1558. defer netnsutils.SetupTestOSContext(t)()
  1559. controller := newController(t)
  1560. tmpResolvConf := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\nnameserver 2001:4860:4860::8888\n")
  1561. expectedResolvConf := []byte("search pommesfrites.fr\nnameserver 127.0.0.11\nnameserver 2001:4860:4860::8888\noptions ndots:0\n")
  1562. // take a copy of resolv.conf for restoring after test completes
  1563. resolvConfSystem, err := os.ReadFile("/etc/resolv.conf")
  1564. if err != nil {
  1565. t.Fatal(err)
  1566. }
  1567. // cleanup
  1568. defer func() {
  1569. if err := os.WriteFile("/etc/resolv.conf", resolvConfSystem, 0o644); err != nil {
  1570. t.Fatal(err)
  1571. }
  1572. }()
  1573. netOption := options.Generic{
  1574. netlabel.EnableIPv6: true,
  1575. netlabel.GenericData: options.Generic{
  1576. "BridgeName": "testnetwork",
  1577. },
  1578. }
  1579. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe99::/64", Gateway: "fe99::9"}}
  1580. n, err := createTestNetwork(controller, "bridge", "testnetwork", netOption, nil, ipamV6ConfList)
  1581. if err != nil {
  1582. t.Fatal(err)
  1583. }
  1584. defer func() {
  1585. if err := n.Delete(); err != nil {
  1586. t.Fatal(err)
  1587. }
  1588. }()
  1589. ep1, err := n.CreateEndpoint("ep1")
  1590. if err != nil {
  1591. t.Fatal(err)
  1592. }
  1593. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf, 0o644); err != nil {
  1594. t.Fatal(err)
  1595. }
  1596. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  1597. defer os.Remove(resolvConfPath)
  1598. sb, err := controller.NewSandbox(containerID, libnetwork.OptionResolvConfPath(resolvConfPath))
  1599. if err != nil {
  1600. t.Fatal(err)
  1601. }
  1602. defer func() {
  1603. if err := sb.Delete(); err != nil {
  1604. t.Fatal(err)
  1605. }
  1606. }()
  1607. err = ep1.Join(sb)
  1608. if err != nil {
  1609. t.Fatal(err)
  1610. }
  1611. content, err := os.ReadFile(resolvConfPath)
  1612. if err != nil {
  1613. t.Fatal(err)
  1614. }
  1615. if !bytes.Equal(content, expectedResolvConf) {
  1616. t.Fatalf("Expected:\n%s\nGot:\n%s", string(expectedResolvConf), string(content))
  1617. }
  1618. if err != nil {
  1619. t.Fatal(err)
  1620. }
  1621. }
  1622. func TestResolvConfHost(t *testing.T) {
  1623. defer netnsutils.SetupTestOSContext(t)()
  1624. controller := newController(t)
  1625. tmpResolvConf := []byte("search localhost.net\nnameserver 127.0.0.1\nnameserver 2001:4860:4860::8888\n")
  1626. // take a copy of resolv.conf for restoring after test completes
  1627. resolvConfSystem, err := os.ReadFile("/etc/resolv.conf")
  1628. if err != nil {
  1629. t.Fatal(err)
  1630. }
  1631. // cleanup
  1632. defer func() {
  1633. if err := os.WriteFile("/etc/resolv.conf", resolvConfSystem, 0o644); err != nil {
  1634. t.Fatal(err)
  1635. }
  1636. }()
  1637. n := makeTesthostNetwork(t, controller)
  1638. ep1, err := n.CreateEndpoint("ep1", libnetwork.CreateOptionDisableResolution())
  1639. if err != nil {
  1640. t.Fatal(err)
  1641. }
  1642. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf, 0o644); err != nil {
  1643. t.Fatal(err)
  1644. }
  1645. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  1646. defer os.Remove(resolvConfPath)
  1647. sb, err := controller.NewSandbox(containerID,
  1648. libnetwork.OptionUseDefaultSandbox(),
  1649. libnetwork.OptionResolvConfPath(resolvConfPath),
  1650. libnetwork.OptionOriginResolvConfPath("/etc/resolv.conf"))
  1651. if err != nil {
  1652. t.Fatal(err)
  1653. }
  1654. defer func() {
  1655. if err := sb.Delete(); err != nil {
  1656. t.Fatal(err)
  1657. }
  1658. }()
  1659. err = ep1.Join(sb)
  1660. if err != nil {
  1661. t.Fatal(err)
  1662. }
  1663. defer func() {
  1664. err = ep1.Leave(sb)
  1665. if err != nil {
  1666. t.Fatal(err)
  1667. }
  1668. }()
  1669. finfo, err := os.Stat(resolvConfPath)
  1670. if err != nil {
  1671. t.Fatal(err)
  1672. }
  1673. fmode := (os.FileMode)(0o644)
  1674. if finfo.Mode() != fmode {
  1675. t.Fatalf("Expected file mode %s, got %s", fmode.String(), finfo.Mode().String())
  1676. }
  1677. content, err := os.ReadFile(resolvConfPath)
  1678. if err != nil {
  1679. t.Fatal(err)
  1680. }
  1681. if !bytes.Equal(content, tmpResolvConf) {
  1682. t.Fatalf("Expected:\n%s\nGot:\n%s", string(tmpResolvConf), string(content))
  1683. }
  1684. }
  1685. func TestResolvConf(t *testing.T) {
  1686. defer netnsutils.SetupTestOSContext(t)()
  1687. controller := newController(t)
  1688. tmpResolvConf1 := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\nnameserver 2001:4860:4860::8888\n")
  1689. tmpResolvConf2 := []byte("search pommesfrites.fr\nnameserver 112.34.56.78\nnameserver 2001:4860:4860::8888\n")
  1690. expectedResolvConf1 := []byte("search pommesfrites.fr\nnameserver 127.0.0.11\noptions ndots:0\n")
  1691. tmpResolvConf3 := []byte("search pommesfrites.fr\nnameserver 113.34.56.78\n")
  1692. // take a copy of resolv.conf for restoring after test completes
  1693. resolvConfSystem, err := os.ReadFile("/etc/resolv.conf")
  1694. if err != nil {
  1695. t.Fatal(err)
  1696. }
  1697. // cleanup
  1698. defer func() {
  1699. if err := os.WriteFile("/etc/resolv.conf", resolvConfSystem, 0o644); err != nil {
  1700. t.Fatal(err)
  1701. }
  1702. }()
  1703. netOption := options.Generic{
  1704. netlabel.GenericData: options.Generic{
  1705. "BridgeName": "testnetwork",
  1706. },
  1707. }
  1708. n, err := createTestNetwork(controller, "bridge", "testnetwork", netOption, nil, nil)
  1709. if err != nil {
  1710. t.Fatal(err)
  1711. }
  1712. defer func() {
  1713. if err := n.Delete(); err != nil {
  1714. t.Fatal(err)
  1715. }
  1716. }()
  1717. ep, err := n.CreateEndpoint("ep")
  1718. if err != nil {
  1719. t.Fatal(err)
  1720. }
  1721. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf1, 0o644); err != nil {
  1722. t.Fatal(err)
  1723. }
  1724. resolvConfPath := "/tmp/libnetwork_test/resolv.conf"
  1725. defer os.Remove(resolvConfPath)
  1726. sb1, err := controller.NewSandbox(containerID, libnetwork.OptionResolvConfPath(resolvConfPath))
  1727. if err != nil {
  1728. t.Fatal(err)
  1729. }
  1730. defer func() {
  1731. if err := sb1.Delete(); err != nil {
  1732. t.Fatal(err)
  1733. }
  1734. }()
  1735. err = ep.Join(sb1)
  1736. if err != nil {
  1737. t.Fatal(err)
  1738. }
  1739. finfo, err := os.Stat(resolvConfPath)
  1740. if err != nil {
  1741. t.Fatal(err)
  1742. }
  1743. fmode := (os.FileMode)(0o644)
  1744. if finfo.Mode() != fmode {
  1745. t.Fatalf("Expected file mode %s, got %s", fmode.String(), finfo.Mode().String())
  1746. }
  1747. content, err := os.ReadFile(resolvConfPath)
  1748. if err != nil {
  1749. t.Fatal(err)
  1750. }
  1751. if !bytes.Equal(content, expectedResolvConf1) {
  1752. fmt.Printf("\n%v\n%v\n", expectedResolvConf1, content)
  1753. t.Fatalf("Expected:\n%s\nGot:\n%s", string(expectedResolvConf1), string(content))
  1754. }
  1755. err = ep.Leave(sb1)
  1756. if err != nil {
  1757. t.Fatal(err)
  1758. }
  1759. if err := os.WriteFile("/etc/resolv.conf", tmpResolvConf2, 0o644); err != nil {
  1760. t.Fatal(err)
  1761. }
  1762. sb2, err := controller.NewSandbox(containerID+"_2", libnetwork.OptionResolvConfPath(resolvConfPath))
  1763. if err != nil {
  1764. t.Fatal(err)
  1765. }
  1766. defer func() {
  1767. if err := sb2.Delete(); err != nil {
  1768. t.Fatal(err)
  1769. }
  1770. }()
  1771. err = ep.Join(sb2)
  1772. if err != nil {
  1773. t.Fatal(err)
  1774. }
  1775. content, err = os.ReadFile(resolvConfPath)
  1776. if err != nil {
  1777. t.Fatal(err)
  1778. }
  1779. if !bytes.Equal(content, expectedResolvConf1) {
  1780. t.Fatalf("Expected:\n%s\nGot:\n%s", string(expectedResolvConf1), string(content))
  1781. }
  1782. if err := os.WriteFile(resolvConfPath, tmpResolvConf3, 0o644); err != nil {
  1783. t.Fatal(err)
  1784. }
  1785. err = ep.Leave(sb2)
  1786. if err != nil {
  1787. t.Fatal(err)
  1788. }
  1789. err = ep.Join(sb2)
  1790. if err != nil {
  1791. t.Fatal(err)
  1792. }
  1793. content, err = os.ReadFile(resolvConfPath)
  1794. if err != nil {
  1795. t.Fatal(err)
  1796. }
  1797. if !bytes.Equal(content, tmpResolvConf3) {
  1798. t.Fatalf("Expected:\n%s\nGot:\n%s", string(tmpResolvConf3), string(content))
  1799. }
  1800. }
  1801. type parallelTester struct {
  1802. osctx *netnsutils.OSContext
  1803. controller *libnetwork.Controller
  1804. net1, net2 *libnetwork.Network
  1805. iterCnt int
  1806. }
  1807. func (pt parallelTester) Do(t *testing.T, thrNumber int) error {
  1808. teardown, err := pt.osctx.Set()
  1809. if err != nil {
  1810. return err
  1811. }
  1812. defer teardown(t)
  1813. var ep *libnetwork.Endpoint
  1814. if thrNumber == 1 {
  1815. ep, err = pt.net1.EndpointByName(fmt.Sprintf("pep%d", thrNumber))
  1816. } else {
  1817. ep, err = pt.net2.EndpointByName(fmt.Sprintf("pep%d", thrNumber))
  1818. }
  1819. if err != nil {
  1820. return errors.WithStack(err)
  1821. }
  1822. if ep == nil {
  1823. return errors.New("got nil ep with no error")
  1824. }
  1825. cid := fmt.Sprintf("%drace", thrNumber)
  1826. sb, err := pt.controller.GetSandbox(cid)
  1827. if err != nil {
  1828. return err
  1829. }
  1830. for i := 0; i < pt.iterCnt; i++ {
  1831. if err := ep.Join(sb); err != nil {
  1832. if _, ok := err.(types.ForbiddenError); !ok {
  1833. return errors.Wrapf(err, "thread %d", thrNumber)
  1834. }
  1835. }
  1836. if err := ep.Leave(sb); err != nil {
  1837. if _, ok := err.(types.ForbiddenError); !ok {
  1838. return errors.Wrapf(err, "thread %d", thrNumber)
  1839. }
  1840. }
  1841. }
  1842. if err := errors.WithStack(sb.Delete()); err != nil {
  1843. return err
  1844. }
  1845. return errors.WithStack(ep.Delete(false))
  1846. }
  1847. func TestParallel(t *testing.T) {
  1848. const (
  1849. first = 1
  1850. last = 3
  1851. numThreads = last - first + 1
  1852. iterCnt = 25
  1853. )
  1854. osctx := netnsutils.SetupTestOSContextEx(t)
  1855. defer osctx.Cleanup(t)
  1856. controller := newController(t)
  1857. netOption := options.Generic{
  1858. netlabel.GenericData: options.Generic{
  1859. "BridgeName": "network",
  1860. },
  1861. }
  1862. net1 := makeTesthostNetwork(t, controller)
  1863. defer net1.Delete()
  1864. net2, err := createTestNetwork(controller, "bridge", "network2", netOption, nil, nil)
  1865. if err != nil {
  1866. t.Fatal(err)
  1867. }
  1868. defer net2.Delete()
  1869. _, err = net1.CreateEndpoint("pep1")
  1870. if err != nil {
  1871. t.Fatal(err)
  1872. }
  1873. _, err = net2.CreateEndpoint("pep2")
  1874. if err != nil {
  1875. t.Fatal(err)
  1876. }
  1877. _, err = net2.CreateEndpoint("pep3")
  1878. if err != nil {
  1879. t.Fatal(err)
  1880. }
  1881. sboxes := make([]*libnetwork.Sandbox, numThreads)
  1882. if sboxes[first-1], err = controller.NewSandbox(fmt.Sprintf("%drace", first), libnetwork.OptionUseDefaultSandbox()); err != nil {
  1883. t.Fatal(err)
  1884. }
  1885. for thd := first + 1; thd <= last; thd++ {
  1886. if sboxes[thd-1], err = controller.NewSandbox(fmt.Sprintf("%drace", thd)); err != nil {
  1887. t.Fatal(err)
  1888. }
  1889. }
  1890. pt := parallelTester{
  1891. osctx: osctx,
  1892. controller: controller,
  1893. net1: net1,
  1894. net2: net2,
  1895. iterCnt: iterCnt,
  1896. }
  1897. var eg errgroup.Group
  1898. for i := first; i <= last; i++ {
  1899. i := i
  1900. eg.Go(func() error { return pt.Do(t, i) })
  1901. }
  1902. if err := eg.Wait(); err != nil {
  1903. t.Fatalf("%+v", err)
  1904. }
  1905. }
  1906. func TestBridge(t *testing.T) {
  1907. defer netnsutils.SetupTestOSContext(t)()
  1908. controller := newController(t)
  1909. netOption := options.Generic{
  1910. netlabel.EnableIPv6: true,
  1911. netlabel.GenericData: options.Generic{
  1912. "BridgeName": "testnetwork",
  1913. "EnableICC": true,
  1914. "EnableIPMasquerade": true,
  1915. },
  1916. }
  1917. ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", Gateway: "192.168.100.1"}}
  1918. ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
  1919. network, err := createTestNetwork(controller, bridgeNetType, "testnetwork", netOption, ipamV4ConfList, ipamV6ConfList)
  1920. if err != nil {
  1921. t.Fatal(err)
  1922. }
  1923. defer func() {
  1924. if err := network.Delete(); err != nil {
  1925. t.Fatal(err)
  1926. }
  1927. }()
  1928. ep, err := network.CreateEndpoint("testep")
  1929. if err != nil {
  1930. t.Fatal(err)
  1931. }
  1932. sb, err := controller.NewSandbox(containerID, libnetwork.OptionPortMapping(getPortMapping()))
  1933. if err != nil {
  1934. t.Fatal(err)
  1935. }
  1936. defer func() {
  1937. if err := sb.Delete(); err != nil {
  1938. t.Fatal(err)
  1939. }
  1940. }()
  1941. err = ep.Join(sb)
  1942. if err != nil {
  1943. t.Fatal(err)
  1944. }
  1945. epInfo, err := ep.DriverInfo()
  1946. if err != nil {
  1947. t.Fatal(err)
  1948. }
  1949. pmd, ok := epInfo[netlabel.PortMap]
  1950. if !ok {
  1951. t.Fatalf("Could not find expected info in endpoint data")
  1952. }
  1953. pm, ok := pmd.([]types.PortBinding)
  1954. if !ok {
  1955. t.Fatalf("Unexpected format for port mapping in endpoint operational data")
  1956. }
  1957. expectedLen := 10
  1958. if !isV6Listenable() {
  1959. expectedLen = 5
  1960. }
  1961. if len(pm) != expectedLen {
  1962. t.Fatalf("Incomplete data for port mapping in endpoint operational data: %d", len(pm))
  1963. }
  1964. }
  1965. var (
  1966. v6ListenableCached bool
  1967. v6ListenableOnce sync.Once
  1968. )
  1969. // This is copied from the bridge driver package b/c the bridge driver is not platform agnostic.
  1970. func isV6Listenable() bool {
  1971. v6ListenableOnce.Do(func() {
  1972. ln, err := net.Listen("tcp6", "[::1]:0")
  1973. if err != nil {
  1974. // When the kernel was booted with `ipv6.disable=1`,
  1975. // we get err "listen tcp6 [::1]:0: socket: address family not supported by protocol"
  1976. // https://github.com/moby/moby/issues/42288
  1977. log.G(context.TODO()).Debugf("port_mapping: v6Listenable=false (%v)", err)
  1978. } else {
  1979. v6ListenableCached = true
  1980. ln.Close()
  1981. }
  1982. })
  1983. return v6ListenableCached
  1984. }
  1985. func TestNullIpam(t *testing.T) {
  1986. defer netnsutils.SetupTestOSContext(t)()
  1987. controller := newController(t)
  1988. _, err := controller.NewNetwork(bridgeNetType, "testnetworkinternal", "", libnetwork.NetworkOptionIpam(ipamapi.NullIPAM, "", nil, nil, nil))
  1989. if err == nil || err.Error() != "ipv4 pool is empty" {
  1990. t.Fatal("bridge network should complain empty pool")
  1991. }
  1992. }