docker_cli_update_unix_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // +build !windows
  2. package main
  3. import (
  4. "strings"
  5. "github.com/docker/docker/pkg/integration/checker"
  6. "github.com/go-check/check"
  7. )
  8. func (s *DockerSuite) TestUpdateRunningContainer(c *check.C) {
  9. testRequires(c, DaemonIsLinux)
  10. testRequires(c, memoryLimitSupport)
  11. name := "test-update-container"
  12. dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "top")
  13. dockerCmd(c, "update", "-m", "500M", name)
  14. memory, err := inspectField(name, "HostConfig.Memory")
  15. c.Assert(err, check.IsNil)
  16. if memory != "524288000" {
  17. c.Fatalf("Got the wrong memory value, we got %d, expected 524288000(500M).", memory)
  18. }
  19. file := "/sys/fs/cgroup/memory/memory.limit_in_bytes"
  20. out, _ := dockerCmd(c, "exec", name, "cat", file)
  21. c.Assert(strings.TrimSpace(out), checker.Equals, "524288000")
  22. }
  23. func (s *DockerSuite) TestUpdateRunningContainerWithRestart(c *check.C) {
  24. testRequires(c, DaemonIsLinux)
  25. testRequires(c, memoryLimitSupport)
  26. name := "test-update-container"
  27. dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "top")
  28. dockerCmd(c, "update", "-m", "500M", name)
  29. dockerCmd(c, "restart", name)
  30. memory, err := inspectField(name, "HostConfig.Memory")
  31. c.Assert(err, check.IsNil)
  32. if memory != "524288000" {
  33. c.Fatalf("Got the wrong memory value, we got %d, expected 524288000(500M).", memory)
  34. }
  35. file := "/sys/fs/cgroup/memory/memory.limit_in_bytes"
  36. out, _ := dockerCmd(c, "exec", name, "cat", file)
  37. c.Assert(strings.TrimSpace(out), checker.Equals, "524288000")
  38. }
  39. func (s *DockerSuite) TestUpdateStoppedContainer(c *check.C) {
  40. testRequires(c, DaemonIsLinux)
  41. testRequires(c, memoryLimitSupport)
  42. name := "test-update-container"
  43. file := "/sys/fs/cgroup/memory/memory.limit_in_bytes"
  44. dockerCmd(c, "run", "--name", name, "-m", "300M", "busybox", "cat", file)
  45. dockerCmd(c, "update", "-m", "500M", name)
  46. memory, err := inspectField(name, "HostConfig.Memory")
  47. c.Assert(err, check.IsNil)
  48. if memory != "524288000" {
  49. c.Fatalf("Got the wrong memory value, we got %d, expected 524288000(500M).", memory)
  50. }
  51. out, _ := dockerCmd(c, "start", "-a", name)
  52. c.Assert(strings.TrimSpace(out), checker.Equals, "524288000")
  53. }
  54. func (s *DockerSuite) TestUpdatePausedContainer(c *check.C) {
  55. testRequires(c, DaemonIsLinux)
  56. testRequires(c, cpuShare)
  57. name := "test-update-container"
  58. dockerCmd(c, "run", "-d", "--name", name, "--cpu-shares", "1000", "busybox", "top")
  59. dockerCmd(c, "pause", name)
  60. dockerCmd(c, "update", "--cpu-shares", "500", name)
  61. out, err := inspectField(name, "HostConfig.CPUShares")
  62. c.Assert(err, check.IsNil)
  63. if out != "500" {
  64. c.Fatalf("Got the wrong cpu shares value, we got %d, expected 500.", out)
  65. }
  66. dockerCmd(c, "unpause", name)
  67. file := "/sys/fs/cgroup/cpu/cpu.shares"
  68. out, _ = dockerCmd(c, "exec", name, "cat", file)
  69. c.Assert(strings.TrimSpace(out), checker.Equals, "500")
  70. }
  71. func (s *DockerSuite) TestUpdateWithUntouchedFields(c *check.C) {
  72. testRequires(c, DaemonIsLinux)
  73. testRequires(c, memoryLimitSupport)
  74. testRequires(c, cpuShare)
  75. name := "test-update-container"
  76. dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "--cpu-shares", "800", "busybox", "top")
  77. dockerCmd(c, "update", "-m", "500M", name)
  78. // Update memory and not touch cpus, `cpuset.cpus` should still have the old value
  79. out, err := inspectField(name, "HostConfig.CPUShares")
  80. c.Assert(err, check.IsNil)
  81. c.Assert(out, check.Equals, "800")
  82. file := "/sys/fs/cgroup/cpu/cpu.shares"
  83. out, _ = dockerCmd(c, "exec", name, "cat", file)
  84. c.Assert(strings.TrimSpace(out), checker.Equals, "800")
  85. }
  86. func (s *DockerSuite) TestUpdateContainerInvalidValue(c *check.C) {
  87. testRequires(c, DaemonIsLinux)
  88. testRequires(c, memoryLimitSupport)
  89. name := "test-update-container"
  90. dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "true")
  91. out, _, err := dockerCmdWithError("update", "-m", "2M", name)
  92. c.Assert(err, check.NotNil)
  93. expected := "Minimum memory limit allowed is 4MB"
  94. c.Assert(out, checker.Contains, expected)
  95. }
  96. func (s *DockerSuite) TestUpdateContainerWithoutFlags(c *check.C) {
  97. testRequires(c, DaemonIsLinux)
  98. testRequires(c, memoryLimitSupport)
  99. name := "test-update-container"
  100. dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "true")
  101. _, _, err := dockerCmdWithError("update", name)
  102. c.Assert(err, check.NotNil)
  103. }
  104. func (s *DockerSuite) TestUpdateKernelMemory(c *check.C) {
  105. testRequires(c, DaemonIsLinux)
  106. testRequires(c, kernelMemorySupport)
  107. name := "test-update-container"
  108. dockerCmd(c, "run", "-d", "--name", name, "--kernel-memory", "50M", "busybox", "top")
  109. _, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name)
  110. // Update kernel memory to a running container is not allowed.
  111. c.Assert(err, check.NotNil)
  112. out, err := inspectField(name, "HostConfig.KernelMemory")
  113. c.Assert(err, check.IsNil)
  114. // Update kernel memory to a running container with failure should not change HostConfig
  115. if out != "52428800" {
  116. c.Fatalf("Got the wrong memory value, we got %d, expected 52428800(50M).", out)
  117. }
  118. dockerCmd(c, "stop", name)
  119. dockerCmd(c, "update", "--kernel-memory", "100M", name)
  120. dockerCmd(c, "start", name)
  121. out, err = inspectField(name, "HostConfig.KernelMemory")
  122. c.Assert(err, check.IsNil)
  123. if out != "104857600" {
  124. c.Fatalf("Got the wrong memory value, we got %d, expected 104857600(100M).", out)
  125. }
  126. file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes"
  127. out, _ = dockerCmd(c, "exec", name, "cat", file)
  128. c.Assert(strings.TrimSpace(out), checker.Equals, "104857600")
  129. }