mirror of
https://github.com/containers/podman
synced 2024-10-21 01:34:37 +00:00
116 lines
2.7 KiB
Plaintext
116 lines
2.7 KiB
Plaintext
|
#!/usr/bin/env bats -*- bats -*-
|
||
|
#
|
||
|
# tests for podman healthcheck
|
||
|
#
|
||
|
#
|
||
|
|
||
|
load helpers
|
||
|
|
||
|
|
||
|
# Helper function: run 'podman inspect' and check various given fields
|
||
|
function _check_health {
|
||
|
local testname="$1"
|
||
|
local tests="$2"
|
||
|
|
||
|
run_podman inspect --format json healthcheck_c
|
||
|
|
||
|
parse_table "$tests" | while read field expect;do
|
||
|
# (kludge to deal with parse_table and empty strings)
|
||
|
if [ "$expect" = "''" ]; then expect=""; fi
|
||
|
|
||
|
actual=$(jq -r ".[0].State.Healthcheck.$field" <<<"$output")
|
||
|
is "$actual" "$expect" "$testname - .State.Healthcheck.$field"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
|
||
|
@test "podman healthcheck" {
|
||
|
# Create an image with a healthcheck script; said script will
|
||
|
# pass until the file /uh-oh gets created (by us, via exec)
|
||
|
cat >${PODMAN_TMPDIR}/healthcheck <<EOF
|
||
|
#!/bin/sh
|
||
|
|
||
|
if test -e /uh-oh; then
|
||
|
echo "Uh-oh on stdout!"
|
||
|
echo "Uh-oh on stderr!" >&2
|
||
|
exit 1
|
||
|
else
|
||
|
echo "Life is Good on stdout"
|
||
|
echo "Life is Good on stderr" >&2
|
||
|
exit 0
|
||
|
fi
|
||
|
EOF
|
||
|
|
||
|
cat >${PODMAN_TMPDIR}/entrypoint <<EOF
|
||
|
#!/bin/sh
|
||
|
|
||
|
while :; do
|
||
|
sleep 1
|
||
|
done
|
||
|
EOF
|
||
|
|
||
|
cat >${PODMAN_TMPDIR}/Containerfile <<EOF
|
||
|
FROM $IMAGE
|
||
|
|
||
|
COPY healthcheck /healthcheck
|
||
|
COPY entrypoint /entrypoint
|
||
|
|
||
|
RUN chmod 755 /healthcheck /entrypoint
|
||
|
|
||
|
CMD ["/entrypoint"]
|
||
|
EOF
|
||
|
|
||
|
run_podman build -t healthcheck_i ${PODMAN_TMPDIR}
|
||
|
|
||
|
# Run that healthcheck image.
|
||
|
run_podman run -d --name healthcheck_c \
|
||
|
--health-cmd /healthcheck \
|
||
|
--health-interval 1s \
|
||
|
--health-retries 3 \
|
||
|
healthcheck_i
|
||
|
|
||
|
# We can't check for 'starting' because a 1-second interval is too
|
||
|
# short; it could run healthcheck before we get to our first check.
|
||
|
#
|
||
|
# So, just force a healthcheck run, then confirm that it's running.
|
||
|
run_podman healthcheck run healthcheck_c
|
||
|
is "$output" "healthy" "output from 'podman healthcheck run'"
|
||
|
|
||
|
_check_health "All healthy" "
|
||
|
Status | healthy
|
||
|
FailingStreak | 0
|
||
|
Log[-1].ExitCode | 0
|
||
|
Log[-1].Output |
|
||
|
"
|
||
|
|
||
|
# Force a failure
|
||
|
run_podman exec healthcheck_c touch /uh-oh
|
||
|
sleep 2
|
||
|
|
||
|
_check_health "First failure" "
|
||
|
Status | healthy
|
||
|
FailingStreak | [123]
|
||
|
Log[-1].ExitCode | 1
|
||
|
Log[-1].Output |
|
||
|
"
|
||
|
|
||
|
# After three successive failures, container should no longer be healthy
|
||
|
sleep 5
|
||
|
_check_health "Three or more failures" "
|
||
|
Status | unhealthy
|
||
|
FailingStreak | [3456]
|
||
|
Log[-1].ExitCode | 1
|
||
|
Log[-1].Output |
|
||
|
"
|
||
|
|
||
|
# healthcheck should now fail, with exit status 1 and 'unhealthy' output
|
||
|
run_podman 1 healthcheck run healthcheck_c
|
||
|
is "$output" "unhealthy" "output from 'podman healthcheck run'"
|
||
|
|
||
|
# Clean up
|
||
|
run_podman rm -f healthcheck_c
|
||
|
run_podman rmi healthcheck_i
|
||
|
}
|
||
|
|
||
|
# vim: filetype=sh
|