Ver código fonte

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 <github@gone.nl>
Sebastiaan van Stijn 3 anos atrás
pai
commit
0bce64f08d

+ 2 - 0
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:

+ 55 - 0
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))
+			}
+		})
+	}
+}