Files
podman/test/system/080-pause.bats
Paul Holzinger 247a80db45 test/system: remove distro-integration bats tag
The distro-integration tag was added for fedora openQA to only run a
subset of tests. However since it was added only a few new tests have
been labelled like that and in general a normal contributor or even
maintianer has no idea when to add this tag.

We also have been seeing several regressions getting into fedora that
these tests would have caught. As such I worked with Adam to enable all
tests for fedora openQA so we actually have proper coverage. This has
been working for a few weeks so I think we can dop these tags so
upstream does not need to bother with them at all.

https://pagure.io/fedora-qa/os-autoinst-distri-fedora/issue/373

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
2025-09-02 12:10:08 +02:00

142 lines
5.4 KiB
Bash

#!/usr/bin/env bats -*- bats -*-
#
# tests for podman pause/unpause functionality
#
load helpers
load helpers.systemd
# bats test_tags=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)
@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