Files
podman/test/apiv2/26-containersWait.at
Paul Holzinger 768aaadca1 libpod API: only return exit code without conditions
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>
2024-10-15 18:31:36 +02:00

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"