diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go index 623a5cefcb..953d981f3f 100644 --- a/integration-cli/docker_api_containers_test.go +++ b/integration-cli/docker_api_containers_test.go @@ -1981,8 +1981,10 @@ func containerExit(ctx context.Context, apiclient client.APIClient, name string) return poll.Error(err) } switch ctr.State.Status { - case "created", "running": + case container.StateCreated, container.StateRunning: return poll.Continue("container %s is %s, waiting for exit", name, ctr.State.Status) + case container.StatePaused, container.StateRestarting, container.StateRemoving, container.StateExited, container.StateDead: + // done } return poll.Success() } diff --git a/integration/capabilities/capabilities_linux_test.go b/integration/capabilities/capabilities_linux_test.go index 2c22059499..8f7f5776c2 100644 --- a/integration/capabilities/capabilities_linux_test.go +++ b/integration/capabilities/capabilities_linux_test.go @@ -79,7 +79,7 @@ func TestNoNewPrivileges(t *testing.T) { container.WithSecurityOpt("no-new-privileges=true"), ) cid := container.Run(ctx, t, client, opts...) - poll.WaitOn(t, container.IsInState(ctx, client, cid, "exited")) + poll.WaitOn(t, container.IsInState(ctx, client, cid, containertypes.StateExited)) // Assert on outputs logReader, err := client.ContainerLogs(ctx, cid, containertypes.LogsOptions{ diff --git a/integration/container/checkpoint_test.go b/integration/container/checkpoint_test.go index 06542ade34..07d0f216ed 100644 --- a/integration/container/checkpoint_test.go +++ b/integration/container/checkpoint_test.go @@ -104,7 +104,7 @@ func TestCheckpoint(t *testing.T) { }) assert.NilError(t, err) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited)) inspect, err = apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) diff --git a/integration/container/create_test.go b/integration/container/create_test.go index 8cf8f78e06..5d2b75a648 100644 --- a/integration/container/create_test.go +++ b/integration/container/create_test.go @@ -339,7 +339,7 @@ func TestCreateWithCustomMaskedPaths(t *testing.T) { err = apiClient.ContainerStart(ctx, c.ID, container.StartOptions{}) assert.NilError(t, err) - poll.WaitOn(t, testContainer.IsInState(ctx, apiClient, c.ID, "exited")) + poll.WaitOn(t, testContainer.IsInState(ctx, apiClient, c.ID, container.StateExited)) checkInspect(t, ctx, name, tc.expected) } @@ -417,7 +417,7 @@ func TestCreateWithCustomReadonlyPaths(t *testing.T) { err = apiClient.ContainerStart(ctx, c.ID, container.StartOptions{}) assert.NilError(t, err) - poll.WaitOn(t, testContainer.IsInState(ctx, apiClient, c.ID, "exited")) + poll.WaitOn(t, testContainer.IsInState(ctx, apiClient, c.ID, container.StateExited)) checkInspect(t, ctx, name, tc.expected) } diff --git a/integration/container/daemon_linux_test.go b/integration/container/daemon_linux_test.go index 843f7e0bfd..a3642542d8 100644 --- a/integration/container/daemon_linux_test.go +++ b/integration/container/daemon_linux_test.go @@ -269,7 +269,7 @@ func TestHardRestartWhenContainerIsRunning(t *testing.T) { defer cancel() inspect, err := apiClient.ContainerInspect(ctx, noPolicy) assert.NilError(t, err) - assert.Check(t, is.Equal(inspect.State.Status, "exited")) + assert.Check(t, is.Equal(inspect.State.Status, containertypes.StateExited)) assert.Check(t, is.Equal(inspect.State.ExitCode, 255)) finishedAt, err := time.Parse(time.RFC3339Nano, inspect.State.FinishedAt) if assert.Check(t, err) { @@ -283,7 +283,7 @@ func TestHardRestartWhenContainerIsRunning(t *testing.T) { defer cancel() inspect, err := apiClient.ContainerInspect(ctx, onFailure) assert.NilError(t, err) - assert.Check(t, is.Equal(inspect.State.Status, "running")) + assert.Check(t, is.Equal(inspect.State.Status, containertypes.StateRunning)) assert.Check(t, is.Equal(inspect.State.ExitCode, 0)) finishedAt, err := time.Parse(time.RFC3339Nano, inspect.State.FinishedAt) if assert.Check(t, err) { diff --git a/integration/container/diff_test.go b/integration/container/diff_test.go index 8f14c3a5ab..66f602ab3b 100644 --- a/integration/container/diff_test.go +++ b/integration/container/diff_test.go @@ -38,7 +38,7 @@ func TestDiffStoppedContainer(t *testing.T) { cID := container.Run(ctx, t, apiClient, container.WithCmd("sh", "-c", `mkdir /foo; echo xyzzy > /foo/bar`)) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited"), poll.WithTimeout(60*time.Second)) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited), poll.WithTimeout(60*time.Second)) expected := []containertypes.FilesystemChange{ {Kind: containertypes.ChangeAdd, Path: "/foo"}, diff --git a/integration/container/kill_test.go b/integration/container/kill_test.go index d4bbdeaa96..2656ed86b5 100644 --- a/integration/container/kill_test.go +++ b/integration/container/kill_test.go @@ -22,12 +22,12 @@ func TestKillContainerInvalidSignal(t *testing.T) { err := apiClient.ContainerKill(ctx, id, "0") assert.ErrorContains(t, err, "Error response from daemon:") assert.ErrorContains(t, err, "nvalid signal: 0") // match "(I|i)nvalid" case-insensitive to allow testing against older daemons. - poll.WaitOn(t, container.IsInState(ctx, apiClient, id, "running")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, id, containertypes.StateRunning)) err = apiClient.ContainerKill(ctx, id, "SIG42") assert.ErrorContains(t, err, "Error response from daemon:") assert.ErrorContains(t, err, "nvalid signal: SIG42") // match "(I|i)nvalid" case-insensitive to allow testing against older daemons. - poll.WaitOn(t, container.IsInState(ctx, apiClient, id, "running")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, id, containertypes.StateRunning)) } func TestKillContainer(t *testing.T) { @@ -37,25 +37,25 @@ func TestKillContainer(t *testing.T) { testCases := []struct { doc string signal string - status string + status containertypes.ContainerState skipOs string }{ { doc: "no signal", signal: "", - status: "exited", + status: containertypes.StateExited, skipOs: "", }, { doc: "non killing signal", signal: "SIGWINCH", - status: "running", + status: containertypes.StateRunning, skipOs: "windows", }, { doc: "killing signal", signal: "SIGTERM", - status: "exited", + status: containertypes.StateExited, skipOs: "", }, } @@ -142,7 +142,7 @@ func TestKillDifferentUserContainer(t *testing.T) { err := apiClient.ContainerKill(ctx, id, "SIGKILL") assert.NilError(t, err) - poll.WaitOn(t, container.IsInState(ctx, apiClient, id, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, id, containertypes.StateExited)) } func TestInspectOomKilledTrue(t *testing.T) { @@ -158,7 +158,7 @@ func TestInspectOomKilledTrue(t *testing.T) { c.HostConfig.Resources.Memory = 32 * 1024 * 1024 }) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited)) inspect, err := apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) @@ -173,7 +173,7 @@ func TestInspectOomKilledFalse(t *testing.T) { cID := container.Run(ctx, t, apiClient, container.WithCmd("sh", "-c", "echo hello world")) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited)) inspect, err := apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) diff --git a/integration/container/remove_test.go b/integration/container/remove_test.go index 47dbabc543..e09b649be8 100644 --- a/integration/container/remove_test.go +++ b/integration/container/remove_test.go @@ -35,7 +35,7 @@ func TestRemoveContainerWithRemovedVolume(t *testing.T) { tempDir := fs.NewDir(t, "test-rm-container-with-removed-volume", fs.WithMode(0o755)) cID := container.Run(ctx, t, apiClient, container.WithCmd("true"), container.WithBind(tempDir.Path(), prefix+slash+"test")) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited)) err := os.RemoveAll(tempDir.Path()) assert.NilError(t, err) @@ -58,7 +58,7 @@ func TestRemoveContainerWithVolume(t *testing.T) { prefix, slash := getPrefixAndSlashFromDaemonPlatform() cID := container.Run(ctx, t, apiClient, container.WithCmd("true"), container.WithVolume(prefix+slash+"srv")) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited)) insp, _, err := apiClient.ContainerInspectWithRaw(ctx, cID, true) assert.NilError(t, err) diff --git a/integration/container/rename_test.go b/integration/container/rename_test.go index 2d6cc3e468..a5093414c2 100644 --- a/integration/container/rename_test.go +++ b/integration/container/rename_test.go @@ -144,7 +144,7 @@ func TestRenameAnonymousContainer(t *testing.T) { } c.HostConfig.NetworkMode = containertypes.NetworkMode(networkName) }, container.WithCmd("ping", count, "1", container1Name)) - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited)) inspect, err := apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) diff --git a/integration/container/restart_test.go b/integration/container/restart_test.go index a282105504..ba7a9a85e5 100644 --- a/integration/container/restart_test.go +++ b/integration/container/restart_test.go @@ -202,9 +202,9 @@ func TestContainerWithAutoRemoveCanBeRestarted(t *testing.T) { inspect, err := apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) - assert.Assert(t, inspect.State.Status != "removing", "Container should not be removing yet") + assert.Assert(t, inspect.State.Status != container.StateRemoving, "Container should not be removing yet") - poll.WaitOn(t, testContainer.IsInState(ctx, apiClient, cID, "running")) + poll.WaitOn(t, testContainer.IsInState(ctx, apiClient, cID, container.StateRunning)) err = tc.doSth(ctx, cID) assert.NilError(t, err) @@ -281,5 +281,5 @@ func TestContainerRestartWithCancelledRequest(t *testing.T) { // Container should be restarted (running). inspect, err := apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) - assert.Check(t, is.Equal(inspect.State.Status, "running")) + assert.Check(t, is.Equal(inspect.State.Status, container.StateRunning)) } diff --git a/integration/container/stop_test.go b/integration/container/stop_test.go index beac1b9e1a..aa4d4b3f33 100644 --- a/integration/container/stop_test.go +++ b/integration/container/stop_test.go @@ -29,7 +29,7 @@ func TestStopContainerWithRestartPolicyAlways(t *testing.T) { } for _, name := range names { - poll.WaitOn(t, container.IsInState(ctx, apiClient, name, "running", "restarting")) + poll.WaitOn(t, container.IsInState(ctx, apiClient, name, containertypes.StateRunning, containertypes.StateRestarting)) } for _, name := range names { diff --git a/integration/container/update_test.go b/integration/container/update_test.go index e401f6b701..3025ab63a6 100644 --- a/integration/container/update_test.go +++ b/integration/container/update_test.go @@ -36,7 +36,7 @@ func TestUpdateRestartPolicy(t *testing.T) { timeout = 180 * time.Second } - poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited"), poll.WithTimeout(timeout)) + poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, containertypes.StateExited), poll.WithTimeout(timeout)) inspect, err := apiClient.ContainerInspect(ctx, cID) assert.NilError(t, err) diff --git a/integration/container/wait_test.go b/integration/container/wait_test.go index 4585880333..5f513332bd 100644 --- a/integration/container/wait_test.go +++ b/integration/container/wait_test.go @@ -42,7 +42,7 @@ func TestWaitNonBlocked(t *testing.T) { ctx := testutil.StartSpan(ctx, t) containerID := container.Run(ctx, t, cli, container.WithCmd("sh", "-c", tc.cmd)) - poll.WaitOn(t, container.IsInState(ctx, cli, containerID, "exited"), poll.WithTimeout(30*time.Second)) + poll.WaitOn(t, container.IsInState(ctx, cli, containerID, containertypes.StateExited), poll.WithTimeout(30*time.Second)) waitResC, errC := cli.ContainerWait(ctx, containerID, "") select { @@ -158,7 +158,7 @@ func TestWaitConditions(t *testing.T) { } info, _ := cli.ContainerInspect(ctx, containerID) - assert.Equal(t, "running", info.State.Status) + assert.Equal(t, info.State.Status, containertypes.StateRunning) _, err = streams.Conn.Write([]byte("\n")) assert.NilError(t, err) @@ -169,8 +169,8 @@ func TestWaitConditions(t *testing.T) { case waitRes := <-waitResC: assert.Check(t, is.Equal(int64(99), waitRes.StatusCode)) case <-time.After(StopContainerWindowsPollTimeout): - info, _ := cli.ContainerInspect(ctx, containerID) - t.Fatalf("Timed out waiting for container exit code (status = %q)", info.State.Status) + ctr, _ := cli.ContainerInspect(ctx, containerID) + t.Fatalf("Timed out waiting for container exit code (status = %q)", ctr.State.Status) } }) } diff --git a/integration/internal/container/states.go b/integration/internal/container/states.go index c75e729069..c1c3d5d86a 100644 --- a/integration/internal/container/states.go +++ b/integration/internal/container/states.go @@ -4,6 +4,7 @@ import ( "context" "strings" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" "github.com/docker/docker/errdefs" "github.com/pkg/errors" @@ -32,7 +33,7 @@ func IsStopped(ctx context.Context, apiClient client.APIClient, containerID stri } // IsInState verifies the container is in one of the specified state, e.g., "running", "exited", etc. -func IsInState(ctx context.Context, apiClient client.APIClient, containerID string, state ...string) func(log poll.LogT) poll.Result { +func IsInState(ctx context.Context, apiClient client.APIClient, containerID string, state ...container.ContainerState) func(log poll.LogT) poll.Result { return func(log poll.LogT) poll.Result { inspect, err := apiClient.ContainerInspect(ctx, containerID) if err != nil { @@ -58,13 +59,13 @@ func IsSuccessful(ctx context.Context, apiClient client.APIClient, containerID s if err != nil { return poll.Error(err) } - if inspect.State.Status == "exited" { + if inspect.State.Status == container.StateExited { if inspect.State.ExitCode == 0 { return poll.Success() } return poll.Error(errors.Errorf("expected exit code 0, got %d", inspect.State.ExitCode)) } - return poll.Continue("waiting for container to be \"exited\", currently %s", inspect.State.Status) + return poll.Continue("waiting for container to be %q, currently %s", container.StateExited, inspect.State.Status) } } diff --git a/integration/network/bridge/bridge_linux_test.go b/integration/network/bridge/bridge_linux_test.go index 9820189a4e..4fe7a71171 100644 --- a/integration/network/bridge/bridge_linux_test.go +++ b/integration/network/bridge/bridge_linux_test.go @@ -520,7 +520,7 @@ func TestPublishedPortAlreadyInUse(t *testing.T) { inspect, err := apiClient.ContainerInspect(ctx, ctr2) assert.NilError(t, err) - assert.Check(t, is.Equal(inspect.State.Status, "created")) + assert.Check(t, is.Equal(inspect.State.Status, containertypes.StateCreated)) } // TestAllPortMappingsAreReturned check that dual-stack ports mapped through