Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

system tests: add and use _prefetch #18998

Merged
merged 1 commit into from
Jun 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion test/system/001-basic.bats
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ function setup() {
}

@test "podman can pull an image" {
run_podman rmi -a
run_podman rmi -a -f

# This is a risk point: it will fail if the registry or network are flaky
run_podman pull $IMAGE

# Regression test for https://github.com/containers/image/pull/1615
Expand Down
4 changes: 4 additions & 0 deletions test/system/010-images.bats
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
# Regression test for https://github.com/containers/podman/issues/7651
# in which "podman pull image-with-sha" causes "images -a" to crash
@test "podman images -a, after pulling by sha " {
# This test requires that $IMAGE be 100% the same as the registry one
run_podman rmi -a -f
_prefetch $IMAGE

# Get a baseline for 'images -a'
run_podman images -a
local images_baseline="$output"
Expand Down
8 changes: 6 additions & 2 deletions test/system/011-image.bats
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,12 @@ EOF
}

function check_signature() {
# This test requires that $IMAGE be 100% the same as the registry one
run_podman rmi -a -f
_prefetch $IMAGE

local sigfile=$1
ls -laR $PODMAN_TMPDIR/signatures
find $PODMAN_TMPDIR/signatures -print
run_podman inspect --format '{{.Digest}}' $PODMAN_TEST_IMAGE_FQN
local repodigest=${output/:/=}

Expand All @@ -47,7 +51,7 @@ function check_signature() {


@test "podman image - sign with no sigfile" {
GNUPGHOME=$_GNUPGHOME_TMP run_podman image sign --sign-by [email protected] --directory $PODMAN_TMPDIR/signatures "docker://$PODMAN_TEST_IMAGE_FQN"
GNUPGHOME=$_GNUPGHOME_TMP run_podman image sign --sign-by [email protected] --directory $PODMAN_TMPDIR/signatures "containers-storage:$PODMAN_TEST_IMAGE_FQN"
check_signature "signature-1"
}

Expand Down
25 changes: 17 additions & 8 deletions test/system/120-load.bats
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@
load helpers
load helpers.network

function teardown() {
# Destroy all images, to make sure we don't leave garbage behind.
#
# The tests in here do funky things with image store, including
# reloading the default $IMAGE in a way that appears normal but
# is not actually the same as what is normally pulled, e.g.,
# annotations and image digests may be different. See
# https://github.com/containers/podman/discussions/17911
run_podman rmi -a -f

basic_teardown
}

# Custom helpers for this test only. These just save us having to duplicate
# the same thing four times (two tests, each with -i and stdin).
#
Expand Down Expand Up @@ -174,10 +187,6 @@ verify_iid_and_name() {
run_podman rmi $iid
run_podman image load < $archive
verify_iid_and_name "<none>:<none>"

# Cleanup: since load-by-iid doesn't preserve name, re-tag it;
# otherwise our global teardown will rmi and re-pull our standard image.
run_podman tag $iid $img_name
}

@test "podman load - by image name" {
Expand Down Expand Up @@ -240,8 +249,8 @@ verify_iid_and_name() {
img2="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:multiimage"
archive=$PODMAN_TMPDIR/myimage-$(random_string 8).tar

run_podman pull $img1
run_podman pull $img2
_prefetch $img1
_prefetch $img2

run_podman save -m -o $archive $img1 $img2
run_podman rmi -f $img1 $img2
Expand All @@ -258,8 +267,8 @@ verify_iid_and_name() {
img2="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:multiimage"
archive=$PODMAN_TMPDIR/myimage-$(random_string 8).tar

run_podman pull $img1
run_podman pull $img2
_prefetch $img1
_prefetch $img2

# We can't use run_podman because that uses the BATS 'run' function
# which redirects stdout and stderr. Here we need to guarantee
Expand Down
3 changes: 3 additions & 0 deletions test/system/255-auto-update.bats
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ function _confirm_update() {
skip "this test only works with crun, not $runtime"
fi

_prefetch $SYSTEMD_IMAGE

dockerfile1=$PODMAN_TMPDIR/Dockerfile.1
cat >$dockerfile1 <<EOF
FROM $SYSTEMD_IMAGE
Expand Down Expand Up @@ -468,6 +470,7 @@ EOF
skip "this test only works with crun, not $runtime"
fi

_prefetch $SYSTEMD_IMAGE
install_kube_template

dockerfile1=$PODMAN_TMPDIR/Dockerfile.1
Expand Down
10 changes: 2 additions & 8 deletions test/system/260-sdnotify.bats
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,7 @@ READY=1" "sdnotify sent MAINPID and READY"
# These tests can fail in dev. environment because of SELinux.
# quick fix: chcon -t container_runtime_exec_t ./bin/podman
@test "sdnotify : container" {
# Pull our systemd image. Retry in case of flakes.
run_podman pull $SYSTEMD_IMAGE || \
run_podman pull $SYSTEMD_IMAGE || \
run_podman pull $SYSTEMD_IMAGE
_prefetch $SYSTEMD_IMAGE

export NOTIFY_SOCKET=$PODMAN_TMPDIR/container.sock
_start_socat
Expand Down Expand Up @@ -261,10 +258,7 @@ READY=1" "sdnotify sent MAINPID and READY"
@test "sdnotify : play kube - with policies" {
skip_if_journald_unavailable

# Pull that image. Retry in case of flakes.
run_podman pull $SYSTEMD_IMAGE || \
run_podman pull $SYSTEMD_IMAGE || \
run_podman pull $SYSTEMD_IMAGE
_prefetch $SYSTEMD_IMAGE

# Create the YAMl file
yaml_source="$PODMAN_TMPDIR/test.yaml"
Expand Down
7 changes: 3 additions & 4 deletions test/system/710-kube.bats
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@ load helpers
# capability drop list
capabilities='{"drop":["CAP_FOWNER","CAP_SETFCAP"]}'

# Warning that is emitted once on containers, multiple times on pods
kubernetes_63='Truncation Annotation: .* Kubernetes only allows 63 characters'

# filter: convert yaml to json, because bash+yaml=madness
function yaml2json() {
grep -E -v "$kubernetes_63" | python3 -c 'import yaml
python3 -c 'import yaml
import json
import sys
json.dump(yaml.safe_load(sys.stdin), sys.stdout)'
Expand All @@ -33,6 +30,8 @@ json.dump(yaml.safe_load(sys.stdin), sys.stdout)'
cname=c$(random_string 15)
run_podman container create --cap-drop fowner --cap-drop setfcap --name $cname $IMAGE top
run_podman kube generate $cname

# As of #18542, we must never see this message again.
assert "$output" !~ "Kubernetes only allows 63 characters"
# Convert yaml to json, and dump to stdout (to help in case of errors)
json=$(yaml2json <<<"$output")
Expand Down
71 changes: 61 additions & 10 deletions test/system/helpers.bash
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ PODMAN_TEST_IMAGE_USER=${PODMAN_TEST_IMAGE_USER:-"libpod"}
PODMAN_TEST_IMAGE_NAME=${PODMAN_TEST_IMAGE_NAME:-"testimage"}
PODMAN_TEST_IMAGE_TAG=${PODMAN_TEST_IMAGE_TAG:-"20221018"}
PODMAN_TEST_IMAGE_FQN="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:$PODMAN_TEST_IMAGE_TAG"
PODMAN_TEST_IMAGE_ID=

# Larger image containing systemd tools.
PODMAN_SYSTEMD_IMAGE_NAME=${PODMAN_SYSTEMD_IMAGE_NAME:-"systemd-image"}
Expand All @@ -36,6 +35,55 @@ if [ $(id -u) -eq 0 ]; then
_LOG_PROMPT='#'
fi

###############################################################################
# BEGIN tools for fetching & caching test images
#
# Registries are flaky: any time we have to pull an image, that's a risk.
#

# Store in a semipermanent location. Not important for CI, but nice for
# developers so test restarts don't hang fetching images.
export PODMAN_IMAGECACHE=${BATS_TMPDIR:-/tmp}/podman-systest-imagecache-$(id -u)
mkdir -p ${PODMAN_IMAGECACHE}

function _prefetch() {
local want=$1

# Do we already have it in image store?
run_podman '?' image exists "$want"
if [[ $status -eq 0 ]]; then
return
fi

# No image. Do we have it already cached? (Replace / and : with --)
local cachename=$(sed -e 's;[/:];--;g' <<<"$want")
local cachepath="${PODMAN_IMAGECACHE}/${cachename}.tar"
if [[ ! -e "$cachepath" ]]; then
# Not cached. Fetch it and cache it. Retry twice, because of flakes.
cmd="skopeo copy --preserve-digests docker://$want oci-archive:$cachepath"
echo "$_LOG_PROMPT $cmd"
run $cmd
echo "$output"
if [[ $status -ne 0 ]]; then
echo "# 'pull $want' failed, will retry..." >&3
sleep 5

run $cmd
echo "$output"
if [[ $status -ne 0 ]]; then
echo "# 'pull $want' failed again, will retry one last time..." >&3
sleep 30
$cmd
fi
fi
fi

# Cached image is now guaranteed to exist. Be sure to load it
# with skopeo, not podman, in order to preserve metadata
skopeo copy --all oci-archive:$cachepath containers-storage:$want
}

# END tools for fetching & caching test images
###############################################################################
# BEGIN setup/teardown tools

Expand Down Expand Up @@ -72,7 +120,11 @@ function basic_setup() {
fi
done

# Clean up all images except those desired
# Clean up all images except those desired.
# 2023-06-26 REMINDER: it is tempting to think that this is clunky,
# wouldn't it be safer/cleaner to just 'rmi -a' then '_prefetch $IMAGE'?
# Yes, but it's also tremendously slower: 29m for a CI run, to 39m.
# Image loads are slow.
found_needed_image=
run_podman '?' images --all --format '{{.Repository}}:{{.Tag}} {{.ID}}'
# FIXME FIXME FIXME: temporary hack for #17216. If we see the unlinkat-busy
Expand Down Expand Up @@ -116,16 +168,15 @@ function basic_setup() {
fi
done

# Make sure desired images are present
if [ -z "$found_needed_image" ]; then
run_podman pull "$PODMAN_TEST_IMAGE_FQN"
# Make sure desired image is present
if [[ -z "$found_needed_image" ]]; then
_prefetch $PODMAN_TEST_IMAGE_FQN
fi

# Argh. Although BATS provides $BATS_TMPDIR, it's just /tmp!
# That's bloody worthless. Let's make our own, in which subtests
# can write whatever they like and trust that it'll be deleted
# on cleanup.
# TODO: do this outside of setup, so it carries across tests?
# Temporary subdirectory, in which tests can write whatever they like
# and trust that it'll be deleted on cleanup.
# (BATS v1.3 and above provide $BATS_TEST_TMPDIR, but we still use
# ancient BATS (v1.1) in RHEL gating tests.)
PODMAN_TMPDIR=$(mktemp -d --tmpdir=${BATS_TMPDIR:-/tmp} podman_bats.XXXXXX)

# In the unlikely event that a test runs is() before a run_podman()
Expand Down