mirror of
https://github.com/containers/podman.git
synced 2025-08-06 11:32:07 +08:00

The special handling to return the exit code after the container has been removed should only be done if there are no special conditions requested. If a user asked for running or nay other state returning the exit code immediately with a success response is just wrong. We only want to allow that so the remote client can fetch the exit code without races. Fixes b3829a2932 ("libpod API: make wait endpoint better against rm races") Signed-off-by: Paul Holzinger <pholzing@redhat.com>
67 lines
2.1 KiB
Bash
67 lines
2.1 KiB
Bash
# -*- sh -*-
|
|
#
|
|
# test more container-related endpoints
|
|
#
|
|
|
|
podman pull "${IMAGE}" &>/dev/null
|
|
|
|
# Ensure clean slate
|
|
podman rm -a -f &>/dev/null
|
|
|
|
CTR="WaitTestingCtr"
|
|
|
|
t POST "containers/nonExistent/wait?condition=next-exit" 404
|
|
|
|
# Make sure to test a non-zero exit code (see #18889)
|
|
podman create --name "${CTR}" "${IMAGE}" sh -c "exit 3"
|
|
|
|
t GET libpod/containers/${CTR}/json 200 \
|
|
.Id~[0-9a-f]\\{64\\}
|
|
|
|
# We need the cid for the wait test at the end
|
|
cid=$(jq -r '.Id' <<<"$output")
|
|
|
|
t POST "containers/${CTR}/wait?condition=non-existent-cond" 400
|
|
|
|
t POST "containers/${CTR}/wait?condition=not-running" 200
|
|
|
|
# Test waiting for EXIT (need to start a background trigger first)
|
|
(sleep 2;podman start "${CTR}") &
|
|
child_pid=$!
|
|
|
|
# This will block until the background job completes
|
|
t POST "containers/${CTR}/wait?condition=next-exit" 200 \
|
|
.StatusCode=3 \
|
|
.Error=null
|
|
wait "${child_pid}"
|
|
|
|
# Test that headers are sent before body. (We should actually never get a body)
|
|
APIV2_TEST_EXPECT_TIMEOUT=2 t POST "containers/${CTR}/wait?condition=next-exit" 999
|
|
like "$(<$WORKDIR/curl.headers.out)" ".*HTTP.* 200 OK.*" \
|
|
"Received headers from /wait"
|
|
if [[ -s $WORKDIR/curl.result.out ]]; then
|
|
_show_ok 0 "UNEXPECTED: curl on /wait returned results"
|
|
fi
|
|
|
|
# Test waiting for REMOVE. Like above, start a background trigger.
|
|
(sleep 2;podman container rm "${CTR}") &
|
|
child_pid=$!
|
|
|
|
t POST "containers/${CTR}/wait?condition=removed" 200 \
|
|
.StatusCode=3 \
|
|
.Error=null
|
|
# Make sure the container has really been removed after waiting for
|
|
# "condition=removed". This check is racy but should flake in case it doesn't
|
|
# work correctly.
|
|
t POST "containers/${CTR}/wait?condition=next-exit" 404
|
|
wait "${child_pid}"
|
|
|
|
t POST "libpod/containers/${CTR}/wait?condition=running" 404
|
|
t POST "libpod/containers/${cid}/wait?condition=running" 404
|
|
# The container no longer exists but we want to ensure the remote client
|
|
# can still fetch the exit code correctly until the exit code is pruned
|
|
# (after 5 mins) but only by the container id and not the name.
|
|
t POST "libpod/containers/${CTR}/wait" 404
|
|
t POST "libpod/containers/${cid}/wait" 200 \
|
|
"3"
|