diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-07-06 17:15:26 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-06 17:15:26 -0400 |
commit | 1a93857acc4ee1e5a9213e2c22f12802d84cd277 (patch) | |
tree | d3f8c923e0750fa4aa5ed423dca52640a8ff187c /test | |
parent | b1cc781c68964dff3ee4a00ef7ce71f56ae69e7c (diff) | |
parent | 10ad46eb7377ff504a65783a7a604b248b50f20a (diff) | |
download | podman-1a93857acc4ee1e5a9213e2c22f12802d84cd277.tar.gz podman-1a93857acc4ee1e5a9213e2c22f12802d84cd277.tar.bz2 podman-1a93857acc4ee1e5a9213e2c22f12802d84cd277.zip |
Merge pull request #6693 from goochjj/libpod-sd-notify-cmdline
Implement --sdnotify cmdline option to control sd-notify behavior
Diffstat (limited to 'test')
-rw-r--r-- | test/system/260-sdnotify.bats | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/test/system/260-sdnotify.bats b/test/system/260-sdnotify.bats new file mode 100644 index 000000000..c37eea15a --- /dev/null +++ b/test/system/260-sdnotify.bats @@ -0,0 +1,142 @@ +#!/usr/bin/env bats -*- bats -*- +# +# Tests for systemd sdnotify +# + +load helpers + +# Shared throughout this module: PID of socat process, and path to its log +_SOCAT_PID= +_SOCAT_LOG= + +function setup() { + skip_if_remote + + # TODO: remove this once CI systems have newer crun and container-selinux + skip "TEMPORARY SKIP - until CI systems get new crun, container-selinux" + + basic_setup +} + +function teardown() { + unset NOTIFY_SOCKET + + _stop_socat + + basic_teardown +} + +############################################################################### +# BEGIN helpers + +# Run socat process on a socket, logging to well-known path. Each received +# packet is logged with a newline appended, for ease of parsing the log file. +function _start_socat() { + _SOCAT_LOG="$PODMAN_TMPDIR/socat.log" + + rm -f $_SOCAT_LOG + socat unix-recvfrom:"$NOTIFY_SOCKET",fork \ + system:"(cat;echo) >> $_SOCAT_LOG" & + _SOCAT_PID=$! +} + +# Stop the socat background process and clean up logs +function _stop_socat() { + if [[ -n "$_SOCAT_PID" ]]; then + kill $_SOCAT_PID + fi + _SOCAT_PID= + + if [[ -n "$_SOCAT_LOG" ]]; then + rm -f $_SOCAT_LOG + fi +} + +# Check that MAINPID=xxxxx points to a running conmon process +function _assert_mainpid_is_conmon() { + local mainpid=$(expr "$1" : "MAINPID=\([0-9]\+\)") + test -n "$mainpid" || die "Could not parse '$1' as 'MAINPID=nnnn'" + + test -d /proc/$mainpid || die "sdnotify MAINPID=$mainpid - but /proc/$mainpid does not exist" + + # e.g. /proc/12345/exe -> /usr/bin/conmon + local mainpid_bin=$(readlink /proc/$mainpid/exe) + is "$mainpid_bin" ".*/conmon" "sdnotify MAINPID=$mainpid is conmon process" +} + +# END helpers +############################################################################### +# BEGIN tests themselves + +@test "sdnotify : ignore" { + export NOTIFY_SOCKET=$PODMAN_TMPDIR/ignore.sock + _start_socat + + run_podman 1 run --rm --sdnotify=ignore $IMAGE printenv NOTIFY_SOCKET + is "$output" "" "\$NOTIFY_SOCKET in container" + + is "$(< $_SOCAT_LOG)" "" "nothing received on socket" + _stop_socat +} + +@test "sdnotify : conmon" { + export NOTIFY_SOCKET=$PODMAN_TMPDIR/conmon.sock + _start_socat + + run_podman run -d --name sdnotify_conmon_c \ + --sdnotify=conmon \ + $IMAGE \ + sh -c 'printenv NOTIFY_SOCKET;echo READY;while ! test -f /stop;do sleep 0.1;done' + cid="$output" + wait_for_ready $cid + + run_podman logs sdnotify_conmon_c + is "$output" "READY" "\$NOTIFY_SOCKET in container" + + run cat $_SOCAT_LOG + is "${lines[-1]}" "READY=1" "final output from sdnotify" + + _assert_mainpid_is_conmon "${lines[0]}" + + # Done. Stop container, clean up. + run_podman exec $cid touch /stop + run_podman rm $cid + _stop_socat +} + +@test "sdnotify : container" { + # Sigh... we need to pull a humongous image because it has systemd-notify. + # FIXME: is there a smaller image we could use? + _FEDORA=registry.fedoraproject.org/fedora:latest + + # Pull that image. Retry in case of flakes. + run_podman pull $_FEDORA || \ + run_podman pull $_FEDORA || \ + run_podman pull $_FEDORA + + export NOTIFY_SOCKET=$PODMAN_TMPDIR/container.sock + _start_socat + + run_podman run -d --sdnotify=container $_FEDORA \ + sh -c 'printenv NOTIFY_SOCKET;echo READY;systemd-notify --ready;while ! test -f /stop;do sleep 0.1;done' + cid="$output" + wait_for_ready $cid + + run_podman logs $cid + is "${lines[0]}" "/.*/container\.sock/notify" "NOTIFY_SOCKET is passed to container" + + # With container, READY=1 isn't necessarily the last message received; + # just look for it anywhere in received messages + run cat $_SOCAT_LOG + is "$output" ".*READY=1" "received READY=1 through notify socket" + + _assert_mainpid_is_conmon "${lines[0]}" + + # Done. Stop container, clean up. + run_podman exec $cid touch /stop + run_podman rm $cid + run_podman rmi $_FEDORA + _stop_socat +} + +# vim: filetype=sh |