sandbox_linux_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package sandbox
  2. import (
  3. "net"
  4. "os"
  5. "path/filepath"
  6. "runtime"
  7. "testing"
  8. "time"
  9. "github.com/docker/libnetwork/netutils"
  10. "github.com/vishvananda/netlink"
  11. "github.com/vishvananda/netns"
  12. )
  13. const (
  14. vethName1 = "wierdlongname1"
  15. vethName2 = "wierdlongname2"
  16. vethName3 = "wierdlongname3"
  17. vethName4 = "wierdlongname4"
  18. sboxIfaceName = "containername"
  19. )
  20. func newKey(t *testing.T) (string, error) {
  21. name, err := netutils.GenerateRandomName("netns", 12)
  22. if err != nil {
  23. return "", err
  24. }
  25. name = filepath.Join("/tmp", name)
  26. if _, err := os.Create(name); err != nil {
  27. return "", err
  28. }
  29. // Set the rpmCleanupPeriod to be low to make the test run quicker
  30. gpmCleanupPeriod = 2
  31. return name, nil
  32. }
  33. func newInfo(t *testing.T) (*Info, error) {
  34. veth := &netlink.Veth{
  35. LinkAttrs: netlink.LinkAttrs{Name: vethName1, TxQLen: 0},
  36. PeerName: vethName2}
  37. if err := netlink.LinkAdd(veth); err != nil {
  38. return nil, err
  39. }
  40. // Store the sandbox side pipe interface
  41. // This is needed for cleanup on DeleteEndpoint()
  42. intf1 := &Interface{}
  43. intf1.SrcName = vethName2
  44. intf1.DstName = sboxIfaceName
  45. ip4, addr, err := net.ParseCIDR("192.168.1.100/24")
  46. if err != nil {
  47. return nil, err
  48. }
  49. intf1.Address = addr
  50. intf1.Address.IP = ip4
  51. // ip6, addrv6, err := net.ParseCIDR("2001:DB8::ABCD/48")
  52. ip6, addrv6, err := net.ParseCIDR("fe80::2/64")
  53. if err != nil {
  54. return nil, err
  55. }
  56. intf1.AddressIPv6 = addrv6
  57. intf1.AddressIPv6.IP = ip6
  58. _, route, err := net.ParseCIDR("192.168.2.1/32")
  59. if err != nil {
  60. return nil, err
  61. }
  62. intf1.Routes = []*net.IPNet{route}
  63. veth = &netlink.Veth{
  64. LinkAttrs: netlink.LinkAttrs{Name: vethName3, TxQLen: 0},
  65. PeerName: vethName4}
  66. if err := netlink.LinkAdd(veth); err != nil {
  67. return nil, err
  68. }
  69. intf2 := &Interface{}
  70. intf2.SrcName = vethName4
  71. intf2.DstName = sboxIfaceName
  72. ip4, addr, err = net.ParseCIDR("192.168.2.100/24")
  73. if err != nil {
  74. return nil, err
  75. }
  76. intf2.Address = addr
  77. intf2.Address.IP = ip4
  78. // ip6, addrv6, err := net.ParseCIDR("2001:DB8::ABCD/48")
  79. ip6, addrv6, err = net.ParseCIDR("fe80::3/64")
  80. if err != nil {
  81. return nil, err
  82. }
  83. intf2.AddressIPv6 = addrv6
  84. intf2.AddressIPv6.IP = ip6
  85. sinfo := &Info{Interfaces: []*Interface{intf1, intf2}}
  86. sinfo.Gateway = net.ParseIP("192.168.1.1")
  87. // sinfo.GatewayIPv6 = net.ParseIP("2001:DB8::1")
  88. sinfo.GatewayIPv6 = net.ParseIP("fe80::1")
  89. return sinfo, nil
  90. }
  91. func verifySandbox(t *testing.T, s Sandbox) {
  92. _, ok := s.(*networkNamespace)
  93. if !ok {
  94. t.Fatalf("The sandox interface returned is not of type networkNamespace")
  95. }
  96. origns, err := netns.Get()
  97. if err != nil {
  98. t.Fatalf("Could not get the current netns: %v", err)
  99. }
  100. defer origns.Close()
  101. f, err := os.OpenFile(s.Key(), os.O_RDONLY, 0)
  102. if err != nil {
  103. t.Fatalf("Failed top open network namespace path %q: %v", s.Key(), err)
  104. }
  105. defer f.Close()
  106. runtime.LockOSThread()
  107. defer runtime.UnlockOSThread()
  108. nsFD := f.Fd()
  109. if err = netns.Set(netns.NsHandle(nsFD)); err != nil {
  110. t.Fatalf("Setting to the namespace pointed to by the sandbox %s failed: %v", s.Key(), err)
  111. }
  112. defer netns.Set(origns)
  113. _, err = netlink.LinkByName(sboxIfaceName + "0")
  114. if err != nil {
  115. t.Fatalf("Could not find the interface %s inside the sandbox: %v", sboxIfaceName+"0",
  116. err)
  117. }
  118. _, err = netlink.LinkByName(sboxIfaceName + "1")
  119. if err != nil {
  120. t.Fatalf("Could not find the interface %s inside the sandbox: %v", sboxIfaceName+"1",
  121. err)
  122. }
  123. }
  124. func verifyCleanup(t *testing.T, s Sandbox) {
  125. time.Sleep(time.Duration(gpmCleanupPeriod*2) * time.Second)
  126. if _, err := os.Stat(s.Key()); err == nil {
  127. t.Fatalf("The sandbox path %s is not getting cleanup event after twice the cleanup period", s.Key())
  128. }
  129. }