bridge_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package bridge
  2. import (
  3. "bytes"
  4. "net"
  5. "testing"
  6. "github.com/docker/libnetwork/netutils"
  7. "github.com/docker/libnetwork/pkg/options"
  8. "github.com/vishvananda/netlink"
  9. )
  10. func TestCreate(t *testing.T) {
  11. defer netutils.SetupTestNetNS(t)()
  12. _, d := New()
  13. config := &Configuration{BridgeName: DefaultBridgeName}
  14. genericOption := make(map[string]interface{})
  15. genericOption[options.GenericData] = config
  16. if err := d.Config(genericOption); err != nil {
  17. t.Fatalf("Failed to setup driver config: %v", err)
  18. }
  19. if err := d.CreateNetwork("dummy", nil); err != nil {
  20. t.Fatalf("Failed to create bridge: %v", err)
  21. }
  22. }
  23. func TestCreateFail(t *testing.T) {
  24. defer netutils.SetupTestNetNS(t)()
  25. _, d := New()
  26. config := &Configuration{BridgeName: "dummy0"}
  27. genericOption := make(map[string]interface{})
  28. genericOption[options.GenericData] = config
  29. if err := d.Config(genericOption); err != nil {
  30. t.Fatalf("Failed to setup driver config: %v", err)
  31. }
  32. if err := d.CreateNetwork("dummy", nil); err == nil {
  33. t.Fatal("Bridge creation was expected to fail")
  34. }
  35. }
  36. func TestCreateFullOptions(t *testing.T) {
  37. defer netutils.SetupTestNetNS(t)()
  38. _, d := New()
  39. config := &Configuration{
  40. BridgeName: DefaultBridgeName,
  41. EnableIPv6: true,
  42. FixedCIDR: bridgeNetworks[0],
  43. EnableIPTables: true,
  44. EnableIPForwarding: true,
  45. }
  46. _, config.FixedCIDRv6, _ = net.ParseCIDR("2001:db8::/48")
  47. genericOption := make(map[string]interface{})
  48. genericOption[options.GenericData] = config
  49. if err := d.Config(genericOption); err != nil {
  50. t.Fatalf("Failed to setup driver config: %v", err)
  51. }
  52. err := d.CreateNetwork("dummy", nil)
  53. if err != nil {
  54. t.Fatalf("Failed to create bridge: %v", err)
  55. }
  56. }
  57. func TestCreateLinkWithOptions(t *testing.T) {
  58. defer netutils.SetupTestNetNS(t)()
  59. _, d := New()
  60. config := &Configuration{BridgeName: DefaultBridgeName}
  61. genericOption := make(map[string]interface{})
  62. genericOption[options.GenericData] = config
  63. if err := d.Config(genericOption); err != nil {
  64. t.Fatalf("Failed to setup driver config: %v", err)
  65. }
  66. err := d.CreateNetwork("net1", nil)
  67. if err != nil {
  68. t.Fatalf("Failed to create bridge: %v", err)
  69. }
  70. mac := net.HardwareAddr([]byte{0x1e, 0x67, 0x66, 0x44, 0x55, 0x66})
  71. epConf := &EndpointConfiguration{MacAddress: mac}
  72. genericOption[options.GenericData] = epConf
  73. sinfo, err := d.CreateEndpoint("net1", "ep", genericOption)
  74. if err != nil {
  75. t.Fatalf("Failed to create a link: %s", err.Error())
  76. }
  77. ifaceName := sinfo.Interfaces[0].SrcName
  78. veth, err := netlink.LinkByName(ifaceName)
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. if !bytes.Equal(mac, veth.Attrs().HardwareAddr) {
  83. t.Fatalf("Failed to parse and program endpoint configuration")
  84. }
  85. }
  86. func TestValidateConfig(t *testing.T) {
  87. // Test mtu
  88. c := Configuration{Mtu: -2}
  89. err := c.Validate()
  90. if err == nil {
  91. t.Fatalf("Failed to detect invalid MTU number")
  92. }
  93. c.Mtu = 9000
  94. err = c.Validate()
  95. if err != nil {
  96. t.Fatalf("unexpected validation error on MTU number")
  97. }
  98. // Bridge network
  99. _, network, _ := net.ParseCIDR("172.28.0.0/16")
  100. // Test FixedCIDR
  101. _, containerSubnet, _ := net.ParseCIDR("172.27.0.0/16")
  102. c = Configuration{
  103. AddressIPv4: network,
  104. FixedCIDR: containerSubnet,
  105. }
  106. err = c.Validate()
  107. if err == nil {
  108. t.Fatalf("Failed to detect invalid FixedCIDR network")
  109. }
  110. _, containerSubnet, _ = net.ParseCIDR("172.28.0.0/16")
  111. c.FixedCIDR = containerSubnet
  112. err = c.Validate()
  113. if err != nil {
  114. t.Fatalf("Unexpected validation error on FixedCIDR network")
  115. }
  116. _, containerSubnet, _ = net.ParseCIDR("172.28.0.0/15")
  117. c.FixedCIDR = containerSubnet
  118. err = c.Validate()
  119. if err == nil {
  120. t.Fatalf("Failed to detect invalid FixedCIDR network")
  121. }
  122. _, containerSubnet, _ = net.ParseCIDR("172.28.0.0/17")
  123. c.FixedCIDR = containerSubnet
  124. err = c.Validate()
  125. if err != nil {
  126. t.Fatalf("Unexpected validation error on FixedCIDR network")
  127. }
  128. // Test v4 gw
  129. c.DefaultGatewayIPv4 = net.ParseIP("172.27.30.234")
  130. err = c.Validate()
  131. if err == nil {
  132. t.Fatalf("Failed to detect invalid default gateway")
  133. }
  134. c.DefaultGatewayIPv4 = net.ParseIP("172.28.30.234")
  135. err = c.Validate()
  136. if err != nil {
  137. t.Fatalf("Unexpected validation error on default gateway")
  138. }
  139. // Test v6 gw
  140. _, containerSubnet, _ = net.ParseCIDR("2001:1234:ae:b004::/64")
  141. c = Configuration{
  142. EnableIPv6: true,
  143. FixedCIDRv6: containerSubnet,
  144. DefaultGatewayIPv6: net.ParseIP("2001:1234:ac:b004::bad:a55"),
  145. }
  146. err = c.Validate()
  147. if err == nil {
  148. t.Fatalf("Failed to detect invalid v6 default gateway")
  149. }
  150. c.DefaultGatewayIPv6 = net.ParseIP("2001:1234:ae:b004::bad:a55")
  151. err = c.Validate()
  152. if err != nil {
  153. t.Fatalf("Unexpected validation error on v6 default gateway")
  154. }
  155. c.FixedCIDRv6 = nil
  156. err = c.Validate()
  157. if err == nil {
  158. t.Fatalf("Failed to detect invalid v6 default gateway")
  159. }
  160. }
  161. func TestSetDefaultGw(t *testing.T) {
  162. defer netutils.SetupTestNetNS(t)()
  163. _, d := New()
  164. _, subnetv6, _ := net.ParseCIDR("2001:db8:ea9:9abc:b0c4::/80")
  165. gw4 := bridgeNetworks[0].IP.To4()
  166. gw4[3] = 254
  167. gw6 := net.ParseIP("2001:db8:ea9:9abc:b0c4::254")
  168. config := &Configuration{
  169. BridgeName: DefaultBridgeName,
  170. EnableIPv6: true,
  171. FixedCIDRv6: subnetv6,
  172. DefaultGatewayIPv4: gw4,
  173. DefaultGatewayIPv6: gw6,
  174. }
  175. genericOption := make(map[string]interface{})
  176. genericOption[options.GenericData] = config
  177. if err := d.Config(genericOption); err != nil {
  178. t.Fatalf("Failed to setup driver config: %v", err)
  179. }
  180. err := d.CreateNetwork("dummy", nil)
  181. if err != nil {
  182. t.Fatalf("Failed to create bridge: %v", err)
  183. }
  184. sinfo, err := d.CreateEndpoint("dummy", "ep", nil)
  185. if err != nil {
  186. t.Fatalf("Failed to create endpoint: %v", err)
  187. }
  188. if !gw4.Equal(sinfo.Gateway) {
  189. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw4, sinfo.Gateway)
  190. }
  191. if !gw6.Equal(sinfo.GatewayIPv6) {
  192. t.Fatalf("Failed to configure default gateway. Expected %v. Found %v", gw6, sinfo.GatewayIPv6)
  193. }
  194. }