From 0bce64f08d72147b0572f96ac678620d289b4499 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 27 Jun 2022 14:26:35 +0200 Subject: [PATCH] api: POST /containers/{id}/wait: fix validation for "condition" parameter commit 737e8c6ab81842d61d86df3efec5f505b5484d4c added validation for the wait condition parameter, however, the default ("not-running") option was not part of the list of valid options, resulting in a regression if the default value was explicitly passed; docker scan --accept-license --version Error response from daemon: invalid condition: "not-running" This patch adds the missing option, and adds a test to verify. With this patch; make BIND_DIR=. DOCKER_GRAPHDRIVER=vfs TEST_FILTER=TestWaitConditions test-integration ... --- PASS: TestWaitConditions (0.04s) --- PASS: TestWaitConditions/removed (1.79s) --- PASS: TestWaitConditions/default (1.91s) --- PASS: TestWaitConditions/next-exit (1.97s) --- PASS: TestWaitConditions/not-running (1.99s) PASS Signed-off-by: Sebastiaan van Stijn --- .../router/container/container_routes.go | 2 + integration/container/wait_test.go | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+) 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)) + } + }) + } +}