network_test.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package bridge
  2. import (
  3. "testing"
  4. "github.com/docker/libnetwork/driverapi"
  5. "github.com/docker/libnetwork/netlabel"
  6. "github.com/docker/libnetwork/testutils"
  7. "github.com/vishvananda/netlink"
  8. )
  9. func TestLinkCreate(t *testing.T) {
  10. defer testutils.SetupTestOSContext(t)()
  11. d := newDriver()
  12. if err := d.configure(nil); err != nil {
  13. t.Fatalf("Failed to setup driver config: %v", err)
  14. }
  15. mtu := 1490
  16. config := &networkConfiguration{
  17. BridgeName: DefaultBridgeName,
  18. Mtu: mtu,
  19. EnableIPv6: true,
  20. }
  21. genericOption := make(map[string]interface{})
  22. genericOption[netlabel.GenericData] = config
  23. ipdList := getIPv4Data(t)
  24. err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
  25. if err != nil {
  26. t.Fatalf("Failed to create bridge: %v", err)
  27. }
  28. te := newTestEndpoint(ipdList[0].Pool, 10)
  29. err = d.CreateEndpoint("dummy", "", te.Interface(), nil)
  30. if err != nil {
  31. if _, ok := err.(InvalidEndpointIDError); !ok {
  32. t.Fatalf("Failed with a wrong error :%s", err.Error())
  33. }
  34. } else {
  35. t.Fatalf("Failed to detect invalid config")
  36. }
  37. // Good endpoint creation
  38. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  39. if err != nil {
  40. t.Fatalf("Failed to create a link: %s", err.Error())
  41. }
  42. err = d.Join("dummy", "ep", "sbox", te, nil)
  43. if err != nil {
  44. t.Fatalf("Failed to create a link: %s", err.Error())
  45. }
  46. // Verify sbox endoint interface inherited MTU value from bridge config
  47. sboxLnk, err := netlink.LinkByName(te.iface.srcName)
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. if mtu != sboxLnk.Attrs().MTU {
  52. t.Fatalf("Sandbox endpoint interface did not inherit bridge interface MTU config")
  53. }
  54. // TODO: if we could get peer name from (sboxLnk.(*netlink.Veth)).PeerName
  55. // then we could check the MTU on hostLnk as well.
  56. te1 := newTestEndpoint(ipdList[0].Pool, 11)
  57. err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
  58. if err == nil {
  59. t.Fatalf("Failed to detect duplicate endpoint id on same network")
  60. }
  61. if te.iface.dstName == "" {
  62. t.Fatal("Invalid Dstname returned")
  63. }
  64. _, err = netlink.LinkByName(te.iface.srcName)
  65. if err != nil {
  66. t.Fatalf("Could not find source link %s: %v", te.iface.srcName, err)
  67. }
  68. n, ok := d.networks["dummy"]
  69. if !ok {
  70. t.Fatalf("Cannot find network %s inside driver", "dummy")
  71. }
  72. ip := te.iface.addr.IP
  73. if !n.bridge.bridgeIPv4.Contains(ip) {
  74. t.Fatalf("IP %s is not a valid ip in the subnet %s", ip.String(), n.bridge.bridgeIPv4.String())
  75. }
  76. ip6 := te.iface.addrv6.IP
  77. if !n.bridge.bridgeIPv6.Contains(ip6) {
  78. t.Fatalf("IP %s is not a valid ip in the subnet %s", ip6.String(), bridgeIPv6.String())
  79. }
  80. if !te.gw.Equal(n.bridge.bridgeIPv4.IP) {
  81. t.Fatalf("Invalid default gateway. Expected %s. Got %s", n.bridge.bridgeIPv4.IP.String(),
  82. te.gw.String())
  83. }
  84. if !te.gw6.Equal(n.bridge.bridgeIPv6.IP) {
  85. t.Fatalf("Invalid default gateway for IPv6. Expected %s. Got %s", n.bridge.bridgeIPv6.IP.String(),
  86. te.gw6.String())
  87. }
  88. }
  89. func TestLinkCreateTwo(t *testing.T) {
  90. defer testutils.SetupTestOSContext(t)()
  91. d := newDriver()
  92. if err := d.configure(nil); err != nil {
  93. t.Fatalf("Failed to setup driver config: %v", err)
  94. }
  95. config := &networkConfiguration{
  96. BridgeName: DefaultBridgeName,
  97. EnableIPv6: true}
  98. genericOption := make(map[string]interface{})
  99. genericOption[netlabel.GenericData] = config
  100. ipdList := getIPv4Data(t)
  101. err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
  102. if err != nil {
  103. t.Fatalf("Failed to create bridge: %v", err)
  104. }
  105. te1 := newTestEndpoint(ipdList[0].Pool, 11)
  106. err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
  107. if err != nil {
  108. t.Fatalf("Failed to create a link: %s", err.Error())
  109. }
  110. te2 := newTestEndpoint(ipdList[0].Pool, 12)
  111. err = d.CreateEndpoint("dummy", "ep", te2.Interface(), nil)
  112. if err != nil {
  113. if _, ok := err.(driverapi.ErrEndpointExists); !ok {
  114. t.Fatalf("Failed with a wrong error: %s", err.Error())
  115. }
  116. } else {
  117. t.Fatalf("Expected to fail while trying to add same endpoint twice")
  118. }
  119. }
  120. func TestLinkCreateNoEnableIPv6(t *testing.T) {
  121. defer testutils.SetupTestOSContext(t)()
  122. d := newDriver()
  123. if err := d.configure(nil); err != nil {
  124. t.Fatalf("Failed to setup driver config: %v", err)
  125. }
  126. config := &networkConfiguration{
  127. BridgeName: DefaultBridgeName}
  128. genericOption := make(map[string]interface{})
  129. genericOption[netlabel.GenericData] = config
  130. ipdList := getIPv4Data(t)
  131. err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
  132. if err != nil {
  133. t.Fatalf("Failed to create bridge: %v", err)
  134. }
  135. te := newTestEndpoint(ipdList[0].Pool, 30)
  136. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  137. if err != nil {
  138. t.Fatalf("Failed to create a link: %s", err.Error())
  139. }
  140. iface := te.iface
  141. if iface.addrv6 != nil && iface.addrv6.IP.To16() != nil {
  142. t.Fatalf("Expectd IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", iface.addrv6.String())
  143. }
  144. if te.gw6.To16() != nil {
  145. t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", te.gw6.String())
  146. }
  147. }
  148. func TestLinkDelete(t *testing.T) {
  149. defer testutils.SetupTestOSContext(t)()
  150. d := newDriver()
  151. if err := d.configure(nil); err != nil {
  152. t.Fatalf("Failed to setup driver config: %v", err)
  153. }
  154. config := &networkConfiguration{
  155. BridgeName: DefaultBridgeName,
  156. EnableIPv6: true}
  157. genericOption := make(map[string]interface{})
  158. genericOption[netlabel.GenericData] = config
  159. ipdList := getIPv4Data(t)
  160. err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
  161. if err != nil {
  162. t.Fatalf("Failed to create bridge: %v", err)
  163. }
  164. te := newTestEndpoint(ipdList[0].Pool, 30)
  165. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
  166. if err != nil {
  167. t.Fatalf("Failed to create a link: %s", err.Error())
  168. }
  169. err = d.DeleteEndpoint("dummy", "")
  170. if err != nil {
  171. if _, ok := err.(InvalidEndpointIDError); !ok {
  172. t.Fatalf("Failed with a wrong error :%s", err.Error())
  173. }
  174. } else {
  175. t.Fatalf("Failed to detect invalid config")
  176. }
  177. err = d.DeleteEndpoint("dummy", "ep1")
  178. if err != nil {
  179. t.Fatal(err)
  180. }
  181. }