summaryrefslogtreecommitdiff
path: root/test/system/220-healthcheck.bats
diff options
context:
space:
mode:
Diffstat (limited to 'test/system/220-healthcheck.bats')
-rw-r--r--test/system/220-healthcheck.bats116
1 files changed, 116 insertions, 0 deletions
diff --git a/test/system/220-healthcheck.bats b/test/system/220-healthcheck.bats
new file mode 100644
index 000000000..e649ad3d2
--- /dev/null
+++ b/test/system/220-healthcheck.bats
@@ -0,0 +1,116 @@
+#!/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