bridge_linux_test.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. package bridge
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net"
  7. "regexp"
  8. "strconv"
  9. "testing"
  10. "github.com/docker/docker/internal/testutils/netnsutils"
  11. "github.com/docker/docker/libnetwork/driverapi"
  12. "github.com/docker/docker/libnetwork/ipamutils"
  13. "github.com/docker/docker/libnetwork/iptables"
  14. "github.com/docker/docker/libnetwork/netlabel"
  15. "github.com/docker/docker/libnetwork/netutils"
  16. "github.com/docker/docker/libnetwork/options"
  17. "github.com/docker/docker/libnetwork/portallocator"
  18. "github.com/docker/docker/libnetwork/types"
  19. "github.com/vishvananda/netlink"
  20. )
  21. func TestEndpointMarshalling(t *testing.T) {
  22. ip1, _ := types.ParseCIDR("172.22.0.9/16")
  23. ip2, _ := types.ParseCIDR("2001:db8::9")
  24. mac, _ := net.ParseMAC("ac:bd:24:57:66:77")
  25. e := &bridgeEndpoint{
  26. id: "d2c015a1fe5930650cbcd50493efba0500bcebd8ee1f4401a16319f8a567de33",
  27. nid: "ee33fbb43c323f1920b6b35a0101552ac22ede960d0e5245e9738bccc68b2415",
  28. addr: ip1,
  29. addrv6: ip2,
  30. macAddress: mac,
  31. srcName: "veth123456",
  32. config: &endpointConfiguration{MacAddress: mac},
  33. containerConfig: &containerConfiguration{
  34. ParentEndpoints: []string{"one", "due", "three"},
  35. ChildEndpoints: []string{"four", "five", "six"},
  36. },
  37. extConnConfig: &connectivityConfiguration{
  38. ExposedPorts: []types.TransportPort{
  39. {
  40. Proto: 6,
  41. Port: uint16(18),
  42. },
  43. },
  44. PortBindings: []types.PortBinding{
  45. {
  46. Proto: 6,
  47. IP: net.ParseIP("17210.33.9.56"),
  48. Port: uint16(18),
  49. HostPort: uint16(3000),
  50. HostPortEnd: uint16(14000),
  51. },
  52. },
  53. },
  54. portMapping: []types.PortBinding{
  55. {
  56. Proto: 17,
  57. IP: net.ParseIP("172.33.9.56"),
  58. Port: uint16(99),
  59. HostIP: net.ParseIP("10.10.100.2"),
  60. HostPort: uint16(9900),
  61. HostPortEnd: uint16(10000),
  62. },
  63. {
  64. Proto: 6,
  65. IP: net.ParseIP("171.33.9.56"),
  66. Port: uint16(55),
  67. HostIP: net.ParseIP("10.11.100.2"),
  68. HostPort: uint16(5500),
  69. HostPortEnd: uint16(55000),
  70. },
  71. },
  72. }
  73. b, err := json.Marshal(e)
  74. if err != nil {
  75. t.Fatal(err)
  76. }
  77. ee := &bridgeEndpoint{}
  78. err = json.Unmarshal(b, ee)
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. if e.id != ee.id || e.nid != ee.nid || e.srcName != ee.srcName || !bytes.Equal(e.macAddress, ee.macAddress) ||
  83. !types.CompareIPNet(e.addr, ee.addr) || !types.CompareIPNet(e.addrv6, ee.addrv6) ||
  84. !compareEpConfig(e.config, ee.config) ||
  85. !compareContainerConfig(e.containerConfig, ee.containerConfig) ||
  86. !compareConnConfig(e.extConnConfig, ee.extConnConfig) ||
  87. !compareBindings(e.portMapping, ee.portMapping) {
  88. t.Fatalf("JSON marsh/unmarsh failed.\nOriginal:\n%#v\nDecoded:\n%#v", e, ee)
  89. }
  90. }
  91. func compareEpConfig(a, b *endpointConfiguration) bool {
  92. if a == b {
  93. return true
  94. }
  95. if a == nil || b == nil {
  96. return false
  97. }
  98. return bytes.Equal(a.MacAddress, b.MacAddress)
  99. }
  100. func compareContainerConfig(a, b *containerConfiguration) bool {
  101. if a == b {
  102. return true
  103. }
  104. if a == nil || b == nil {
  105. return false
  106. }
  107. if len(a.ParentEndpoints) != len(b.ParentEndpoints) ||
  108. len(a.ChildEndpoints) != len(b.ChildEndpoints) {
  109. return false
  110. }
  111. for i := 0; i < len(a.ParentEndpoints); i++ {
  112. if a.ParentEndpoints[i] != b.ParentEndpoints[i] {
  113. return false
  114. }
  115. }
  116. for i := 0; i < len(a.ChildEndpoints); i++ {
  117. if a.ChildEndpoints[i] != b.ChildEndpoints[i] {
  118. return false
  119. }
  120. }
  121. return true
  122. }
  123. func compareConnConfig(a, b *connectivityConfiguration) bool {
  124. if a == b {
  125. return true
  126. }
  127. if a == nil || b == nil {
  128. return false
  129. }
  130. if len(a.ExposedPorts) != len(b.ExposedPorts) ||
  131. len(a.PortBindings) != len(b.PortBindings) {
  132. return false
  133. }
  134. for i := 0; i < len(a.ExposedPorts); i++ {
  135. if !a.ExposedPorts[i].Equal(&b.ExposedPorts[i]) {
  136. return false
  137. }
  138. }
  139. for i := 0; i < len(a.PortBindings); i++ {
  140. if !comparePortBinding(&a.PortBindings[i], &b.PortBindings[i]) {
  141. return false
  142. }
  143. }
  144. return true
  145. }
  146. // comparePortBinding returns whether the given PortBindings are equal.
  147. func comparePortBinding(p *types.PortBinding, o *types.PortBinding) bool {
  148. if p == o {
  149. return true
  150. }
  151. if o == nil {
  152. return false
  153. }
  154. if p.Proto != o.Proto || p.Port != o.Port ||
  155. p.HostPort != o.HostPort || p.HostPortEnd != o.HostPortEnd {
  156. return false
  157. }
  158. if p.IP != nil {
  159. if !p.IP.Equal(o.IP) {
  160. return false
  161. }
  162. } else {
  163. if o.IP != nil {
  164. return false
  165. }
  166. }
  167. if p.HostIP != nil {
  168. if !p.HostIP.Equal(o.HostIP) {
  169. return false
  170. }
  171. } else {
  172. if o.HostIP != nil {
  173. return false
  174. }
  175. }
  176. return true
  177. }
  178. func compareBindings(a, b []types.PortBinding) bool {
  179. if len(a) != len(b) {
  180. return false
  181. }
  182. for i := 0; i < len(a); i++ {
  183. if !comparePortBinding(&a[i], &b[i]) {
  184. return false
  185. }
  186. }
  187. return true
  188. }
  189. func getIPv4Data(t *testing.T) []driverapi.IPAMData {
  190. ipd := driverapi.IPAMData{AddressSpace: "full"}
  191. nw, err := netutils.FindAvailableNetwork(ipamutils.GetLocalScopeDefaultNetworks())
  192. if err != nil {
  193. t.Fatal(err)
  194. }
  195. ipd.Pool = nw
  196. // Set network gateway to X.X.X.1
  197. ipd.Gateway = types.GetIPNetCopy(nw)
  198. ipd.Gateway.IP[len(ipd.Gateway.IP)-1] = 1
  199. return []driverapi.IPAMData{ipd}
  200. }
  201. func TestCreateFullOptions(t *testing.T) {
  202. defer netnsutils.SetupTestOSContext(t)()
  203. d := newDriver()
  204. config := &configuration{
  205. EnableIPForwarding: true,
  206. EnableIPTables: true,
  207. }
  208. // Test this scenario: Default gw address does not belong to
  209. // container network and it's greater than bridge address
  210. cnw, _ := types.ParseCIDR("172.16.122.0/24")
  211. bnw, _ := types.ParseCIDR("172.16.0.0/24")
  212. br, _ := types.ParseCIDR("172.16.0.1/16")
  213. defgw, _ := types.ParseCIDR("172.16.0.100/16")
  214. genericOption := make(map[string]interface{})
  215. genericOption[netlabel.GenericData] = config
  216. if err := d.configure(genericOption); err != nil {
  217. t.Fatalf("Failed to setup driver config: %v", err)
  218. }
  219. netOption := make(map[string]interface{})
  220. netOption[netlabel.EnableIPv6] = true
  221. netOption[netlabel.GenericData] = &networkConfiguration{
  222. BridgeName: DefaultBridgeName,
  223. }
  224. ipdList := []driverapi.IPAMData{
  225. {
  226. Pool: bnw,
  227. Gateway: br,
  228. AuxAddresses: map[string]*net.IPNet{DefaultGatewayV4AuxKey: defgw},
  229. },
  230. }
  231. err := d.CreateNetwork("dummy", netOption, nil, ipdList, nil)
  232. if err != nil {
  233. t.Fatalf("Failed to create bridge: %v", err)
  234. }
  235. // Verify the IP address allocated for the endpoint belongs to the container network
  236. epOptions := make(map[string]interface{})
  237. te := newTestEndpoint(cnw, 10)
  238. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions)
  239. if err != nil {
  240. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  241. }
  242. if !cnw.Contains(te.Interface().Address().IP) {
  243. t.Fatalf("endpoint got assigned address outside of container network(%s): %s", cnw.String(), te.Interface().Address())
  244. }
  245. }
  246. func TestCreateNoConfig(t *testing.T) {
  247. defer netnsutils.SetupTestOSContext(t)()
  248. d := newDriver()
  249. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  250. genericOption := make(map[string]interface{})
  251. genericOption[netlabel.GenericData] = netconfig
  252. if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil); err != nil {
  253. t.Fatalf("Failed to create bridge: %v", err)
  254. }
  255. }
  256. func TestCreateFullOptionsLabels(t *testing.T) {
  257. defer netnsutils.SetupTestOSContext(t)()
  258. d := newDriver()
  259. config := &configuration{
  260. EnableIPForwarding: true,
  261. }
  262. genericOption := make(map[string]interface{})
  263. genericOption[netlabel.GenericData] = config
  264. if err := d.configure(genericOption); err != nil {
  265. t.Fatalf("Failed to setup driver config: %v", err)
  266. }
  267. bndIPs := "127.0.0.1"
  268. testHostIP := "1.2.3.4"
  269. nwV6s := "2001:db8:2600:2700:2800::/80"
  270. gwV6s := "2001:db8:2600:2700:2800::25/80"
  271. nwV6, _ := types.ParseCIDR(nwV6s)
  272. gwV6, _ := types.ParseCIDR(gwV6s)
  273. labels := map[string]string{
  274. BridgeName: DefaultBridgeName,
  275. DefaultBridge: "true",
  276. EnableICC: "true",
  277. EnableIPMasquerade: "true",
  278. DefaultBindingIP: bndIPs,
  279. netlabel.HostIP: testHostIP,
  280. }
  281. netOption := make(map[string]interface{})
  282. netOption[netlabel.EnableIPv6] = true
  283. netOption[netlabel.GenericData] = labels
  284. ipdList := getIPv4Data(t)
  285. ipd6List := []driverapi.IPAMData{
  286. {
  287. Pool: nwV6,
  288. AuxAddresses: map[string]*net.IPNet{
  289. DefaultGatewayV6AuxKey: gwV6,
  290. },
  291. },
  292. }
  293. err := d.CreateNetwork("dummy", netOption, nil, ipdList, ipd6List)
  294. if err != nil {
  295. t.Fatalf("Failed to create bridge: %v", err)
  296. }
  297. nw, ok := d.networks["dummy"]
  298. if !ok {
  299. t.Fatal("Cannot find dummy network in bridge driver")
  300. }
  301. if nw.config.BridgeName != DefaultBridgeName {
  302. t.Fatal("incongruent name in bridge network")
  303. }
  304. if !nw.config.EnableIPv6 {
  305. t.Fatal("incongruent EnableIPv6 in bridge network")
  306. }
  307. if !nw.config.EnableICC {
  308. t.Fatal("incongruent EnableICC in bridge network")
  309. }
  310. if !nw.config.EnableIPMasquerade {
  311. t.Fatal("incongruent EnableIPMasquerade in bridge network")
  312. }
  313. bndIP := net.ParseIP(bndIPs)
  314. if !bndIP.Equal(nw.config.DefaultBindingIP) {
  315. t.Fatalf("Unexpected: %v", nw.config.DefaultBindingIP)
  316. }
  317. hostIP := net.ParseIP(testHostIP)
  318. if !hostIP.Equal(nw.config.HostIP) {
  319. t.Fatalf("Unexpected: %v", nw.config.HostIP)
  320. }
  321. if !types.CompareIPNet(nw.config.AddressIPv6, nwV6) {
  322. t.Fatalf("Unexpected: %v", nw.config.AddressIPv6)
  323. }
  324. if !gwV6.IP.Equal(nw.config.DefaultGatewayIPv6) {
  325. t.Fatalf("Unexpected: %v", nw.config.DefaultGatewayIPv6)
  326. }
  327. // In short here we are testing --fixed-cidr-v6 daemon option
  328. // plus --mac-address run option
  329. mac, _ := net.ParseMAC("aa:bb:cc:dd:ee:ff")
  330. epOptions := map[string]interface{}{netlabel.MacAddress: mac}
  331. te := newTestEndpoint(ipdList[0].Pool, 20)
  332. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), epOptions)
  333. if err != nil {
  334. t.Fatal(err)
  335. }
  336. if !nwV6.Contains(te.Interface().AddressIPv6().IP) {
  337. t.Fatalf("endpoint got assigned address outside of container network(%s): %s", nwV6.String(), te.Interface().AddressIPv6())
  338. }
  339. if te.Interface().AddressIPv6().IP.String() != "2001:db8:2600:2700:2800:aabb:ccdd:eeff" {
  340. t.Fatalf("Unexpected endpoint IPv6 address: %v", te.Interface().AddressIPv6().IP)
  341. }
  342. }
  343. func TestCreate(t *testing.T) {
  344. defer netnsutils.SetupTestOSContext(t)()
  345. d := newDriver()
  346. if err := d.configure(nil); err != nil {
  347. t.Fatalf("Failed to setup driver config: %v", err)
  348. }
  349. netconfig := &networkConfiguration{BridgeName: DefaultBridgeName}
  350. genericOption := make(map[string]interface{})
  351. genericOption[netlabel.GenericData] = netconfig
  352. if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil); err != nil {
  353. t.Fatalf("Failed to create bridge: %v", err)
  354. }
  355. err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil)
  356. if err == nil {
  357. t.Fatal("Expected bridge driver to refuse creation of second network with default name")
  358. }
  359. if _, ok := err.(types.ForbiddenError); !ok {
  360. t.Fatal("Creation of second network with default name failed with unexpected error type")
  361. }
  362. }
  363. func TestCreateFail(t *testing.T) {
  364. defer netnsutils.SetupTestOSContext(t)()
  365. d := newDriver()
  366. if err := d.configure(nil); err != nil {
  367. t.Fatalf("Failed to setup driver config: %v", err)
  368. }
  369. netconfig := &networkConfiguration{BridgeName: "dummy0", DefaultBridge: true}
  370. genericOption := make(map[string]interface{})
  371. genericOption[netlabel.GenericData] = netconfig
  372. if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil); err == nil {
  373. t.Fatal("Bridge creation was expected to fail")
  374. }
  375. }
  376. func TestCreateMultipleNetworks(t *testing.T) {
  377. defer netnsutils.SetupTestOSContext(t)()
  378. d := newDriver()
  379. config := &configuration{
  380. EnableIPTables: true,
  381. }
  382. genericOption := make(map[string]interface{})
  383. genericOption[netlabel.GenericData] = config
  384. if err := d.configure(genericOption); err != nil {
  385. t.Fatalf("Failed to setup driver config: %v", err)
  386. }
  387. config1 := &networkConfiguration{BridgeName: "net_test_1"}
  388. genericOption = make(map[string]interface{})
  389. genericOption[netlabel.GenericData] = config1
  390. if err := d.CreateNetwork("1", genericOption, nil, getIPv4Data(t), nil); err != nil {
  391. t.Fatalf("Failed to create bridge: %v", err)
  392. }
  393. verifyV4INCEntries(d.networks, t)
  394. config2 := &networkConfiguration{BridgeName: "net_test_2"}
  395. genericOption[netlabel.GenericData] = config2
  396. if err := d.CreateNetwork("2", genericOption, nil, getIPv4Data(t), nil); err != nil {
  397. t.Fatalf("Failed to create bridge: %v", err)
  398. }
  399. verifyV4INCEntries(d.networks, t)
  400. config3 := &networkConfiguration{BridgeName: "net_test_3"}
  401. genericOption[netlabel.GenericData] = config3
  402. if err := d.CreateNetwork("3", genericOption, nil, getIPv4Data(t), nil); err != nil {
  403. t.Fatalf("Failed to create bridge: %v", err)
  404. }
  405. verifyV4INCEntries(d.networks, t)
  406. config4 := &networkConfiguration{BridgeName: "net_test_4"}
  407. genericOption[netlabel.GenericData] = config4
  408. if err := d.CreateNetwork("4", genericOption, nil, getIPv4Data(t), nil); err != nil {
  409. t.Fatalf("Failed to create bridge: %v", err)
  410. }
  411. verifyV4INCEntries(d.networks, t)
  412. if err := d.DeleteNetwork("1"); err != nil {
  413. t.Log(err)
  414. }
  415. verifyV4INCEntries(d.networks, t)
  416. if err := d.DeleteNetwork("2"); err != nil {
  417. t.Log(err)
  418. }
  419. verifyV4INCEntries(d.networks, t)
  420. if err := d.DeleteNetwork("3"); err != nil {
  421. t.Log(err)
  422. }
  423. verifyV4INCEntries(d.networks, t)
  424. if err := d.DeleteNetwork("4"); err != nil {
  425. t.Log(err)
  426. }
  427. verifyV4INCEntries(d.networks, t)
  428. }
  429. // Verify the network isolation rules are installed for each network
  430. func verifyV4INCEntries(networks map[string]*bridgeNetwork, t *testing.T) {
  431. iptable := iptables.GetIptable(iptables.IPv4)
  432. out1, err := iptable.Raw("-S", IsolationChain1)
  433. if err != nil {
  434. t.Fatal(err)
  435. }
  436. out2, err := iptable.Raw("-S", IsolationChain2)
  437. if err != nil {
  438. t.Fatal(err)
  439. }
  440. for _, n := range networks {
  441. re := regexp.MustCompile(fmt.Sprintf("-i %s ! -o %s -j %s", n.config.BridgeName, n.config.BridgeName, IsolationChain2))
  442. matches := re.FindAllString(string(out1[:]), -1)
  443. if len(matches) != 1 {
  444. t.Fatalf("Cannot find expected inter-network isolation rules in IP Tables for network %s:\n%s.", n.id, string(out1[:]))
  445. }
  446. re = regexp.MustCompile(fmt.Sprintf("-o %s -j DROP", n.config.BridgeName))
  447. matches = re.FindAllString(string(out2[:]), -1)
  448. if len(matches) != 1 {
  449. t.Fatalf("Cannot find expected inter-network isolation rules in IP Tables for network %s:\n%s.", n.id, string(out2[:]))
  450. }
  451. }
  452. }
  453. type testInterface struct {
  454. mac net.HardwareAddr
  455. addr *net.IPNet
  456. addrv6 *net.IPNet
  457. srcName string
  458. dstName string
  459. }
  460. type testEndpoint struct {
  461. iface *testInterface
  462. gw net.IP
  463. gw6 net.IP
  464. routes []types.StaticRoute
  465. }
  466. func newTestEndpoint(nw *net.IPNet, ordinal byte) *testEndpoint {
  467. addr := types.GetIPNetCopy(nw)
  468. addr.IP[len(addr.IP)-1] = ordinal
  469. return &testEndpoint{iface: &testInterface{addr: addr}}
  470. }
  471. func (te *testEndpoint) Interface() *testInterface {
  472. return te.iface
  473. }
  474. func (i *testInterface) MacAddress() net.HardwareAddr {
  475. return i.mac
  476. }
  477. func (i *testInterface) Address() *net.IPNet {
  478. return i.addr
  479. }
  480. func (i *testInterface) AddressIPv6() *net.IPNet {
  481. return i.addrv6
  482. }
  483. func (i *testInterface) SetMacAddress(mac net.HardwareAddr) error {
  484. if i.mac != nil {
  485. return types.ForbiddenErrorf("endpoint interface MAC address present (%s). Cannot be modified with %s.", i.mac, mac)
  486. }
  487. if mac == nil {
  488. return types.InvalidParameterErrorf("tried to set nil MAC address to endpoint interface")
  489. }
  490. i.mac = types.GetMacCopy(mac)
  491. return nil
  492. }
  493. func (i *testInterface) SetIPAddress(address *net.IPNet) error {
  494. if address.IP == nil {
  495. return types.InvalidParameterErrorf("tried to set nil IP address to endpoint interface")
  496. }
  497. if address.IP.To4() == nil {
  498. return setAddress(&i.addrv6, address)
  499. }
  500. return setAddress(&i.addr, address)
  501. }
  502. func setAddress(ifaceAddr **net.IPNet, address *net.IPNet) error {
  503. if *ifaceAddr != nil {
  504. return types.ForbiddenErrorf("endpoint interface IP present (%s). Cannot be modified with (%s).", *ifaceAddr, address)
  505. }
  506. *ifaceAddr = types.GetIPNetCopy(address)
  507. return nil
  508. }
  509. func (i *testInterface) SetNames(srcName string, dstName string) error {
  510. i.srcName = srcName
  511. i.dstName = dstName
  512. return nil
  513. }
  514. func (te *testEndpoint) InterfaceName() driverapi.InterfaceNameInfo {
  515. if te.iface != nil {
  516. return te.iface
  517. }
  518. return nil
  519. }
  520. func (te *testEndpoint) SetGateway(gw net.IP) error {
  521. te.gw = gw
  522. return nil
  523. }
  524. func (te *testEndpoint) SetGatewayIPv6(gw6 net.IP) error {
  525. te.gw6 = gw6
  526. return nil
  527. }
  528. func (te *testEndpoint) AddStaticRoute(destination *net.IPNet, routeType int, nextHop net.IP) error {
  529. te.routes = append(te.routes, types.StaticRoute{Destination: destination, RouteType: routeType, NextHop: nextHop})
  530. return nil
  531. }
  532. func (te *testEndpoint) AddTableEntry(tableName string, key string, value []byte) error {
  533. return nil
  534. }
  535. func (te *testEndpoint) DisableGatewayService() {}
  536. func TestQueryEndpointInfo(t *testing.T) {
  537. testQueryEndpointInfo(t, true)
  538. }
  539. func TestQueryEndpointInfoHairpin(t *testing.T) {
  540. testQueryEndpointInfo(t, false)
  541. }
  542. func testQueryEndpointInfo(t *testing.T, ulPxyEnabled bool) {
  543. defer netnsutils.SetupTestOSContext(t)()
  544. d := newDriver()
  545. d.portAllocator = portallocator.NewInstance()
  546. config := &configuration{
  547. EnableIPTables: true,
  548. EnableUserlandProxy: ulPxyEnabled,
  549. }
  550. genericOption := make(map[string]interface{})
  551. genericOption[netlabel.GenericData] = config
  552. if err := d.configure(genericOption); err != nil {
  553. t.Fatalf("Failed to setup driver config: %v", err)
  554. }
  555. netconfig := &networkConfiguration{
  556. BridgeName: DefaultBridgeName,
  557. EnableICC: false,
  558. }
  559. genericOption = make(map[string]interface{})
  560. genericOption[netlabel.GenericData] = netconfig
  561. ipdList := getIPv4Data(t)
  562. err := d.CreateNetwork("net1", genericOption, nil, ipdList, nil)
  563. if err != nil {
  564. t.Fatalf("Failed to create bridge: %v", err)
  565. }
  566. sbOptions := make(map[string]interface{})
  567. sbOptions[netlabel.PortMap] = getPortMapping()
  568. te := newTestEndpoint(ipdList[0].Pool, 11)
  569. err = d.CreateEndpoint("net1", "ep1", te.Interface(), nil)
  570. if err != nil {
  571. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  572. }
  573. err = d.Join("net1", "ep1", "sbox", te, sbOptions)
  574. if err != nil {
  575. t.Fatalf("Failed to join the endpoint: %v", err)
  576. }
  577. err = d.ProgramExternalConnectivity("net1", "ep1", sbOptions)
  578. if err != nil {
  579. t.Fatalf("Failed to program external connectivity: %v", err)
  580. }
  581. network, ok := d.networks["net1"]
  582. if !ok {
  583. t.Fatalf("Cannot find network %s inside driver", "net1")
  584. }
  585. ep := network.endpoints["ep1"]
  586. data, err := d.EndpointOperInfo(network.id, ep.id)
  587. if err != nil {
  588. t.Fatalf("Failed to ask for endpoint operational data: %v", err)
  589. }
  590. pmd, ok := data[netlabel.PortMap]
  591. if !ok {
  592. t.Fatal("Endpoint operational data does not contain port mapping data")
  593. }
  594. pm, ok := pmd.([]types.PortBinding)
  595. if !ok {
  596. t.Fatal("Unexpected format for port mapping in endpoint operational data")
  597. }
  598. if len(ep.portMapping) != len(pm) {
  599. t.Fatal("Incomplete data for port mapping in endpoint operational data")
  600. }
  601. for i, pb := range ep.portMapping {
  602. if !comparePortBinding(&pb, &pm[i]) {
  603. t.Fatal("Unexpected data for port mapping in endpoint operational data")
  604. }
  605. }
  606. err = d.RevokeExternalConnectivity("net1", "ep1")
  607. if err != nil {
  608. t.Fatal(err)
  609. }
  610. // release host mapped ports
  611. err = d.Leave("net1", "ep1")
  612. if err != nil {
  613. t.Fatal(err)
  614. }
  615. }
  616. func getExposedPorts() []types.TransportPort {
  617. return []types.TransportPort{
  618. {Proto: types.TCP, Port: uint16(5000)},
  619. {Proto: types.UDP, Port: uint16(400)},
  620. {Proto: types.TCP, Port: uint16(600)},
  621. }
  622. }
  623. func getPortMapping() []types.PortBinding {
  624. return []types.PortBinding{
  625. {Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  626. {Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  627. {Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  628. }
  629. }
  630. func TestLinkContainers(t *testing.T) {
  631. defer netnsutils.SetupTestOSContext(t)()
  632. d := newDriver()
  633. iptable := iptables.GetIptable(iptables.IPv4)
  634. config := &configuration{
  635. EnableIPTables: true,
  636. }
  637. genericOption := make(map[string]interface{})
  638. genericOption[netlabel.GenericData] = config
  639. if err := d.configure(genericOption); err != nil {
  640. t.Fatalf("Failed to setup driver config: %v", err)
  641. }
  642. netconfig := &networkConfiguration{
  643. BridgeName: DefaultBridgeName,
  644. EnableICC: false,
  645. }
  646. genericOption = make(map[string]interface{})
  647. genericOption[netlabel.GenericData] = netconfig
  648. ipdList := getIPv4Data(t)
  649. err := d.CreateNetwork("net1", genericOption, nil, ipdList, nil)
  650. if err != nil {
  651. t.Fatalf("Failed to create bridge: %v", err)
  652. }
  653. te1 := newTestEndpoint(ipdList[0].Pool, 11)
  654. err = d.CreateEndpoint("net1", "ep1", te1.Interface(), nil)
  655. if err != nil {
  656. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  657. }
  658. exposedPorts := getExposedPorts()
  659. sbOptions := make(map[string]interface{})
  660. sbOptions[netlabel.ExposedPorts] = exposedPorts
  661. err = d.Join("net1", "ep1", "sbox", te1, sbOptions)
  662. if err != nil {
  663. t.Fatalf("Failed to join the endpoint: %v", err)
  664. }
  665. err = d.ProgramExternalConnectivity("net1", "ep1", sbOptions)
  666. if err != nil {
  667. t.Fatalf("Failed to program external connectivity: %v", err)
  668. }
  669. addr1 := te1.iface.addr
  670. if addr1.IP.To4() == nil {
  671. t.Fatal("No Ipv4 address assigned to the endpoint: ep1")
  672. }
  673. te2 := newTestEndpoint(ipdList[0].Pool, 22)
  674. err = d.CreateEndpoint("net1", "ep2", te2.Interface(), nil)
  675. if err != nil {
  676. t.Fatalf("Failed to create an endpoint : %s", err.Error())
  677. }
  678. addr2 := te2.iface.addr
  679. if addr2.IP.To4() == nil {
  680. t.Fatal("No Ipv4 address assigned to the endpoint: ep2")
  681. }
  682. sbOptions = make(map[string]interface{})
  683. sbOptions[netlabel.GenericData] = options.Generic{
  684. "ChildEndpoints": []string{"ep1"},
  685. }
  686. err = d.Join("net1", "ep2", "", te2, sbOptions)
  687. if err != nil {
  688. t.Fatal("Failed to link ep1 and ep2")
  689. }
  690. err = d.ProgramExternalConnectivity("net1", "ep2", sbOptions)
  691. if err != nil {
  692. t.Fatalf("Failed to program external connectivity: %v", err)
  693. }
  694. out, _ := iptable.Raw("-L", DockerChain)
  695. for _, pm := range exposedPorts {
  696. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  697. re := regexp.MustCompile(regex)
  698. matches := re.FindAllString(string(out[:]), -1)
  699. if len(matches) != 1 {
  700. t.Fatalf("IP Tables programming failed %s", string(out[:]))
  701. }
  702. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  703. matched, _ := regexp.MatchString(regex, string(out[:]))
  704. if !matched {
  705. t.Fatalf("IP Tables programming failed %s", string(out[:]))
  706. }
  707. }
  708. err = d.RevokeExternalConnectivity("net1", "ep2")
  709. if err != nil {
  710. t.Fatalf("Failed to revoke external connectivity: %v", err)
  711. }
  712. err = d.Leave("net1", "ep2")
  713. if err != nil {
  714. t.Fatal("Failed to unlink ep1 and ep2")
  715. }
  716. out, _ = iptable.Raw("-L", DockerChain)
  717. for _, pm := range exposedPorts {
  718. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  719. re := regexp.MustCompile(regex)
  720. matches := re.FindAllString(string(out[:]), -1)
  721. if len(matches) != 0 {
  722. t.Fatalf("Leave should have deleted relevant IPTables rules %s", string(out[:]))
  723. }
  724. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  725. matched, _ := regexp.MatchString(regex, string(out[:]))
  726. if matched {
  727. t.Fatalf("Leave should have deleted relevant IPTables rules %s", string(out[:]))
  728. }
  729. }
  730. // Error condition test with an invalid endpoint-id "ep4"
  731. sbOptions = make(map[string]interface{})
  732. sbOptions[netlabel.GenericData] = options.Generic{
  733. "ChildEndpoints": []string{"ep1", "ep4"},
  734. }
  735. err = d.Join("net1", "ep2", "", te2, sbOptions)
  736. if err != nil {
  737. t.Fatal(err)
  738. }
  739. err = d.ProgramExternalConnectivity("net1", "ep2", sbOptions)
  740. if err != nil {
  741. out, _ = iptable.Raw("-L", DockerChain)
  742. for _, pm := range exposedPorts {
  743. regex := fmt.Sprintf("%s dpt:%d", pm.Proto.String(), pm.Port)
  744. re := regexp.MustCompile(regex)
  745. matches := re.FindAllString(string(out[:]), -1)
  746. if len(matches) != 0 {
  747. t.Fatalf("Error handling should rollback relevant IPTables rules %s", string(out[:]))
  748. }
  749. regex = fmt.Sprintf("%s spt:%d", pm.Proto.String(), pm.Port)
  750. matched, _ := regexp.MatchString(regex, string(out[:]))
  751. if matched {
  752. t.Fatalf("Error handling should rollback relevant IPTables rules %s", string(out[:]))
  753. }
  754. }
  755. } else {
  756. t.Fatal("Expected Join to fail given link conditions are not satisfied")
  757. }
  758. }
  759. func TestValidateConfig(t *testing.T) {
  760. defer netnsutils.SetupTestOSContext(t)()
  761. // Test mtu
  762. c := networkConfiguration{Mtu: -2}
  763. err := c.Validate()
  764. if err == nil {
  765. t.Fatal("Failed to detect invalid MTU number")
  766. }
  767. c.Mtu = 9000
  768. err = c.Validate()
  769. if err != nil {
  770. t.Fatal("unexpected validation error on MTU number")
  771. }
  772. // Bridge network
  773. _, network, _ := net.ParseCIDR("172.28.0.0/16")
  774. c = networkConfiguration{
  775. AddressIPv4: network,
  776. }
  777. err = c.Validate()
  778. if err != nil {
  779. t.Fatal(err)
  780. }
  781. // Test v4 gw
  782. c.DefaultGatewayIPv4 = net.ParseIP("172.27.30.234")
  783. err = c.Validate()
  784. if err == nil {
  785. t.Fatal("Failed to detect invalid default gateway")
  786. }
  787. c.DefaultGatewayIPv4 = net.ParseIP("172.28.30.234")
  788. err = c.Validate()
  789. if err != nil {
  790. t.Fatal("Unexpected validation error on default gateway")
  791. }
  792. // Test v6 gw
  793. _, v6nw, _ := net.ParseCIDR("2001:db8:ae:b004::/64")
  794. c = networkConfiguration{
  795. EnableIPv6: true,
  796. AddressIPv6: v6nw,
  797. DefaultGatewayIPv6: net.ParseIP("2001:db8:ac:b004::bad:a55"),
  798. }
  799. err = c.Validate()
  800. if err == nil {
  801. t.Fatal("Failed to detect invalid v6 default gateway")
  802. }
  803. c.DefaultGatewayIPv6 = net.ParseIP("2001:db8:ae:b004::bad:a55")
  804. err = c.Validate()
  805. if err != nil {
  806. t.Fatal("Unexpected validation error on v6 default gateway")
  807. }
  808. c.AddressIPv6 = nil
  809. err = c.Validate()
  810. if err == nil {
  811. t.Fatal("Failed to detect invalid v6 default gateway")
  812. }
  813. c.AddressIPv6 = nil
  814. err = c.Validate()
  815. if err == nil {
  816. t.Fatal("Failed to detect invalid v6 default gateway")
  817. }
  818. }
  819. func TestSetDefaultGw(t *testing.T) {
  820. defer netnsutils.SetupTestOSContext(t)()
  821. d := newDriver()
  822. if err := d.configure(nil); err != nil {
  823. t.Fatalf("Failed to setup driver config: %v", err)
  824. }
  825. _, subnetv6, _ := net.ParseCIDR("2001:db8:ea9:9abc:b0c4::/80")
  826. ipdList := getIPv4Data(t)
  827. gw4 := types.GetIPCopy(ipdList[0].Pool.IP).To4()
  828. gw4[3] = 254
  829. gw6 := net.ParseIP("2001:db8:ea9:9abc:b0c4::254")
  830. config := &networkConfiguration{
  831. BridgeName: DefaultBridgeName,
  832. AddressIPv6: subnetv6,
  833. DefaultGatewayIPv4: gw4,
  834. DefaultGatewayIPv6: gw6,
  835. }
  836. genericOption := make(map[string]interface{})
  837. genericOption[netlabel.EnableIPv6] = true
  838. genericOption[netlabel.GenericData] = config
  839. err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
  840. if err != nil {
  841. t.Fatalf("Failed to create bridge: %v", err)
  842. }
  843. te := newTestEndpoint(ipdList[0].Pool, 10)
  844. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  845. if err != nil {
  846. t.Fatalf("Failed to create endpoint: %v", err)
  847. }
  848. err = d.Join("dummy", "ep", "sbox", te, nil)
  849. if err != nil {
  850. t.Fatalf("Failed to join endpoint: %v", err)
  851. }
  852. if !gw4.Equal(te.gw) {
  853. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw4, te.gw)
  854. }
  855. if !gw6.Equal(te.gw6) {
  856. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw6, te.gw6)
  857. }
  858. }
  859. func TestCleanupIptableRules(t *testing.T) {
  860. defer netnsutils.SetupTestOSContext(t)()
  861. bridgeChain := []iptables.ChainInfo{
  862. {Name: DockerChain, Table: iptables.Nat},
  863. {Name: DockerChain, Table: iptables.Filter},
  864. {Name: IsolationChain1, Table: iptables.Filter},
  865. }
  866. ipVersions := []iptables.IPVersion{iptables.IPv4, iptables.IPv6}
  867. for _, version := range ipVersions {
  868. if _, _, _, _, err := setupIPChains(configuration{EnableIPTables: true}, version); err != nil {
  869. t.Fatalf("Error setting up ip chains for %s: %v", version, err)
  870. }
  871. iptable := iptables.GetIptable(version)
  872. for _, chainInfo := range bridgeChain {
  873. if !iptable.ExistChain(chainInfo.Name, chainInfo.Table) {
  874. t.Fatalf("iptables version %s chain %s of %s table should have been created", version, chainInfo.Name, chainInfo.Table)
  875. }
  876. }
  877. removeIPChains(version)
  878. for _, chainInfo := range bridgeChain {
  879. if iptable.ExistChain(chainInfo.Name, chainInfo.Table) {
  880. t.Fatalf("iptables version %s chain %s of %s table should have been deleted", version, chainInfo.Name, chainInfo.Table)
  881. }
  882. }
  883. }
  884. }
  885. func TestCreateWithExistingBridge(t *testing.T) {
  886. defer netnsutils.SetupTestOSContext(t)()
  887. d := newDriver()
  888. if err := d.configure(nil); err != nil {
  889. t.Fatalf("Failed to setup driver config: %v", err)
  890. }
  891. brName := "br111"
  892. br := &netlink.Bridge{
  893. LinkAttrs: netlink.LinkAttrs{
  894. Name: brName,
  895. },
  896. }
  897. if err := netlink.LinkAdd(br); err != nil {
  898. t.Fatalf("Failed to create bridge interface: %v", err)
  899. }
  900. defer netlink.LinkDel(br)
  901. if err := netlink.LinkSetUp(br); err != nil {
  902. t.Fatalf("Failed to set bridge interface up: %v", err)
  903. }
  904. ip := net.IP{192, 168, 122, 1}
  905. addr := &netlink.Addr{IPNet: &net.IPNet{
  906. IP: ip,
  907. Mask: net.IPv4Mask(255, 255, 255, 0),
  908. }}
  909. if err := netlink.AddrAdd(br, addr); err != nil {
  910. t.Fatalf("Failed to add IP address to bridge: %v", err)
  911. }
  912. netconfig := &networkConfiguration{BridgeName: brName}
  913. genericOption := make(map[string]interface{})
  914. genericOption[netlabel.GenericData] = netconfig
  915. ipv4Data := []driverapi.IPAMData{{
  916. AddressSpace: "full",
  917. Pool: types.GetIPNetCopy(addr.IPNet),
  918. Gateway: types.GetIPNetCopy(addr.IPNet),
  919. }}
  920. // Set network gateway to X.X.X.1
  921. ipv4Data[0].Gateway.IP[len(ipv4Data[0].Gateway.IP)-1] = 1
  922. if err := d.CreateNetwork(brName, genericOption, nil, ipv4Data, nil); err != nil {
  923. t.Fatalf("Failed to create bridge network: %v", err)
  924. }
  925. nw, err := d.getNetwork(brName)
  926. if err != nil {
  927. t.Fatalf("Failed to getNetwork(%s): %v", brName, err)
  928. }
  929. addrs4, _, err := nw.bridge.addresses()
  930. if err != nil {
  931. t.Fatalf("Failed to get the bridge network's address: %v", err)
  932. }
  933. if !addrs4[0].IP.Equal(ip) {
  934. t.Fatal("Creating bridge network with existing bridge interface unexpectedly modified the IP address of the bridge")
  935. }
  936. if err := d.DeleteNetwork(brName); err != nil {
  937. t.Fatalf("Failed to delete network %s: %v", brName, err)
  938. }
  939. if _, err := netlink.LinkByName(brName); err != nil {
  940. t.Fatal("Deleting bridge network that using existing bridge interface unexpectedly deleted the bridge interface")
  941. }
  942. }
  943. func TestCreateParallel(t *testing.T) {
  944. c := netnsutils.SetupTestOSContextEx(t)
  945. defer c.Cleanup(t)
  946. d := newDriver()
  947. d.portAllocator = portallocator.NewInstance()
  948. if err := d.configure(nil); err != nil {
  949. t.Fatalf("Failed to setup driver config: %v", err)
  950. }
  951. ipV4Data := getIPv4Data(t)
  952. ch := make(chan error, 100)
  953. for i := 0; i < 100; i++ {
  954. name := "net" + strconv.Itoa(i)
  955. c.Go(t, func() {
  956. config := &networkConfiguration{BridgeName: name}
  957. genericOption := make(map[string]interface{})
  958. genericOption[netlabel.GenericData] = config
  959. if err := d.CreateNetwork(name, genericOption, nil, ipV4Data, nil); err != nil {
  960. ch <- fmt.Errorf("failed to create %s", name)
  961. return
  962. }
  963. if err := d.CreateNetwork(name, genericOption, nil, ipV4Data, nil); err == nil {
  964. ch <- fmt.Errorf("failed was able to create overlap %s", name)
  965. return
  966. }
  967. ch <- nil
  968. })
  969. }
  970. // wait for the go routines
  971. var success int
  972. for i := 0; i < 100; i++ {
  973. val := <-ch
  974. if val == nil {
  975. success++
  976. }
  977. }
  978. if success != 1 {
  979. t.Fatalf("Success should be 1 instead: %d", success)
  980. }
  981. }