network_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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. err := d.CreateNetwork("dummy", genericOption, nil, nil)
  24. if err != nil {
  25. t.Fatalf("Failed to create bridge: %v", err)
  26. }
  27. te := &testEndpoint{iface: &testInterface{}}
  28. err = d.CreateEndpoint("dummy", "", te.Interface(), nil)
  29. if err != nil {
  30. if _, ok := err.(InvalidEndpointIDError); !ok {
  31. t.Fatalf("Failed with a wrong error :%s", err.Error())
  32. }
  33. } else {
  34. t.Fatalf("Failed to detect invalid config")
  35. }
  36. // Good endpoint creation
  37. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  38. if err != nil {
  39. t.Fatalf("Failed to create a link: %s", err.Error())
  40. }
  41. err = d.Join("dummy", "ep", "sbox", te, 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(te.iface.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. te1 := &testEndpoint{iface: &testInterface{}}
  56. err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
  57. if err == nil {
  58. t.Fatalf("Failed to detect duplicate endpoint id on same network")
  59. }
  60. if te.iface.dstName == "" {
  61. t.Fatal("Invalid Dstname returned")
  62. }
  63. _, err = netlink.LinkByName(te.iface.srcName)
  64. if err != nil {
  65. t.Fatalf("Could not find source link %s: %v", te.iface.srcName, err)
  66. }
  67. n, ok := d.networks["dummy"]
  68. if !ok {
  69. t.Fatalf("Cannot find network %s inside driver", "dummy")
  70. }
  71. ip := te.iface.addr.IP
  72. if !n.bridge.bridgeIPv4.Contains(ip) {
  73. t.Fatalf("IP %s is not a valid ip in the subnet %s", ip.String(), n.bridge.bridgeIPv4.String())
  74. }
  75. ip6 := te.iface.addrv6.IP
  76. if !n.bridge.bridgeIPv6.Contains(ip6) {
  77. t.Fatalf("IP %s is not a valid ip in the subnet %s", ip6.String(), bridgeIPv6.String())
  78. }
  79. if !te.gw.Equal(n.bridge.bridgeIPv4.IP) {
  80. t.Fatalf("Invalid default gateway. Expected %s. Got %s", n.bridge.bridgeIPv4.IP.String(),
  81. te.gw.String())
  82. }
  83. if !te.gw6.Equal(n.bridge.bridgeIPv6.IP) {
  84. t.Fatalf("Invalid default gateway for IPv6. Expected %s. Got %s", n.bridge.bridgeIPv6.IP.String(),
  85. te.gw6.String())
  86. }
  87. }
  88. func TestLinkCreateTwo(t *testing.T) {
  89. defer testutils.SetupTestOSContext(t)()
  90. d := newDriver()
  91. if err := d.configure(nil); err != nil {
  92. t.Fatalf("Failed to setup driver config: %v", err)
  93. }
  94. config := &networkConfiguration{
  95. BridgeName: DefaultBridgeName,
  96. EnableIPv6: true}
  97. genericOption := make(map[string]interface{})
  98. genericOption[netlabel.GenericData] = config
  99. err := d.CreateNetwork("dummy", genericOption, nil, nil)
  100. if err != nil {
  101. t.Fatalf("Failed to create bridge: %v", err)
  102. }
  103. te1 := &testEndpoint{iface: &testInterface{}}
  104. err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
  105. if err != nil {
  106. t.Fatalf("Failed to create a link: %s", err.Error())
  107. }
  108. te2 := &testEndpoint{iface: &testInterface{}}
  109. err = d.CreateEndpoint("dummy", "ep", te2.Interface(), nil)
  110. if err != nil {
  111. if _, ok := err.(driverapi.ErrEndpointExists); !ok {
  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 testutils.SetupTestOSContext(t)()
  120. d := newDriver()
  121. if err := d.configure(nil); err != nil {
  122. t.Fatalf("Failed to setup driver config: %v", err)
  123. }
  124. config := &networkConfiguration{
  125. BridgeName: DefaultBridgeName}
  126. genericOption := make(map[string]interface{})
  127. genericOption[netlabel.GenericData] = config
  128. err := d.CreateNetwork("dummy", genericOption, nil, nil)
  129. if err != nil {
  130. t.Fatalf("Failed to create bridge: %v", err)
  131. }
  132. te := &testEndpoint{iface: &testInterface{}}
  133. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  134. if err != nil {
  135. t.Fatalf("Failed to create a link: %s", err.Error())
  136. }
  137. iface := te.iface
  138. if iface.addrv6 != nil && iface.addrv6.IP.To16() != nil {
  139. t.Fatalf("Expectd IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", iface.addrv6.String())
  140. }
  141. if te.gw6.To16() != nil {
  142. t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", te.gw6.String())
  143. }
  144. }
  145. func TestLinkDelete(t *testing.T) {
  146. defer testutils.SetupTestOSContext(t)()
  147. d := newDriver()
  148. if err := d.configure(nil); err != nil {
  149. t.Fatalf("Failed to setup driver config: %v", err)
  150. }
  151. config := &networkConfiguration{
  152. BridgeName: DefaultBridgeName,
  153. EnableIPv6: true}
  154. genericOption := make(map[string]interface{})
  155. genericOption[netlabel.GenericData] = config
  156. err := d.CreateNetwork("dummy", genericOption, nil, nil)
  157. if err != nil {
  158. t.Fatalf("Failed to create bridge: %v", err)
  159. }
  160. te := &testEndpoint{iface: &testInterface{}}
  161. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
  162. if err != nil {
  163. t.Fatalf("Failed to create a link: %s", err.Error())
  164. }
  165. err = d.DeleteEndpoint("dummy", "")
  166. if err != nil {
  167. if _, ok := err.(InvalidEndpointIDError); !ok {
  168. t.Fatalf("Failed with a wrong error :%s", err.Error())
  169. }
  170. } else {
  171. t.Fatalf("Failed to detect invalid config")
  172. }
  173. err = d.DeleteEndpoint("dummy", "ep1")
  174. if err != nil {
  175. t.Fatal(err)
  176. }
  177. }