network_test.go 5.5 KB

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