diff --git a/api/server/router/container/container_routes.go b/api/server/router/container/container_routes.go index 057a7b0b52..6670b9ec68 100644 --- a/api/server/router/container/container_routes.go +++ b/api/server/router/container/container_routes.go @@ -346,6 +346,8 @@ func (s *containerRouter) postContainersWait(ctx context.Context, w http.Respons } if v := r.Form.Get("condition"); v != "" { switch container.WaitCondition(v) { + case container.WaitConditionNotRunning: + waitCondition = containerpkg.WaitConditionNotRunning case container.WaitConditionNextExit: waitCondition = containerpkg.WaitConditionNextExit case container.WaitConditionRemoved: diff --git a/integration/container/wait_test.go b/integration/container/wait_test.go index 990868fd35..6ac6b21299 100644 --- a/integration/container/wait_test.go +++ b/integration/container/wait_test.go @@ -101,3 +101,58 @@ func TestWaitBlocked(t *testing.T) { }) } } + +func TestWaitConditions(t *testing.T) { + defer setupTest(t)() + cli := request.NewAPIClient(t) + + testCases := []struct { + doc string + waitCond containertypes.WaitCondition + expectedCode int64 + }{ + { + doc: "default", + expectedCode: 99, + }, + { + doc: "not-running", + expectedCode: 99, + waitCond: containertypes.WaitConditionNotRunning, + }, + { + doc: "next-exit", + expectedCode: 99, + waitCond: containertypes.WaitConditionNextExit, + }, + { + doc: "removed", + expectedCode: 99, + waitCond: containertypes.WaitConditionRemoved, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.doc, func(t *testing.T) { + t.Parallel() + ctx := context.Background() + opts := []func(*container.TestContainerConfig){ + container.WithCmd("sh", "-c", "sleep 1; exit 99"), + } + if tc.waitCond == containertypes.WaitConditionRemoved { + opts = append(opts, container.WithAutoRemove) + } + containerID := container.Run(ctx, t, cli, opts...) + poll.WaitOn(t, container.IsInState(ctx, cli, containerID, "running"), poll.WithTimeout(30*time.Second), poll.WithDelay(100*time.Millisecond)) + + waitResC, errC := cli.ContainerWait(ctx, containerID, tc.waitCond) + select { + case err := <-errC: + assert.NilError(t, err) + case waitRes := <-waitResC: + assert.Check(t, is.Equal(tc.expectedCode, waitRes.StatusCode)) + } + }) + } +}