sandbox_linux_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package sandbox
  2. import (
  3. "net"
  4. "os"
  5. "path/filepath"
  6. "runtime"
  7. "testing"
  8. "github.com/docker/libnetwork/netutils"
  9. "github.com/vishvananda/netlink"
  10. "github.com/vishvananda/netns"
  11. )
  12. const (
  13. vethName1 = "wierdlongname1"
  14. vethName2 = "wierdlongname2"
  15. sboxIfaceName = "containername"
  16. )
  17. func newKey(t *testing.T) (string, error) {
  18. name, err := netutils.GenerateRandomName("netns", 12)
  19. if err != nil {
  20. return "", err
  21. }
  22. name = filepath.Join("/tmp", name)
  23. if _, err := os.Create(name); err != nil {
  24. return "", err
  25. }
  26. return name, nil
  27. }
  28. func newInfo(t *testing.T) (*Info, error) {
  29. veth := &netlink.Veth{
  30. LinkAttrs: netlink.LinkAttrs{Name: vethName1, TxQLen: 0},
  31. PeerName: vethName2}
  32. err := netlink.LinkAdd(veth)
  33. if err != nil {
  34. return nil, err
  35. }
  36. // Store the sandbox side pipe interface
  37. // This is needed for cleanup on DeleteEndpoint()
  38. intf := &Interface{}
  39. intf.SrcName = vethName2
  40. intf.DstName = sboxIfaceName
  41. ip4, addr, err := net.ParseCIDR("192.168.1.100/24")
  42. if err != nil {
  43. return nil, err
  44. }
  45. intf.Address = addr
  46. intf.Address.IP = ip4
  47. ip6, addrv6, err := net.ParseCIDR("2001:DB8::ABCD/48")
  48. if err != nil {
  49. return nil, err
  50. }
  51. intf.AddressIPv6 = addrv6
  52. intf.AddressIPv6.IP = ip6
  53. sinfo := &Info{Interfaces: []*Interface{intf}}
  54. sinfo.Gateway = net.ParseIP("192.168.1.1")
  55. sinfo.GatewayIPv6 = net.ParseIP("2001:DB8::1")
  56. return sinfo, nil
  57. }
  58. func verifySandbox(t *testing.T, s Sandbox) {
  59. _, ok := s.(*networkNamespace)
  60. if !ok {
  61. t.Fatalf("The sandox interface returned is not of type networkNamespace")
  62. }
  63. origns, err := netns.Get()
  64. if err != nil {
  65. t.Fatalf("Could not get the current netns: %v", err)
  66. }
  67. defer origns.Close()
  68. f, err := os.OpenFile(s.Key(), os.O_RDONLY, 0)
  69. if err != nil {
  70. t.Fatalf("Failed top open network namespace path %q: %v", s.Key(), err)
  71. }
  72. defer f.Close()
  73. runtime.LockOSThread()
  74. defer runtime.UnlockOSThread()
  75. nsFD := f.Fd()
  76. if err = netns.Set(netns.NsHandle(nsFD)); err != nil {
  77. t.Fatalf("Setting to the namespace pointed to by the sandbox %s failed: %v", s.Key(), err)
  78. }
  79. defer netns.Set(origns)
  80. _, err = netlink.LinkByName(sboxIfaceName)
  81. if err != nil {
  82. t.Fatalf("Could not find the interface %s inside the sandbox: %v", sboxIfaceName,
  83. err)
  84. }
  85. }