pause_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "context"
  4. "io"
  5. "testing"
  6. "time"
  7. cerrdefs "github.com/containerd/containerd/errdefs"
  8. "github.com/docker/docker/api/types"
  9. containertypes "github.com/docker/docker/api/types/container"
  10. "github.com/docker/docker/api/types/events"
  11. "github.com/docker/docker/api/types/filters"
  12. "github.com/docker/docker/api/types/versions"
  13. "github.com/docker/docker/integration/internal/container"
  14. "github.com/docker/docker/testutil/request"
  15. "gotest.tools/v3/assert"
  16. is "gotest.tools/v3/assert/cmp"
  17. "gotest.tools/v3/poll"
  18. "gotest.tools/v3/skip"
  19. )
  20. func TestPause(t *testing.T) {
  21. skip.If(t, testEnv.DaemonInfo.OSType == "windows" && testEnv.DaemonInfo.Isolation == "process")
  22. skip.If(t, testEnv.DaemonInfo.CgroupDriver == "none")
  23. defer setupTest(t)()
  24. apiClient := testEnv.APIClient()
  25. ctx := context.Background()
  26. cID := container.Run(ctx, t, apiClient)
  27. poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
  28. since := request.DaemonUnixTime(ctx, t, apiClient, testEnv)
  29. err := apiClient.ContainerPause(ctx, cID)
  30. assert.NilError(t, err)
  31. inspect, err := apiClient.ContainerInspect(ctx, cID)
  32. assert.NilError(t, err)
  33. assert.Check(t, is.Equal(true, inspect.State.Paused))
  34. err = apiClient.ContainerUnpause(ctx, cID)
  35. assert.NilError(t, err)
  36. until := request.DaemonUnixTime(ctx, t, apiClient, testEnv)
  37. messages, errs := apiClient.Events(ctx, types.EventsOptions{
  38. Since: since,
  39. Until: until,
  40. Filters: filters.NewArgs(filters.Arg("container", cID)),
  41. })
  42. assert.Check(t, is.DeepEqual([]string{"pause", "unpause"}, getEventActions(t, messages, errs)))
  43. }
  44. func TestPauseFailsOnWindowsServerContainers(t *testing.T) {
  45. skip.If(t, testEnv.DaemonInfo.OSType != "windows" || testEnv.DaemonInfo.Isolation != "process")
  46. defer setupTest(t)()
  47. apiClient := testEnv.APIClient()
  48. ctx := context.Background()
  49. cID := container.Run(ctx, t, apiClient)
  50. poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
  51. err := apiClient.ContainerPause(ctx, cID)
  52. assert.Check(t, is.ErrorContains(err, cerrdefs.ErrNotImplemented.Error()))
  53. }
  54. func TestPauseStopPausedContainer(t *testing.T) {
  55. skip.If(t, testEnv.DaemonInfo.OSType == "windows")
  56. skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.31"), "broken in earlier versions")
  57. skip.If(t, testEnv.DaemonInfo.CgroupDriver == "none")
  58. defer setupTest(t)()
  59. apiClient := testEnv.APIClient()
  60. ctx := context.Background()
  61. cID := container.Run(ctx, t, apiClient)
  62. poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
  63. err := apiClient.ContainerPause(ctx, cID)
  64. assert.NilError(t, err)
  65. err = apiClient.ContainerStop(ctx, cID, containertypes.StopOptions{})
  66. assert.NilError(t, err)
  67. poll.WaitOn(t, container.IsStopped(ctx, apiClient, cID), poll.WithDelay(100*time.Millisecond))
  68. }
  69. func getEventActions(t *testing.T, messages <-chan events.Message, errs <-chan error) []string {
  70. var actions []string
  71. for {
  72. select {
  73. case err := <-errs:
  74. assert.Check(t, err == nil || err == io.EOF)
  75. return actions
  76. case e := <-messages:
  77. actions = append(actions, e.Status)
  78. }
  79. }
  80. }