Merge pull request #10995 from edsantiago/systemd_ephemeral

system tests: cleaner, safer use of systemd
This commit is contained in:
OpenShift Merge Robot
2021-07-20 12:42:24 -04:00
committed by GitHub
4 changed files with 54 additions and 65 deletions

View File

@ -4,17 +4,10 @@
# #
load helpers load helpers
load helpers.systemd
SERVICE_NAME="podman_test_$(random_string)" SERVICE_NAME="podman_test_$(random_string)"
SYSTEMCTL="systemctl"
UNIT_DIR="/usr/lib/systemd/system"
if is_rootless; then
UNIT_DIR="$HOME/.config/systemd/user"
mkdir -p $UNIT_DIR
SYSTEMCTL="$SYSTEMCTL --user"
fi
UNIT_FILE="$UNIT_DIR/$SERVICE_NAME.service" UNIT_FILE="$UNIT_DIR/$SERVICE_NAME.service"
function setup() { function setup() {
@ -24,38 +17,28 @@ function setup() {
} }
function teardown() { function teardown() {
run '?' $SYSTEMCTL stop "$SERVICE_NAME" run '?' systemctl stop "$SERVICE_NAME"
rm -f "$UNIT_FILE" rm -f "$UNIT_FILE"
$SYSTEMCTL daemon-reload systemctl daemon-reload
run_podman rmi -a run_podman rmi -a
basic_teardown basic_teardown
} }
# Helper to setup xdg runtime for rootless
function xdg_rootless() {
# podman initializes this if unset, but systemctl doesn't
if is_rootless; then
if [ -z "$XDG_RUNTIME_DIR" ]; then
export XDG_RUNTIME_DIR=/run/user/$(id -u)
fi
fi
}
# Helper to start a systemd service running a container # Helper to start a systemd service running a container
function service_setup() { function service_setup() {
run_podman generate systemd --new $cname run_podman generate systemd --new $cname
echo "$output" > "$UNIT_FILE" echo "$output" > "$UNIT_FILE"
run_podman rm $cname run_podman rm $cname
$SYSTEMCTL daemon-reload systemctl daemon-reload
run $SYSTEMCTL start "$SERVICE_NAME" run systemctl start "$SERVICE_NAME"
if [ $status -ne 0 ]; then if [ $status -ne 0 ]; then
die "Error starting systemd unit $SERVICE_NAME, output: $output" die "Error starting systemd unit $SERVICE_NAME, output: $output"
fi fi
run $SYSTEMCTL status "$SERVICE_NAME" run systemctl status "$SERVICE_NAME"
if [ $status -ne 0 ]; then if [ $status -ne 0 ]; then
die "Non-zero status of systemd unit $SERVICE_NAME, output: $output" die "Non-zero status of systemd unit $SERVICE_NAME, output: $output"
fi fi
@ -63,20 +46,18 @@ function service_setup() {
# Helper to stop a systemd service running a container # Helper to stop a systemd service running a container
function service_cleanup() { function service_cleanup() {
run $SYSTEMCTL stop "$SERVICE_NAME" run systemctl stop "$SERVICE_NAME"
if [ $status -ne 0 ]; then if [ $status -ne 0 ]; then
die "Error stopping systemd unit $SERVICE_NAME, output: $output" die "Error stopping systemd unit $SERVICE_NAME, output: $output"
fi fi
rm -f "$UNIT_FILE" rm -f "$UNIT_FILE"
$SYSTEMCTL daemon-reload systemctl daemon-reload
} }
# These tests can fail in dev. environment because of SELinux. # These tests can fail in dev. environment because of SELinux.
# quick fix: chcon -t container_runtime_exec_t ./bin/podman # quick fix: chcon -t container_runtime_exec_t ./bin/podman
@test "podman generate - systemd - basic" { @test "podman generate - systemd - basic" {
xdg_rootless
cname=$(random_string) cname=$(random_string)
# See #7407 for --pull=always. # See #7407 for --pull=always.
run_podman create --pull=always --name $cname --label "io.containers.autoupdate=registry" $IMAGE top run_podman create --pull=always --name $cname --label "io.containers.autoupdate=registry" $IMAGE top
@ -100,8 +81,6 @@ function service_cleanup() {
} }
@test "podman autoupdate local" { @test "podman autoupdate local" {
xdg_rootless
cname=$(random_string) cname=$(random_string)
run_podman create --name $cname --label "io.containers.autoupdate=local" $IMAGE top run_podman create --name $cname --label "io.containers.autoupdate=local" $IMAGE top
@ -128,8 +107,6 @@ function service_cleanup() {
# These tests can fail in dev. environment because of SELinux. # These tests can fail in dev. environment because of SELinux.
# quick fix: chcon -t container_runtime_exec_t ./bin/podman # quick fix: chcon -t container_runtime_exec_t ./bin/podman
@test "podman generate systemd - envar" { @test "podman generate systemd - envar" {
xdg_rootless
cname=$(random_string) cname=$(random_string)
FOO=value BAR=%s run_podman create --name $cname --env FOO -e BAR --env MYVAR=myval \ FOO=value BAR=%s run_podman create --name $cname --env FOO -e BAR --env MYVAR=myval \
$IMAGE sh -c 'printenv && sleep 100' $IMAGE sh -c 'printenv && sleep 100'

View File

@ -4,21 +4,12 @@
# #
load helpers load helpers
load helpers.systemd
DASHUSER=""
UNIT_DIR="/run/systemd/system"
SNAME_FILE=$BATS_TMPDIR/services SNAME_FILE=$BATS_TMPDIR/services
function setup() { function setup() {
skip_if_remote "systemd tests are meaningless over remote" skip_if_remote "systemd tests are meaningless over remote"
if is_rootless; then
test -n "${XDG_RUNTIME_DIR}" || skip "\$XDG_RUNTIME_DIR is unset"
UNIT_DIR="${XDG_RUNTIME_DIR}/systemd/user"
mkdir -p $UNIT_DIR
# Why isn't systemd smart enough to figure this out on its own?
DASHUSER="--user"
fi
basic_setup basic_setup
} }
@ -26,10 +17,10 @@ function teardown() {
while read line; do while read line; do
if [[ "$line" =~ "podman-auto-update" ]]; then if [[ "$line" =~ "podman-auto-update" ]]; then
echo "Stop timer: $line.timer" echo "Stop timer: $line.timer"
systemctl $DASHUSER stop $line.timer systemctl stop $line.timer
systemctl $DASHUSER disable $line.timer systemctl disable $line.timer
else else
systemctl $DASHUSER stop $line systemctl stop $line
fi fi
rm -f $UNIT_DIR/$line.{service,timer} rm -f $UNIT_DIR/$line.{service,timer}
done < $SNAME_FILE done < $SNAME_FILE
@ -69,9 +60,9 @@ function generate_service() {
echo "container-$cname" >> $SNAME_FILE echo "container-$cname" >> $SNAME_FILE
run_podman rm -f $cname run_podman rm -f $cname
systemctl $DASHUSER daemon-reload systemctl daemon-reload
systemctl $DASHUSER start container-$cname systemctl start container-$cname
systemctl $DASHUSER status container-$cname systemctl status container-$cname
# Original image ID. # Original image ID.
# IMPORTANT: variable 'ori_image' is passed (out of scope) up to caller! # IMPORTANT: variable 'ori_image' is passed (out of scope) up to caller!
@ -84,7 +75,7 @@ function _wait_service_ready() {
local timeout=6 local timeout=6
while [[ $timeout -gt 1 ]]; do while [[ $timeout -gt 1 ]]; do
if systemctl $DASHUSER -q is-active $sname; then if systemctl -q is-active $sname; then
return return
fi fi
sleep 1 sleep 1
@ -92,7 +83,7 @@ function _wait_service_ready() {
done done
# Print serivce status as debug information before failed the case # Print serivce status as debug information before failed the case
systemctl $DASHUSER status $sname systemctl status $sname
die "Timed out waiting for $sname to start" die "Timed out waiting for $sname to start"
} }
@ -267,14 +258,14 @@ WantedBy=multi-user.target default.target
EOF EOF
echo "podman-auto-update-$cname" >> $SNAME_FILE echo "podman-auto-update-$cname" >> $SNAME_FILE
systemctl $DASHUSER enable --now podman-auto-update-$cname.timer systemctl enable --now podman-auto-update-$cname.timer
systemctl $DASHUSER list-timers --all systemctl list-timers --all
local expect='Finished Podman auto-update testing service' local expect='Finished Podman auto-update testing service'
local failed_start=failed local failed_start=failed
local count=0 local count=0
while [ $count -lt 120 ]; do while [ $count -lt 120 ]; do
run journalctl $DASHUSER -n 15 -u podman-auto-update-$cname.service run journalctl -n 15 -u podman-auto-update-$cname.service
if [[ "$output" =~ $expect ]]; then if [[ "$output" =~ $expect ]]; then
failed_start= failed_start=
break break

View File

@ -4,21 +4,12 @@
# #
load helpers load helpers
load helpers.systemd
SERVICE_NAME="podman_test_$(random_string)" SERVICE_NAME="podman_test_$(random_string)"
SYSTEMCTL="systemctl"
UNIT_DIR="/usr/lib/systemd/system"
SERVICE_SOCK_ADDR="/run/podman/podman.sock" SERVICE_SOCK_ADDR="/run/podman/podman.sock"
if is_rootless; then if is_rootless; then
UNIT_DIR="$HOME/.config/systemd/user"
mkdir -p $UNIT_DIR
SYSTEMCTL="$SYSTEMCTL --user"
if [ -z "$XDG_RUNTIME_DIR" ]; then
export XDG_RUNTIME_DIR=/run/user/$(id -u)
fi
SERVICE_SOCK_ADDR="$XDG_RUNTIME_DIR/podman/podman.sock" SERVICE_SOCK_ADDR="$XDG_RUNTIME_DIR/podman/podman.sock"
fi fi
@ -66,13 +57,13 @@ EOF
rm -f $pause_pid rm -f $pause_pid
fi fi
fi fi
$SYSTEMCTL start "$SERVICE_NAME.socket" systemctl start "$SERVICE_NAME.socket"
} }
function teardown() { function teardown() {
$SYSTEMCTL stop "$SERVICE_NAME.socket" systemctl stop "$SERVICE_NAME.socket"
rm -f "$SERVICE_FILE" "$SOCKET_FILE" rm -f "$SERVICE_FILE" "$SOCKET_FILE"
$SYSTEMCTL daemon-reload systemctl daemon-reload
basic_teardown basic_teardown
} }

View File

@ -0,0 +1,30 @@
# -*- bash -*-
#
# BATS helpers for systemd-related functionality
#
# podman initializes this if unset, but systemctl doesn't
if [ -z "$XDG_RUNTIME_DIR" ]; then
if is_rootless; then
export XDG_RUNTIME_DIR=/run/user/$(id -u)
fi
fi
# For tests which write systemd unit files
UNIT_DIR="/run/systemd/system"
_DASHUSER=
if is_rootless; then
UNIT_DIR="${XDG_RUNTIME_DIR}/systemd/user"
# Why isn't systemd smart enough to figure this out on its own?
_DASHUSER="--user"
fi
mkdir -p $UNIT_DIR
systemctl() {
command systemctl $_DASHUSER "$@"
}
journalctl() {
command journalctl $_DASHUSER "$@"
}