api: POST /containers/{id}/wait: fix validation for "condition" parameter

commit 737e8c6ab8 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 <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2022-06-27 14:26:35 +02:00
parent 4eb1c5bd52
commit 0bce64f08d
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
2 changed files with 57 additions and 0 deletions

View File

@ -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:

View File

@ -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))
}
})
}
}