network_test.go 5.3 KB

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