toolbox/test/system/libs/helpers.bash
Ondřej Míchal ae43560d45 test/system: Test startup on Rawhide with supported versions
We need to know if the latest changes in the libc (that is dynamically
linked to the binary) causes problems in containers based on older
releases of Fedora.

The estimate of the version numbers is very crude and does not follow
the upstream schedule. That should not be a problem, though.

A part of an existing test has been reused and made into a helper
function to implement this.

This increases the run time of the test suite on Rawhide which already
takes longer than the same test suite on released versions of Fedora.
Make up for it by increasing the timeout by 2 minutes.

https://github.com/containers/toolbox/pull/899
2021-12-04 17:37:40 +02:00

336 lines
7.7 KiB
Bash

#!/usr/bin/env bash
load 'libs/bats-support/load'
# Helpful globals
readonly TEMP_BASE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/toolbox"
readonly TEMP_STORAGE_DIR="${TEMP_BASE_DIR}/system-test-storage"
readonly IMAGE_CACHE_DIR="${BATS_RUN_TMPDIR}/image-cache"
readonly ROOTLESS_PODMAN_STORE_DIR="${TEMP_STORAGE_DIR}/storage"
readonly PODMAN_STORE_CONFIG_FILE="${TEMP_STORAGE_DIR}/store.conf"
# Podman and Toolbox commands to run
readonly PODMAN=${PODMAN:-podman}
readonly TOOLBOX=${TOOLBOX:-toolbox}
readonly SKOPEO=$(command -v skopeo)
# Images
declare -Ag IMAGES=([busybox]="quay.io/toolbox_tests/busybox" \
[fedora]="registry.fedoraproject.org/fedora-toolbox" \
[rhel]="registry.access.redhat.com/ubi8")
function cleanup_all() {
$PODMAN system reset --force >/dev/null
}
function cleanup_containers() {
$PODMAN rm --all --force >/dev/null
}
function _setup_environment() {
_setup_containers_store
check_xdg_runtime_dir
}
function _setup_containers_store() {
mkdir -p ${TEMP_STORAGE_DIR}
# Setup a storage config file for PODMAN
echo -e "[storage]\n driver = \"overlay\"\n rootless_storage_path = \"${ROOTLESS_PODMAN_STORE_DIR}\"\n" > ${PODMAN_STORE_CONFIG_FILE}
export CONTAINERS_STORAGE_CONF=${PODMAN_STORE_CONFIG_FILE}
}
function _clean_temporary_storage() {
rm -rf ${TEMP_STORAGE_DIR}
}
# Pulls an image using Podman and saves it to a image dir using Skopeo
#
# Parameters
# ==========
# - distro - os-release field ID (e.g., fedora, rhel)
# - version - os-release field VERSION_ID (e.g., 33, 34, 8.4)
#
# Only use during test suite setup for caching all images to be used throught
# tests.
function _pull_and_cache_distro_image() {
local num_of_retries=5
local timeout=10
local pulled=false
local distro
local version
local image
local image_archive
distro="$1"
version="$2"
if [ ! -v IMAGES[$distro] ]; then
fail "Requested distro (${distro}) does not have a matching image"
fi
image="${IMAGES[$distro]}"
image_archive="${distro}-toolbox"
if [[ $# -eq 2 ]]; then
image="${image}:${version}"
image_archive="${image_archive}-${version}"
fi
for ((i = ${num_of_retries}; i > 0; i--)); do
run $PODMAN pull ${image}
if [ "$status" -eq 0 ]; then
pulled=true
break
fi
sleep $timeout
done
if ! $pulled; then
echo "Failed to pull image ${image}"
assert_success
fi
if [ ! -d ${IMAGE_CACHE_DIR} ]; then
mkdir -p ${IMAGE_CACHE_DIR}
fi
run $SKOPEO copy --dest-compress containers-storage:${image} dir:${IMAGE_CACHE_DIR}/${image_archive}
if [ "$status" -ne 0 ]; then
echo "Failed to cache image ${image} to ${IMAGE_CACHE_DIR}/${image_archive}"
assert_success
fi
cleanup_all
}
# Removes the folder with cached images
function _clean_cached_images() {
rm -rf ${IMAGE_CACHE_DIR}
}
# Copies an image from local storage to Podman's image store
#
# Call before creating any container. Network failures are not nice.
#
# An image has to be cached first. See _pull_and_cache_distro_image()
#
# Parameters:
# ===========
# - distro - os-release field ID (e.g., fedora, rhel)
# - version - os-release field VERSION_ID (e.g., 33, 34, 8.4)
function pull_distro_image() {
local distro
local version
local image
local image_archive
distro="$1"
version="$2"
if [ ! -v IMAGES[$distro] ]; then
fail "Requested distro (${distro}) does not have a matching image"
fi
image="${IMAGES[$distro]}"
image_archive="${distro}-toolbox"
if [[ -n $version ]]; then
image="${image}:${version}"
image_archive="${image_archive}-${version}"
fi
# No need to copy if the image is already available in Podman
run $PODMAN image exists ${image}
if [[ "$status" -eq 0 ]]; then
return
fi
# https://github.com/containers/skopeo/issues/547 for the options for containers-storage
run $SKOPEO copy "dir:${IMAGE_CACHE_DIR}/${image_archive}" "containers-storage:[overlay@$ROOTLESS_PODMAN_STORE_DIR+$ROOTLESS_PODMAN_STORE_DIR]${image}"
if [ "$status" -ne 0 ]; then
echo "Failed to load image ${image} from cache ${IMAGE_CACHE_DIR}/${image_archive}"
assert_success
fi
$PODMAN images
}
# Copies the system's default image to Podman's image store
#
# See pull_default_image() for more info.
function pull_default_image() {
pull_distro_image $(get_system_id) $(get_system_version)
}
# Creates a container with specific name, distro and version
#
# Pulling of an image is taken care of by the function
#
# Parameters:
# ===========
# - distro - os-release field ID (e.g., fedora, rhel)
# - version - os-release field VERSION_ID (e.g., 33, 34, 8.4)
# - container_name - name of the container
function create_distro_container() {
local distro
local version
local container_name
distro="$1"
version="$2"
container_name="$3"
pull_distro_image ${distro} ${version}
$TOOLBOX --assumeyes create --container "${container_name}" --distro "${distro}" --release "${version}" >/dev/null \
|| fail "Toolbox couldn't create container '$container_name'"
}
# Creates a container with specific name matching the system
#
# Parameters:
# ===========
# - container_name - name of the container
function create_container() {
local container_name
container_name="$1"
create_distro_container $(get_system_id) $(get_system_version) $container_name
}
# Creates a default container
function create_default_container() {
pull_default_image
$TOOLBOX --assumeyes create >/dev/null \
|| fail "Toolbox couldn't create default container"
}
function start_container() {
local container_name
container_name="$1"
$PODMAN start "$container_name" >/dev/null \
|| fail "Podman couldn't start the container '$container_name'"
}
# Checks if a toolbox container started
#
# Parameters:
# ===========
# - container_name - name of the container
function container_started() {
local container_name
container_name="$1"
run $PODMAN start $container_name
container_initialized=0
for TRIES in 1 2 3 4 5
do
run $PODMAN logs $container_name
container_output=$output
# Look for last line of the container startup log
run grep 'Listening to file system and ticker events' <<< $container_output
if [[ "$status" -eq 0 ]]; then
container_initialized=1
break
fi
sleep 1
done
echo $container_output >2
echo $container_initialized
}
function stop_container() {
local container_name
container_name="$1"
# Make sure the container is running before trying to stop it
$PODMAN start "$container_name" >/dev/null \
|| fail "Podman couldn't start the container '$container_name'"
$PODMAN stop "$container_name" >/dev/null \
|| fail "Podman couldn't stop the container '$container_name'"
}
function list_images() {
$PODMAN images --all --quiet | wc -l
}
function list_containers() {
$PODMAN ps --all --quiet | wc -l
}
# Returns the path to os-release
function find_os_release() {
if [[ -f "/etc/os-release" ]]; then
echo "/etc/os-release"
elif [[ -f "/usr/lib/os-release" ]]; then
echo "/usr/lib/os-release"
else
echo ""
fi
}
# Returns the content of field ID in os-release
function get_system_id() {
local os_release
os_release="$(find_os_release)"
if [[ -z "$os_release" ]]; then
echo ""
return
fi
echo $(awk -F= '/ID/ {print $2}' $os_release | head -n 1)
}
# Returns the content of field VERSION_ID in os-release
function get_system_version() {
local os_release
os_release="$(find_os_release)"
if [[ -z "$os_release" ]]; then
echo ""
return
fi
echo $(awk -F= '/VERSION_ID/ {print $2}' $os_release | head -n 1)
}
# Setup the XDG_RUNTIME_DIR variable if not set
function check_xdg_runtime_dir() {
if [[ -z "${XDG_RUNTIME_DIR}" ]]; then
export XDG_RUNTIME_DIR="/run/user/${UID}"
fi
}