run_linux_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "context"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "strconv"
  9. "strings"
  10. "testing"
  11. "time"
  12. containertypes "github.com/docker/docker/api/types/container"
  13. "github.com/docker/docker/api/types/versions"
  14. "github.com/docker/docker/integration/internal/container"
  15. "gotest.tools/assert"
  16. is "gotest.tools/assert/cmp"
  17. "gotest.tools/poll"
  18. "gotest.tools/skip"
  19. )
  20. func TestKernelTCPMemory(t *testing.T) {
  21. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  22. skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "skip test from new feature")
  23. skip.If(t, !testEnv.DaemonInfo.KernelMemoryTCP)
  24. defer setupTest(t)()
  25. client := testEnv.APIClient()
  26. ctx := context.Background()
  27. const (
  28. kernelMemoryTCP int64 = 200 * 1024 * 1024
  29. )
  30. cID := container.Run(t, ctx, client, func(c *container.TestContainerConfig) {
  31. c.HostConfig.Resources = containertypes.Resources{
  32. KernelMemoryTCP: kernelMemoryTCP,
  33. }
  34. })
  35. poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
  36. inspect, err := client.ContainerInspect(ctx, cID)
  37. assert.NilError(t, err)
  38. assert.Check(t, is.Equal(kernelMemoryTCP, inspect.HostConfig.KernelMemoryTCP))
  39. res, err := container.Exec(ctx, client, cID,
  40. []string{"cat", "/sys/fs/cgroup/memory/memory.kmem.tcp.limit_in_bytes"})
  41. assert.NilError(t, err)
  42. assert.Assert(t, is.Len(res.Stderr(), 0))
  43. assert.Equal(t, 0, res.ExitCode)
  44. assert.Check(t, is.Equal(strconv.FormatInt(kernelMemoryTCP, 10), strings.TrimSpace(res.Stdout())))
  45. }
  46. func TestNISDomainname(t *testing.T) {
  47. // Older versions of the daemon would concatenate hostname and domainname,
  48. // so hostname "foobar" and domainname "baz.cyphar.com" would produce
  49. // `foobar.baz.cyphar.com` as hostname.
  50. skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "skip test from new feature")
  51. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  52. defer setupTest(t)()
  53. client := testEnv.APIClient()
  54. ctx := context.Background()
  55. const (
  56. hostname = "foobar"
  57. domainname = "baz.cyphar.com"
  58. )
  59. cID := container.Run(t, ctx, client, func(c *container.TestContainerConfig) {
  60. c.Config.Hostname = hostname
  61. c.Config.Domainname = domainname
  62. })
  63. poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
  64. inspect, err := client.ContainerInspect(ctx, cID)
  65. assert.NilError(t, err)
  66. assert.Check(t, is.Equal(hostname, inspect.Config.Hostname))
  67. assert.Check(t, is.Equal(domainname, inspect.Config.Domainname))
  68. // Check hostname.
  69. res, err := container.Exec(ctx, client, cID,
  70. []string{"cat", "/proc/sys/kernel/hostname"})
  71. assert.NilError(t, err)
  72. assert.Assert(t, is.Len(res.Stderr(), 0))
  73. assert.Equal(t, 0, res.ExitCode)
  74. assert.Check(t, is.Equal(hostname, strings.TrimSpace(res.Stdout())))
  75. // Check domainname.
  76. res, err = container.Exec(ctx, client, cID,
  77. []string{"cat", "/proc/sys/kernel/domainname"})
  78. assert.NilError(t, err)
  79. assert.Assert(t, is.Len(res.Stderr(), 0))
  80. assert.Equal(t, 0, res.ExitCode)
  81. assert.Check(t, is.Equal(domainname, strings.TrimSpace(res.Stdout())))
  82. }
  83. func TestCgroupNamespaces(t *testing.T) {
  84. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  85. skip.If(t, testEnv.IsRemoteDaemon())
  86. if _, err := os.Stat("/proc/self/ns/cgroup"); os.IsNotExist(err) {
  87. t.Skip("cgroup namespaces are unsupported")
  88. }
  89. defer setupTest(t)()
  90. client := testEnv.APIClient()
  91. ctx := context.Background()
  92. cID := container.Run(t, ctx, client)
  93. poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
  94. path := filepath.Join(os.Getenv("DEST"), "docker.pid")
  95. b, err := ioutil.ReadFile(path)
  96. assert.NilError(t, err)
  97. link, err := os.Readlink(fmt.Sprintf("/proc/%s/ns/cgroup", string(b)))
  98. assert.NilError(t, err)
  99. // Check that the container's cgroup doesn't match the docker daemon's
  100. res, err := container.Exec(ctx, client, cID, []string{"readlink", "/proc/1/ns/cgroup"})
  101. assert.NilError(t, err)
  102. assert.Assert(t, is.Len(res.Stderr(), 0))
  103. assert.Equal(t, 0, res.ExitCode)
  104. assert.Assert(t, link != strings.TrimSpace(res.Stdout()))
  105. }