mirror of
https://github.com/containers/podman.git
synced 2025-06-20 09:03:43 +08:00
Merge pull request #18998 from edsantiago/bats_prefetch
system tests: add and use _prefetch
This commit is contained in:
@ -72,7 +72,9 @@ function setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@test "podman can pull an image" {
|
@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
|
run_podman pull $IMAGE
|
||||||
|
|
||||||
# Regression test for https://github.com/containers/image/pull/1615
|
# Regression test for https://github.com/containers/image/pull/1615
|
||||||
|
@ -126,6 +126,10 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
|
|||||||
# Regression test for https://github.com/containers/podman/issues/7651
|
# Regression test for https://github.com/containers/podman/issues/7651
|
||||||
# in which "podman pull image-with-sha" causes "images -a" to crash
|
# in which "podman pull image-with-sha" causes "images -a" to crash
|
||||||
@test "podman images -a, after pulling by sha " {
|
@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'
|
# Get a baseline for 'images -a'
|
||||||
run_podman images -a
|
run_podman images -a
|
||||||
local images_baseline="$output"
|
local images_baseline="$output"
|
||||||
|
@ -30,8 +30,12 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
function check_signature() {
|
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
|
local sigfile=$1
|
||||||
ls -laR $PODMAN_TMPDIR/signatures
|
find $PODMAN_TMPDIR/signatures -print
|
||||||
run_podman inspect --format '{{.Digest}}' $PODMAN_TEST_IMAGE_FQN
|
run_podman inspect --format '{{.Digest}}' $PODMAN_TEST_IMAGE_FQN
|
||||||
local repodigest=${output/:/=}
|
local repodigest=${output/:/=}
|
||||||
|
|
||||||
@ -47,7 +51,7 @@ function check_signature() {
|
|||||||
|
|
||||||
|
|
||||||
@test "podman image - sign with no sigfile" {
|
@test "podman image - sign with no sigfile" {
|
||||||
GNUPGHOME=$_GNUPGHOME_TMP run_podman image sign --sign-by foo@bar.com --directory $PODMAN_TMPDIR/signatures "docker://$PODMAN_TEST_IMAGE_FQN"
|
GNUPGHOME=$_GNUPGHOME_TMP run_podman image sign --sign-by foo@bar.com --directory $PODMAN_TMPDIR/signatures "containers-storage:$PODMAN_TEST_IMAGE_FQN"
|
||||||
check_signature "signature-1"
|
check_signature "signature-1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,19 @@
|
|||||||
load helpers
|
load helpers
|
||||||
load helpers.network
|
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
|
# 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).
|
# the same thing four times (two tests, each with -i and stdin).
|
||||||
#
|
#
|
||||||
@ -174,10 +187,6 @@ verify_iid_and_name() {
|
|||||||
run_podman rmi $iid
|
run_podman rmi $iid
|
||||||
run_podman image load < $archive
|
run_podman image load < $archive
|
||||||
verify_iid_and_name "<none>:<none>"
|
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" {
|
@test "podman load - by image name" {
|
||||||
@ -240,8 +249,8 @@ verify_iid_and_name() {
|
|||||||
img2="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:multiimage"
|
img2="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:multiimage"
|
||||||
archive=$PODMAN_TMPDIR/myimage-$(random_string 8).tar
|
archive=$PODMAN_TMPDIR/myimage-$(random_string 8).tar
|
||||||
|
|
||||||
run_podman pull $img1
|
_prefetch $img1
|
||||||
run_podman pull $img2
|
_prefetch $img2
|
||||||
|
|
||||||
run_podman save -m -o $archive $img1 $img2
|
run_podman save -m -o $archive $img1 $img2
|
||||||
run_podman rmi -f $img1 $img2
|
run_podman rmi -f $img1 $img2
|
||||||
@ -258,8 +267,8 @@ verify_iid_and_name() {
|
|||||||
img2="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:multiimage"
|
img2="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:multiimage"
|
||||||
archive=$PODMAN_TMPDIR/myimage-$(random_string 8).tar
|
archive=$PODMAN_TMPDIR/myimage-$(random_string 8).tar
|
||||||
|
|
||||||
run_podman pull $img1
|
_prefetch $img1
|
||||||
run_podman pull $img2
|
_prefetch $img2
|
||||||
|
|
||||||
# We can't use run_podman because that uses the BATS 'run' function
|
# We can't use run_podman because that uses the BATS 'run' function
|
||||||
# which redirects stdout and stderr. Here we need to guarantee
|
# which redirects stdout and stderr. Here we need to guarantee
|
||||||
|
@ -289,6 +289,8 @@ function _confirm_update() {
|
|||||||
skip "this test only works with crun, not $runtime"
|
skip "this test only works with crun, not $runtime"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
_prefetch $SYSTEMD_IMAGE
|
||||||
|
|
||||||
dockerfile1=$PODMAN_TMPDIR/Dockerfile.1
|
dockerfile1=$PODMAN_TMPDIR/Dockerfile.1
|
||||||
cat >$dockerfile1 <<EOF
|
cat >$dockerfile1 <<EOF
|
||||||
FROM $SYSTEMD_IMAGE
|
FROM $SYSTEMD_IMAGE
|
||||||
@ -468,6 +470,7 @@ EOF
|
|||||||
skip "this test only works with crun, not $runtime"
|
skip "this test only works with crun, not $runtime"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
_prefetch $SYSTEMD_IMAGE
|
||||||
install_kube_template
|
install_kube_template
|
||||||
|
|
||||||
dockerfile1=$PODMAN_TMPDIR/Dockerfile.1
|
dockerfile1=$PODMAN_TMPDIR/Dockerfile.1
|
||||||
|
@ -142,10 +142,7 @@ READY=1" "sdnotify sent MAINPID and READY"
|
|||||||
# 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 "sdnotify : container" {
|
@test "sdnotify : container" {
|
||||||
# Pull our systemd image. Retry in case of flakes.
|
_prefetch $SYSTEMD_IMAGE
|
||||||
run_podman pull $SYSTEMD_IMAGE || \
|
|
||||||
run_podman pull $SYSTEMD_IMAGE || \
|
|
||||||
run_podman pull $SYSTEMD_IMAGE
|
|
||||||
|
|
||||||
export NOTIFY_SOCKET=$PODMAN_TMPDIR/container.sock
|
export NOTIFY_SOCKET=$PODMAN_TMPDIR/container.sock
|
||||||
_start_socat
|
_start_socat
|
||||||
@ -261,10 +258,7 @@ READY=1" "sdnotify sent MAINPID and READY"
|
|||||||
@test "sdnotify : play kube - with policies" {
|
@test "sdnotify : play kube - with policies" {
|
||||||
skip_if_journald_unavailable
|
skip_if_journald_unavailable
|
||||||
|
|
||||||
# Pull that image. Retry in case of flakes.
|
_prefetch $SYSTEMD_IMAGE
|
||||||
run_podman pull $SYSTEMD_IMAGE || \
|
|
||||||
run_podman pull $SYSTEMD_IMAGE || \
|
|
||||||
run_podman pull $SYSTEMD_IMAGE
|
|
||||||
|
|
||||||
# Create the YAMl file
|
# Create the YAMl file
|
||||||
yaml_source="$PODMAN_TMPDIR/test.yaml"
|
yaml_source="$PODMAN_TMPDIR/test.yaml"
|
||||||
|
@ -8,12 +8,9 @@ load helpers
|
|||||||
# capability drop list
|
# capability drop list
|
||||||
capabilities='{"drop":["CAP_FOWNER","CAP_SETFCAP"]}'
|
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
|
# filter: convert yaml to json, because bash+yaml=madness
|
||||||
function yaml2json() {
|
function yaml2json() {
|
||||||
grep -E -v "$kubernetes_63" | python3 -c 'import yaml
|
python3 -c 'import yaml
|
||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
json.dump(yaml.safe_load(sys.stdin), sys.stdout)'
|
json.dump(yaml.safe_load(sys.stdin), sys.stdout)'
|
||||||
@ -33,6 +30,8 @@ json.dump(yaml.safe_load(sys.stdin), sys.stdout)'
|
|||||||
cname=c$(random_string 15)
|
cname=c$(random_string 15)
|
||||||
run_podman container create --cap-drop fowner --cap-drop setfcap --name $cname $IMAGE top
|
run_podman container create --cap-drop fowner --cap-drop setfcap --name $cname $IMAGE top
|
||||||
run_podman kube generate $cname
|
run_podman kube generate $cname
|
||||||
|
|
||||||
|
# As of #18542, we must never see this message again.
|
||||||
assert "$output" !~ "Kubernetes only allows 63 characters"
|
assert "$output" !~ "Kubernetes only allows 63 characters"
|
||||||
# Convert yaml to json, and dump to stdout (to help in case of errors)
|
# Convert yaml to json, and dump to stdout (to help in case of errors)
|
||||||
json=$(yaml2json <<<"$output")
|
json=$(yaml2json <<<"$output")
|
||||||
|
@ -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_NAME=${PODMAN_TEST_IMAGE_NAME:-"testimage"}
|
||||||
PODMAN_TEST_IMAGE_TAG=${PODMAN_TEST_IMAGE_TAG:-"20221018"}
|
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_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.
|
# Larger image containing systemd tools.
|
||||||
PODMAN_SYSTEMD_IMAGE_NAME=${PODMAN_SYSTEMD_IMAGE_NAME:-"systemd-image"}
|
PODMAN_SYSTEMD_IMAGE_NAME=${PODMAN_SYSTEMD_IMAGE_NAME:-"systemd-image"}
|
||||||
@ -36,6 +35,55 @@ if [ $(id -u) -eq 0 ]; then
|
|||||||
_LOG_PROMPT='#'
|
_LOG_PROMPT='#'
|
||||||
fi
|
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
|
# BEGIN setup/teardown tools
|
||||||
|
|
||||||
@ -72,7 +120,11 @@ function basic_setup() {
|
|||||||
fi
|
fi
|
||||||
done
|
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=
|
found_needed_image=
|
||||||
run_podman '?' images --all --format '{{.Repository}}:{{.Tag}} {{.ID}}'
|
run_podman '?' images --all --format '{{.Repository}}:{{.Tag}} {{.ID}}'
|
||||||
# FIXME FIXME FIXME: temporary hack for #17216. If we see the unlinkat-busy
|
# FIXME FIXME FIXME: temporary hack for #17216. If we see the unlinkat-busy
|
||||||
@ -116,16 +168,15 @@ function basic_setup() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Make sure desired images are present
|
# Make sure desired image is present
|
||||||
if [ -z "$found_needed_image" ]; then
|
if [[ -z "$found_needed_image" ]]; then
|
||||||
run_podman pull "$PODMAN_TEST_IMAGE_FQN"
|
_prefetch $PODMAN_TEST_IMAGE_FQN
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Argh. Although BATS provides $BATS_TMPDIR, it's just /tmp!
|
# Temporary subdirectory, in which tests can write whatever they like
|
||||||
# That's bloody worthless. Let's make our own, in which subtests
|
# and trust that it'll be deleted on cleanup.
|
||||||
# can write whatever they like and trust that it'll be deleted
|
# (BATS v1.3 and above provide $BATS_TEST_TMPDIR, but we still use
|
||||||
# on cleanup.
|
# ancient BATS (v1.1) in RHEL gating tests.)
|
||||||
# TODO: do this outside of setup, so it carries across tests?
|
|
||||||
PODMAN_TMPDIR=$(mktemp -d --tmpdir=${BATS_TMPDIR:-/tmp} podman_bats.XXXXXX)
|
PODMAN_TMPDIR=$(mktemp -d --tmpdir=${BATS_TMPDIR:-/tmp} podman_bats.XXXXXX)
|
||||||
|
|
||||||
# In the unlikely event that a test runs is() before a run_podman()
|
# In the unlikely event that a test runs is() before a run_podman()
|
||||||
|
Reference in New Issue
Block a user