network_linux_test.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package bridge
  2. import (
  3. "testing"
  4. "github.com/docker/docker/internal/testutils/netnsutils"
  5. "github.com/docker/docker/libnetwork/driverapi"
  6. "github.com/docker/docker/libnetwork/netlabel"
  7. "github.com/vishvananda/netlink"
  8. )
  9. func TestLinkCreate(t *testing.T) {
  10. defer netnsutils.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, nil, 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.Fatal("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 endpoint 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.Fatal("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.Fatal("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 netnsutils.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. }
  99. genericOption := make(map[string]interface{})
  100. genericOption[netlabel.GenericData] = config
  101. ipdList := getIPv4Data(t)
  102. err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
  103. if err != nil {
  104. t.Fatalf("Failed to create bridge: %v", err)
  105. }
  106. te1 := newTestEndpoint(ipdList[0].Pool, 11)
  107. err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
  108. if err != nil {
  109. t.Fatalf("Failed to create a link: %s", err.Error())
  110. }
  111. te2 := newTestEndpoint(ipdList[0].Pool, 12)
  112. err = d.CreateEndpoint("dummy", "ep", te2.Interface(), nil)
  113. if err != nil {
  114. if _, ok := err.(driverapi.ErrEndpointExists); !ok {
  115. t.Fatalf("Failed with a wrong error: %s", err.Error())
  116. }
  117. } else {
  118. t.Fatal("Expected to fail while trying to add same endpoint twice")
  119. }
  120. }
  121. func TestLinkCreateNoEnableIPv6(t *testing.T) {
  122. defer netnsutils.SetupTestOSContext(t)()
  123. d := newDriver()
  124. if err := d.configure(nil); err != nil {
  125. t.Fatalf("Failed to setup driver config: %v", err)
  126. }
  127. config := &networkConfiguration{
  128. BridgeName: DefaultBridgeName,
  129. }
  130. genericOption := make(map[string]interface{})
  131. genericOption[netlabel.GenericData] = config
  132. ipdList := getIPv4Data(t)
  133. err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
  134. if err != nil {
  135. t.Fatalf("Failed to create bridge: %v", err)
  136. }
  137. te := newTestEndpoint(ipdList[0].Pool, 30)
  138. err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
  139. if err != nil {
  140. t.Fatalf("Failed to create a link: %s", err.Error())
  141. }
  142. iface := te.iface
  143. if iface.addrv6 != nil && iface.addrv6.IP.To16() != nil {
  144. t.Fatalf("Expected IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", iface.addrv6.String())
  145. }
  146. if te.gw6.To16() != nil {
  147. t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", te.gw6.String())
  148. }
  149. }
  150. func TestLinkDelete(t *testing.T) {
  151. defer netnsutils.SetupTestOSContext(t)()
  152. d := newDriver()
  153. if err := d.configure(nil); err != nil {
  154. t.Fatalf("Failed to setup driver config: %v", err)
  155. }
  156. config := &networkConfiguration{
  157. BridgeName: DefaultBridgeName,
  158. EnableIPv6: true,
  159. }
  160. genericOption := make(map[string]interface{})
  161. genericOption[netlabel.GenericData] = config
  162. ipdList := getIPv4Data(t)
  163. err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
  164. if err != nil {
  165. t.Fatalf("Failed to create bridge: %v", err)
  166. }
  167. te := newTestEndpoint(ipdList[0].Pool, 30)
  168. err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
  169. if err != nil {
  170. t.Fatalf("Failed to create a link: %s", err.Error())
  171. }
  172. err = d.DeleteEndpoint("dummy", "")
  173. if err != nil {
  174. if _, ok := err.(InvalidEndpointIDError); !ok {
  175. t.Fatalf("Failed with a wrong error :%s", err.Error())
  176. }
  177. } else {
  178. t.Fatal("Failed to detect invalid config")
  179. }
  180. err = d.DeleteEndpoint("dummy", "ep1")
  181. if err != nil {
  182. t.Fatal(err)
  183. }
  184. }