podman/test/system/080-pause.bats

143 lines
5.5 KiB
Bash

#!/usr/bin/env bats -*- bats -*-
#
# tests for podman pause/unpause functionality
#
load helpers
load helpers.systemd
# bats test_tags=distro-integration, ci:parallel
@test "podman pause/unpause" {
if is_rootless && ! is_cgroupsv2; then
skip "'podman pause' (rootless) only works with cgroups v2"
fi
cname="c-$(safename)"
run_podman run -d --name $cname $IMAGE \
sh -c 'while :;do date +%s;sleep 1;done'
cid="$output"
# Wait for first time value
wait_for_output '[0-9]\{10,\}' $cid
# Pause container, sleep a bit, unpause, sleep again to give process
# time to write a new post-restart time value. Pause by CID, unpause
# by name, just to exercise code paths. While paused, check 'ps'
# and 'inspect', then check again after restarting.
run_podman --noout pause $cid
is "$output" "" "output should be empty"
run_podman inspect --format '{{.State.Status}}' $cid
is "$output" "paused" "podman inspect .State.Status"
sleep 3
run_podman ps -a --format '{{.ID}} {{.Names}} {{.Status}}'
assert "$output" =~ ".*${cid:0:12} $cname Paused.*" "podman ps on paused container"
run_podman unpause $cname
run_podman ps -a --format '{{.ID}} {{.Names}} {{.Status}}'
assert "$output" =~ ".*${cid:0:12} $cname Up .*" "podman ps on resumed container"
sleep 1
# Get full logs, and iterate through them computing delta_t between entries
run_podman logs $cid
i=1
max_delta=0
while [ $i -lt ${#lines[*]} ]; do
this_delta=$(( ${lines[$i]} - ${lines[$(($i - 1))]} ))
if [ $this_delta -gt $max_delta ]; then
max_delta=$this_delta
fi
i=$(( $i + 1 ))
done
# There should be a 3-4 second gap, *maybe* 5. Never 1 or 2, that
# would imply that the container never paused.
is "$max_delta" "[3456]" "delta t between paused and restarted"
run_podman rm -t 0 -f $cname
# Pause/unpause on nonexistent name or id - these should all fail
run_podman 125 pause $cid
assert "$output" =~ "no container with name or ID \"$cid\" found: no such container"
run_podman 125 pause $cname
assert "$output" =~ "no container with name or ID \"$cname\" found: no such container"
run_podman 125 unpause $cid
assert "$output" =~ "no container with name or ID \"$cid\" found: no such container"
run_podman 125 unpause $cname
assert "$output" =~ "no container with name or ID \"$cname\" found: no such container"
}
# CANNOT BE PARALLELIZED! (because of unpause --all)
# bats test_tags=distro-integration
@test "podman unpause --all" {
if is_rootless && ! is_cgroupsv2; then
skip "'podman pause' (rootless) only works with cgroups v2"
fi
cname="c-$(safename)"
cname_notrunning="c-notrunning-$(safename)"
run_podman create --name $cname_notrunning $IMAGE
run_podman run -d --name $cname $IMAGE sleep 100
cid="$output"
run_podman pause $cid
run_podman inspect --format '{{.State.Status}}' $cid
is "$output" "paused" "podman inspect .State.Status"
run_podman unpause --all
is "$output" "$cid" "podman unpause output"
run_podman ps --format '{{.ID}} {{.Names}} {{.Status}}'
is "$output" "${cid:0:12} $cname Up.*" "podman ps on resumed container"
run_podman rm -t 0 -f $cname $cname_notrunning
}
# bats test_tags=ci:parallel
@test "podman pause/unpause with HealthCheck interval" {
if is_rootless && ! is_cgroupsv2; then
skip "'podman pause' (rootless) only works with cgroups v2"
fi
local ctrname="c-$(safename)"
local msg="healthmsg-$(random_string)"
run_podman run -d --name $ctrname \
--health-cmd "echo $msg" \
--health-interval 1s \
$IMAGE /home/podman/pause
cid="$output"
run_podman healthcheck run $ctrname
is "$output" "" "output from 'podman healthcheck run'"
# We checking only timer because checking of service caused unexpected exit code 3 of systemctl status.
# Since the status check can be executed when HealthCheck was exited, this caused a termination error code 3
# for systemctl status. Because service was in dead state because HealthCheck exited.
# https://github.com/containers/podman/issues/25204
run -0 systemctl status $cid-*.timer
assert "$output" =~ "active" "service should be running"
run_podman --noout pause $ctrname
assert "$output" == "" "output should be empty"
run -0 systemctl status $cid-*.{service,timer}
assert "$output" == "" "service should not be running"
run_podman --noout unpause $ctrname
assert "$output" == "" "output should be empty"
run_podman healthcheck run $ctrname
is "$output" "" "output from 'podman healthcheck run'"
run -0 systemctl status $cid-*.timer
assert "$output" =~ "active" "service should be running"
run_podman rm -t 0 -f $ctrname
# Important check for https://github.com/containers/podman/issues/22884
# We never should leak the unit files, healthcheck uses the cid in name so just grep that.
# (Ignore .scope units, those are conmon and can linger for 5 minutes)
# (Ignore .mount, too. They are created/removed by systemd based on the actual real mounts
# on the host and that is async and might be slow enough in CI to cause failures.)
run -0 systemctl list-units --quiet "*$cid*"
except_scope_mount=$(grep -vF ".scope " <<<"$output" | { grep -vF ".mount" || true; } )
assert "$except_scope_mount" == "" "Healthcheck systemd unit cleanup: no units leaked"
}
# vim: filetype=sh