network_test.go 5.1 KB

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