Merge pull request #15481 from edsantiago/test_cleanup_apiv2

APIv2 test cleanup, part 2 of 2
This commit is contained in:
OpenShift Merge Robot 2022-08-29 07:08:51 -04:00 committed by GitHub
commit cf20e6ed39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 58 additions and 79 deletions

View File

@ -3,9 +3,6 @@
# Tests for more image-related endpoints # Tests for more image-related endpoints
# #
red='\e[31m'
nc='\e[0m'
start_registry start_registry
podman pull -q $IMAGE podman pull -q $IMAGE
@ -63,7 +60,9 @@ podman pull -q $IMAGE
# test podman image SCP # test podman image SCP
# ssh needs to work so we can validate that the failure is past argument parsing # ssh needs to work so we can validate that the failure is past argument parsing
podman system connection add --default test ssh://$USER@localhost/run/user/$MYUID/podman/podman.sock conn=apiv2test-temp-connection
podman system connection add --default $conn \
ssh://$USER@localhost/run/user/$UID/podman/podman.sock
# should fail but need to check the output... # should fail but need to check the output...
# status 125 here means that the save/load fails due to # status 125 here means that the save/load fails due to
# cirrus weirdness with exec.Command. All of the args have been parsed successfully. # cirrus weirdness with exec.Command. All of the args have been parsed successfully.
@ -72,4 +71,7 @@ t POST "libpod/images/scp/$IMAGE?destination=QA::" 500 \
t DELETE libpod/images/$IMAGE 200 \ t DELETE libpod/images/$IMAGE 200 \
.ExitCode=0 .ExitCode=0
# Clean up
podman system connection rm $conn
stop_registry stop_registry

View File

@ -3,9 +3,6 @@
# test more container-related endpoints # test more container-related endpoints
# #
red='\e[31m'
nc='\e[0m'
podman pull $IMAGE &>/dev/null podman pull $IMAGE &>/dev/null
# Ensure clean slate # Ensure clean slate

View File

@ -3,9 +3,6 @@
# test more container-related endpoints # test more container-related endpoints
# #
red='\e[31m'
nc='\e[0m'
podman pull "${IMAGE}" &>/dev/null podman pull "${IMAGE}" &>/dev/null
# Ensure clean slate # Ensure clean slate
@ -21,29 +18,29 @@ t POST "containers/${CTR}/wait?condition=non-existent-cond" 400
t POST "containers/${CTR}/wait?condition=not-running" 200 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 \ t POST "containers/${CTR}/wait?condition=next-exit" 200 \
.StatusCode=0 \ .StatusCode=0 \
.Error=null & .Error=null
child_pid=$!
podman start "${CTR}"
wait "${child_pid}" wait "${child_pid}"
# Test that headers are sent before body. (We should actually never get a body)
# check if headers are sent in advance before body APIV2_TEST_EXPECT_TIMEOUT=2 t POST "containers/${CTR}/wait?condition=next-exit" 999
WAIT_TEST_ERROR="" like "$(<$WORKDIR/curl.headers.out)" ".*HTTP.* 200 OK.*" \
curl -I -X POST "http://$HOST:$PORT/containers/${CTR}/wait?condition=next-exit" &> "/dev/null" & "Received headers from /wait"
child_pid=$! if [[ -e $WORKDIR/curl.result.out ]]; then
sleep 0.5 _show_ok 0 "UNEXPECTED: curl on /wait returned results"
if kill -2 "${child_pid}" 2> "/dev/null"; then
echo -e "${red}NOK: Failed to get response headers immediately.${nc}" 1>&2;
WAIT_TEST_ERROR="1"
fi fi
t POST "containers/${CTR}/wait?condition=removed" 200 & # Test waiting for REMOVE. Like above, start a background trigger.
(sleep 2;podman container rm "${CTR}") &
child_pid=$! child_pid=$!
podman container rm "${CTR}"
t POST "containers/${CTR}/wait?condition=removed" 200 \
.StatusCode=0 \
.Error=null
wait "${child_pid}" wait "${child_pid}"
if [[ "${WAIT_TEST_ERROR}" ]] ; then
exit 1;
fi

View File

@ -134,23 +134,17 @@ t GET libpod/pods/json?filters='{"label":["testl' 400 \
t DELETE libpod/pods/foo 200 t DELETE libpod/pods/foo 200
t DELETE "libpod/pods/foo (pod has already been deleted)" 404 t DELETE "libpod/pods/foo (pod has already been deleted)" 404
t_timeout 5 GET "libpod/pods/stats?stream=true&delay=1" 200 # Expect this to time out
APIV2_TEST_EXPECT_TIMEOUT=5 t GET "libpod/pods/stats?stream=true&delay=1" 999
podman pod create --name=specgen podman pod create --name=specgen
TMPD=$(mktemp -d podman-apiv2-test.build.XXXXXXXX) TMPD=$(mktemp -d podman-apiv2-test.build.XXXXXXXX)
podman generate spec -f ${TMPD}/input.txt -c specgen podman generate spec -f ${TMPD}/myspec.json -c specgen
curl -XPOST -o ${TMPD}/response.txt --dump-header ${TMPD}/headers.txt -H content-type:application/json http://$HOST:$PORT/v4.0.0/libpod/pods/create -d "@${TMPD}/input.txt" t POST libpod/pods/create ${TMPD}/myspec.json 201 \
.Id~[0-9a-f]\\{64\\}
if ! grep -q '201 Created' "${TMPD}/headers.txt"; then
cat "${TMPD}/headers.txt"
cat "${TMPD}/response.txt"
echo -e "${red}NOK: pod create failed"
rm -rf $TMPD
exit 1
fi
rm -rf $TMPD rm -rf $TMPD

View File

@ -33,18 +33,8 @@ RUN touch /foo
EOF EOF
tar --format=posix -C $TMPD -cvf ${CONTAINERFILE_TAR} containerfile &> /dev/null tar --format=posix -C $TMPD -cvf ${CONTAINERFILE_TAR} containerfile &> /dev/null
curl -XPOST --data-binary @<(cat $CONTAINERFILE_TAR) \ t POST "/build?dockerfile=containerfile&t=$tag" $CONTAINERFILE_TAR 200 \
-H "content-type: application/x-tar" \ .stream~".*Successfully tagged .*"
--dump-header "${TMPD}/headers.txt" \
-o "${TMPD}/response.txt" \
"http://$HOST:$PORT/build?dockerfile=containerfile&t=$tag" &> /dev/null
if ! grep -q '200 OK' "${TMPD}/headers.txt"; then
cat "${TMPD}/headers.txt"
cat "${TMPD}/response.txt"
echo -e "${red}NOK: Image build from tar failed response was not 200 OK (application/x-tar)"
exit 1
fi
rm -rf $TMPD rm -rf $TMPD
t DELETE "images/$fqn" 200 t DELETE "images/$fqn" 200

View File

@ -46,6 +46,9 @@ with POST parameters if present, and compares return status and
| +----------- POST params | +----------- POST params
+--------------------------------- note the missing slash +--------------------------------- note the missing slash
Never, ever, ever, seriously _EVER_ `exit` from a test. Just don't.
That skips cleanup, and leaves the system in a broken state.
Notes: Notes:
* If the endpoint has a leading slash (`/_ping`), `t` leaves it unchanged. * If the endpoint has a leading slash (`/_ping`), `t` leaves it unchanged.
@ -61,14 +64,19 @@ of POST parameters in the form 'key=value', separated by spaces:
`t` will convert the param list to JSON form for passing to the server. `t` will convert the param list to JSON form for passing to the server.
A numeric status code terminates processing of POST parameters. A numeric status code terminates processing of POST parameters.
** As a special case, when one POST argument is a string ending in `.tar`, ** As a special case, when one POST argument is a string ending in `.tar`,
`t` will invoke `curl` with `--data-binary @PATH` and `.yaml`, or `.json`, `t` will invoke `curl` with `--data-binary @PATH` and
set `Content-type: application/x-tar`. This is useful for `build` endpoints. set `Content-type` as appropriate. This is useful for `build` endpoints.
(To override `Content-type`, simply pass along an extra string argument (To override `Content-type`, simply pass along an extra string argument
matching `application/*`): matching `application/*`):
t POST myentrypoint /mytmpdir/myfile.tar application/foo 400 t POST myentrypoint /mytmpdir/myfile.tar application/foo 400
** Like above, when using PUT, `t` does `--upload-time` instead of
`--data-binary`
* The final arguments are one or more expected string results. If an * The final arguments are one or more expected string results. If an
argument starts with a dot, `t` will invoke `jq` on the output to argument starts with a dot, `t` will invoke `jq` on the output to
fetch that field, and will compare it to the right-hand side of fetch that field, and will compare it to the right-hand side of
the argument. If the separator is `=` (equals), `t` will require the argument. If the separator is `=` (equals), `t` will require
an exact match; if `~` (tilde), `t` will use `expr` to compare. an exact match; if `~` (tilde), `t` will use `expr` to compare.
* If your test expects `curl` to time out:
APIV2_TEST_EXPECT_TIMEOUT=5 t POST /foo 999

View File

@ -23,8 +23,6 @@ REGISTRY_IMAGE="${PODMAN_TEST_IMAGE_REGISTRY}/${PODMAN_TEST_IMAGE_USER}/registry
############################################################################### ###############################################################################
# BEGIN setup # BEGIN setup
USER=$PODMAN_ROOTLESS_USER
MYUID=$PODMAN_ROOTLESS_UID
TMPDIR=${TMPDIR:-/tmp} TMPDIR=${TMPDIR:-/tmp}
WORKDIR=$(mktemp --tmpdir -d $ME.tmp.XXXXXX) WORKDIR=$(mktemp --tmpdir -d $ME.tmp.XXXXXX)
@ -56,9 +54,6 @@ fi
# Path to podman binary # Path to podman binary
PODMAN_BIN=${PODMAN:-${CONTAINERS_HELPER_BINARY_DIR}/podman} PODMAN_BIN=${PODMAN:-${CONTAINERS_HELPER_BINARY_DIR}/podman}
# Timeout for streamed responses
CURL_TIMEOUT=0
# Cleanup handlers # Cleanup handlers
clean_up_server() { clean_up_server() {
if [ -n "$service_pid" ]; then if [ -n "$service_pid" ]; then
@ -220,21 +215,6 @@ function jsonify() {
(IFS=','; echo "{${settings_out[*]}}") (IFS=','; echo "{${settings_out[*]}}")
} }
#######
# t_timeout # Timeout wrapper for test helper
#######
function t_timeout() {
CURL_TIMEOUT=$1; shift
local min_runtime=$((CURL_TIMEOUT - 1))
start=`date +%s`
t $@
local end=`date +%s`
local runtime=$((end-start))
if ! [[ "$runtime" -ge "$min_runtime" ]]; then
die "Error: Streaming time should be greater or equal to '$min_runtime'"
fi
}
####### #######
# t # Main test helper # t # Main test helper
####### #######
@ -246,11 +226,6 @@ function t() {
local testname="$method $path" local testname="$method $path"
if [[ $CURL_TIMEOUT != 0 ]]; then
local c_timeout=$CURL_TIMEOUT
curl_args+=("-m $CURL_TIMEOUT")
CURL_TIMEOUT=0 # 'consume' timeout
fi
# POST and PUT requests may be followed by one or more key=value pairs. # POST and PUT requests may be followed by one or more key=value pairs.
# Slurp the command line until we see a 3-digit status code. # Slurp the command line until we see a 3-digit status code.
if [[ $method = "POST" || $method == "PUT" || $method = "DELETE" ]]; then if [[ $method = "POST" || $method == "PUT" || $method = "DELETE" ]]; then
@ -312,6 +287,11 @@ function t() {
curl_args+=("--head") curl_args+=("--head")
fi fi
# If this is set, we're *expecting* curl to time out
if [[ -n "$APIV2_TEST_EXPECT_TIMEOUT" ]]; then
curl_args+=("-m" $APIV2_TEST_EXPECT_TIMEOUT)
fi
local expected_code=$1; shift local expected_code=$1; shift
# Log every action we do # Log every action we do
@ -327,8 +307,19 @@ function t() {
--write-out '%{http_code}^%{content_type}^%{time_total}' \ --write-out '%{http_code}^%{content_type}^%{time_total}' \
-o $WORKDIR/curl.result.out "$url"); rc=$?; } || : -o $WORKDIR/curl.result.out "$url"); rc=$?; } || :
# Special case: this means we *expect and want* a timeout
if [[ -n "$APIV2_TEST_EXPECT_TIMEOUT" ]]; then
# Hardcoded. See curl(1) for list of exit codes
if [[ $rc -eq 28 ]]; then
_show_ok 1 "$testname: curl timed out (expected)"
else
_show_ok 0 "$testname: expected curl to time out; it did not"
fi
return
fi
# Any error from curl is instant bad news, from which we can't recover # Any error from curl is instant bad news, from which we can't recover
if [[ $rc -ne 0 ]] && [[ $c_timeout -eq 0 ]]; then if [[ $rc -ne 0 ]]; then
die "curl failure ($rc) on $url - cannot continue" die "curl failure ($rc) on $url - cannot continue"
fi fi