summaryrefslogtreecommitdiff
path: root/test/system
diff options
context:
space:
mode:
Diffstat (limited to 'test/system')
-rw-r--r--test/system/005-info.bats3
-rw-r--r--test/system/010-images.bats6
-rw-r--r--test/system/020-tag.bats2
-rw-r--r--test/system/030-run.bats18
-rw-r--r--test/system/045-start.bats43
-rw-r--r--test/system/060-mount.bats2
-rw-r--r--test/system/070-build.bats7
-rw-r--r--test/system/160-volumes.bats3
-rw-r--r--test/system/170-run-userns.bats15
-rw-r--r--test/system/260-sdnotify.bats6
-rw-r--r--test/system/410-selinux.bats25
-rwxr-xr-xtest/system/build-testimage6
-rw-r--r--test/system/helpers.bash31
13 files changed, 123 insertions, 44 deletions
diff --git a/test/system/005-info.bats b/test/system/005-info.bats
index ed341dd17..83d79221a 100644
--- a/test/system/005-info.bats
+++ b/test/system/005-info.bats
@@ -67,8 +67,7 @@ store.imageStore.number | 1
# RHEL or CentOS 8.
# FIXME: what does 'CentOS 8' even mean? What is $VERSION_ID in CentOS?
- run_podman info --format '{{.Host.OCIRuntime.Name}}'
- is "$output" "runc" "$osname only supports OCI Runtime = runc"
+ is "$(podman_runtime)" "runc" "$osname only supports OCI Runtime = runc"
else
skip "only applicable on RHEL, this is $osname"
fi
diff --git a/test/system/010-images.bats b/test/system/010-images.bats
index e7c88408e..bda331e6b 100644
--- a/test/system/010-images.bats
+++ b/test/system/010-images.bats
@@ -64,7 +64,7 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
run_podman commit my-container my-test-image
run_podman images my-test-image --format '{{ .History }}'
- is "$output" "" "Image has empty history to begin with"
+ is "$output" "localhost/my-test-image:latest" "image history with initial name"
# Generate two randomish tags; 'tr' because they must be all lower-case
rand_name1="test-image-history-$(random_string 10 | tr A-Z a-z)"
@@ -74,13 +74,13 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
run_podman tag my-test-image $rand_name1
run_podman rmi $rand_name1
run_podman images my-test-image --format '{{ .History }}'
- is "$output" "localhost/${rand_name1}:latest" "image history after one tag"
+ is "$output" "localhost/my-test-image:latest, localhost/${rand_name1}:latest" "image history after one tag"
# Repeat with second tag. Now both tags should be in history
run_podman tag my-test-image $rand_name2
run_podman rmi $rand_name2
run_podman images my-test-image --format '{{ .History }}'
- is "$output" "localhost/${rand_name2}:latest, localhost/${rand_name1}:latest" \
+ is "$output" "localhost/my-test-image:latest, localhost/${rand_name2}:latest, localhost/${rand_name1}:latest" \
"image history after two tags"
run_podman rmi my-test-image
diff --git a/test/system/020-tag.bats b/test/system/020-tag.bats
index 1f5eede39..945781afd 100644
--- a/test/system/020-tag.bats
+++ b/test/system/020-tag.bats
@@ -29,7 +29,7 @@ function _tag_and_check() {
# Test error case.
run_podman 125 untag $IMAGE registry.com/foo:bar
- is "$output" "Error: \"registry.com/foo:bar\": no such tag"
+ is "$output" "Error: registry.com/foo:bar: tag not known"
}
@test "podman untag all" {
diff --git a/test/system/030-run.bats b/test/system/030-run.bats
index 2b83fa56e..9a136ff13 100644
--- a/test/system/030-run.bats
+++ b/test/system/030-run.bats
@@ -142,7 +142,7 @@ echo $rand | 0 | $rand
NONLOCAL_IMAGE="$PODMAN_NONLOCAL_IMAGE_FQN"
run_podman 125 run --pull=never $NONLOCAL_IMAGE true
- is "$output" "Error: unable to find a name and tag match for $NONLOCAL_IMAGE in repotags: no such image" "--pull=never [with image not present]: error"
+ is "$output" "Error: $NONLOCAL_IMAGE: image not known" "--pull=never [with image not present]: error"
run_podman run --pull=missing $NONLOCAL_IMAGE true
is "$output" "Trying to pull .*" "--pull=missing [with image NOT PRESENT]: fetches"
@@ -153,13 +153,11 @@ echo $rand | 0 | $rand
run_podman run --pull=always $NONLOCAL_IMAGE true
is "$output" "Trying to pull .*" "--pull=always [with image PRESENT]: re-fetches"
- # Very weird corner case fixed by #7770: 'podman run foo' will run 'myfoo'
- # if it exists, because the string 'foo' appears in 'myfoo'. This test
- # covers that, as well as making sure that our testimage (which is always
- # tagged :YYYYMMDD, never :latest) doesn't match either.
- run_podman tag $IMAGE my${PODMAN_TEST_IMAGE_NAME}:latest
- run_podman 125 run --pull=never $PODMAN_TEST_IMAGE_NAME true
- is "$output" "Error: unable to find a name and tag match for $PODMAN_TEST_IMAGE_NAME in repotags: no such image" \
+ # NOTE: older version of podman would match "foo" against "myfoo". That
+ # behaviour was changed with introduction of `containers/common/libimage`
+ # which will only match at repository boundaries (/).
+ run_podman 125 run --pull=never my$PODMAN_TEST_IMAGE_NAME true
+ is "$output" "Error: my$PODMAN_TEST_IMAGE_NAME: image not known" \
"podman run --pull=never with shortname (and implicit :latest)"
# ...but if we add a :latest tag (without 'my'), it should now work
@@ -169,7 +167,7 @@ echo $rand | 0 | $rand
"podman run --pull=never, with shortname, succeeds if img is present"
run_podman rm -a
- run_podman rmi $NONLOCAL_IMAGE {my,}${PODMAN_TEST_IMAGE_NAME}:latest
+ run_podman rmi $NONLOCAL_IMAGE ${PODMAN_TEST_IMAGE_NAME}:latest
}
# 'run --rmi' deletes the image in the end unless it's used by another container
@@ -243,7 +241,7 @@ echo $rand | 0 | $rand
# Save it as a tar archive
run_podman commit myc myi
archive=$PODMAN_TMPDIR/archive.tar
- run_podman save myi -o $archive
+ run_podman save --quiet myi -o $archive
is "$output" "" "podman save"
# Clean up image and container from container storage...
diff --git a/test/system/045-start.bats b/test/system/045-start.bats
new file mode 100644
index 000000000..ff818e51d
--- /dev/null
+++ b/test/system/045-start.bats
@@ -0,0 +1,43 @@
+#!/usr/bin/env bats -*- bats -*-
+
+load helpers
+
+@test "podman start --all - start all containers" {
+ # Run a bunch of short-lived containers, with different --restart settings
+ run_podman run -d $IMAGE /bin/true
+ cid_none_implicit="$output"
+ run_podman run -d --restart=no $IMAGE /bin/false
+ cid_none_explicit="$output"
+ run_podman run -d --restart=on-failure $IMAGE /bin/true
+ cid_on_failure="$output"
+
+ # Run one longer-lived one.
+ run_podman run -d --restart=always $IMAGE sleep 20
+ cid_always="$output"
+
+ run_podman wait $cid_none_implicit $cid_none_explicit $cid_on_failure
+
+ run_podman start --all
+ is "$output" ".*$cid_none_implicit" "started: container with no --restart"
+ is "$output" ".*$cid_none_explicit" "started: container with --restart=no"
+ is "$output" ".*$cid_on_failure" "started: container with --restart=on-failure"
+ if [[ $output =~ $cid_always ]]; then
+ die "podman start --all restarted a running container"
+ fi
+
+ run_podman rm $cid_none_implicit $cid_none_explicit $cid_on_failure
+ run_podman stop -t 1 $cid_always
+ run_podman rm $cid_always
+}
+
+@test "podman start --all with incompatible options" {
+ expected="Error: either start all containers or the container(s) provided in the arguments"
+ run_podman 125 start --all 12333
+ is "$output" "$expected" "start --all, with args, throws error"
+ if ! is_remote; then
+ run_podman 125 start --all --latest
+ is "$output" "$expected" "podman start --all --latest"
+ fi
+}
+
+# vim: filetype=sh
diff --git a/test/system/060-mount.bats b/test/system/060-mount.bats
index f04f34bf6..63a93e13b 100644
--- a/test/system/060-mount.bats
+++ b/test/system/060-mount.bats
@@ -70,7 +70,7 @@ load helpers
is "$output" "" "podman image umount: does not re-umount"
run_podman 125 image umount no-such-container
- is "$output" "Error: unable to find a name and tag match for no-such-container in repotags: no such image" \
+ is "$output" "Error: no-such-container: image not known" \
"error message from image umount no-such-container"
run_podman image mount
diff --git a/test/system/070-build.bats b/test/system/070-build.bats
index 6ae78de2e..a2c8ae588 100644
--- a/test/system/070-build.bats
+++ b/test/system/070-build.bats
@@ -393,9 +393,9 @@ Labels.$label_name | $label_value
"image tree: third line"
is "${lines[3]}" "Image Layers" \
"image tree: fourth line"
- is "${lines[4]}" "... ID: [0-9a-f]\{12\} Size: .* Top Layer of: \[$IMAGE]" \
+ is "${lines[4]}" ".* ID: [0-9a-f]\{12\} Size: .* Top Layer of: \[localhost/build_test:latest]" \
"image tree: first layer line"
- is "${lines[-1]}" "... ID: [0-9a-f]\{12\} Size: .* Top Layer of: \[localhost/build_test:latest]" \
+ is "${lines[-1]}" ".* ID: [0-9a-f]\{12\} Size: .* Top Layer of: \[$IMAGE]" \
"image tree: last layer line"
# FIXME: 'image tree --whatrequires' does not work via remote
@@ -553,6 +553,7 @@ STEP 2: RUN echo x${random2}y
x${random2}y${remote_extra}
STEP 3: COMMIT build_test${remote_extra}
--> [0-9a-f]\{11\}
+Successfully tagged localhost/build_test:latest
[0-9a-f]\{64\}
a${random3}z"
@@ -698,7 +699,7 @@ EOF
# we're happy.
if ! is_remote; then
is "$output" \
- ".* pull policy is .never. but .* could not be found locally" \
+ ".*Error: error creating build container: quay.io/libpod/nosuchimage:nosuchtag: image not known" \
"--pull-never fails with expected error message"
fi
}
diff --git a/test/system/160-volumes.bats b/test/system/160-volumes.bats
index 98992f973..9a852db89 100644
--- a/test/system/160-volumes.bats
+++ b/test/system/160-volumes.bats
@@ -123,8 +123,7 @@ EOF
# ARGH. Unfortunately, runc (used for cgroups v1) produces a different error
local expect_rc=126
local expect_msg='.* OCI permission denied.*'
- run_podman info --format '{{ .Host.OCIRuntime.Path }}'
- if expr "$output" : ".*/runc"; then
+ if [[ $(podman_runtime) = "runc" ]]; then
expect_rc=1
expect_msg='.* exec user process caused.*permission denied'
fi
diff --git a/test/system/170-run-userns.bats b/test/system/170-run-userns.bats
index 2dc5b078f..eb6c4e259 100644
--- a/test/system/170-run-userns.bats
+++ b/test/system/170-run-userns.bats
@@ -6,22 +6,31 @@
load helpers
+function _require_crun() {
+ runtime=$(podman_runtime)
+ if [[ $runtime != "crun" ]]; then
+ skip "runtime is $runtime; keep-groups requires crun"
+ fi
+}
+
@test "podman --group-add keep-groups while in a userns" {
- skip_if_rootless "choot is not allowed in rootless mode"
+ skip_if_rootless "chroot is not allowed in rootless mode"
skip_if_remote "--group-add keep-groups not supported in remote mode"
+ _require_crun
run chroot --groups 1234 / ${PODMAN} run --uidmap 0:200000:5000 --group-add keep-groups $IMAGE id
is "$output" ".*65534(nobody)" "Check group leaked into user namespace"
}
@test "podman --group-add keep-groups while not in a userns" {
- skip_if_rootless "choot is not allowed in rootless mode"
+ skip_if_rootless "chroot is not allowed in rootless mode"
skip_if_remote "--group-add keep-groups not supported in remote mode"
+ _require_crun
run chroot --groups 1234,5678 / ${PODMAN} run --group-add keep-groups $IMAGE id
is "$output" ".*1234" "Check group leaked into container"
}
@test "podman --group-add without keep-groups while in a userns" {
- skip_if_rootless "choot is not allowed in rootless mode"
+ skip_if_rootless "chroot is not allowed in rootless mode"
skip_if_remote "--group-add keep-groups not supported in remote mode"
run chroot --groups 1234,5678 / ${PODMAN} run --uidmap 0:200000:5000 --group-add 457 $IMAGE id
is "$output" ".*457" "Check group leaked into container"
diff --git a/test/system/260-sdnotify.bats b/test/system/260-sdnotify.bats
index 8bf49eb1d..acb30de47 100644
--- a/test/system/260-sdnotify.bats
+++ b/test/system/260-sdnotify.bats
@@ -17,9 +17,9 @@ function setup() {
# sdnotify fails with runc 1.0.0-3-dev2 on Ubuntu. Let's just
# assume that we work only with crun, nothing else.
- run_podman info --format '{{ .Host.OCIRuntime.Name }}'
- if [[ "$output" != "crun" ]]; then
- skip "this test only works with crun, not '$output'"
+ runtime=$(podman_runtime)
+ if [[ "$runtime" != "crun" ]]; then
+ skip "this test only works with crun, not $runtime"
fi
basic_setup
diff --git a/test/system/410-selinux.bats b/test/system/410-selinux.bats
index 8a690fb48..95233c1e6 100644
--- a/test/system/410-selinux.bats
+++ b/test/system/410-selinux.bats
@@ -51,18 +51,13 @@ function check_label() {
}
@test "podman selinux: pid=host" {
- # FIXME FIXME FIXME: Remove these lines once all VMs have >= 2.146.0
- # (this is ugly, but better than an unconditional skip)
- skip_if_no_selinux
+ # FIXME this test fails when run rootless with runc:
+ # Error: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: readonly path /proc/asound: operation not permitted: OCI permission denied
if is_rootless; then
- if [ -x /usr/bin/rpm ]; then
- cs_version=$(rpm -q --qf '%{version}' container-selinux)
- else
- # SELinux not enabled on Ubuntu, so we should never get here
- die "WHOA! SELinux enabled, but no /usr/bin/rpm!"
- fi
+ runtime=$(podman_runtime)
+ test "$runtime" == "crun" \
+ || skip "runtime is $runtime; this test requires crun"
fi
- # FIXME FIXME FIXME: delete up to here, leaving just check_label
check_label "--pid=host" "spc_t"
}
@@ -185,10 +180,18 @@ function check_label() {
@test "podman with nonexistent labels" {
skip_if_no_selinux
+ # runc and crun emit different diagnostics
+ runtime=$(podman_runtime)
+ case "$runtime" in
+ crun) expect="\`/proc/thread-self/attr/exec\`: OCI runtime error: unable to assign security attribute" ;;
+ runc) expect="OCI runtime error: .*: failed to set /proc/self/attr/keycreate on procfs" ;;
+ *) skip "Unknown runtime '$runtime'";;
+ esac
+
# The '.*' in the error below is for dealing with podman-remote, which
# includes "error preparing container <sha> for attach" in output.
run_podman 126 run --security-opt label=type:foo.bar $IMAGE true
- is "$output" "Error.*: \`/proc/thread-self/attr/exec\`: OCI runtime error: unable to assign security attribute" "useful diagnostic"
+ is "$output" "Error.*: $expect" "podman emits useful diagnostic on failure"
}
@test "podman selinux: check relabel" {
diff --git a/test/system/build-testimage b/test/system/build-testimage
index aac08e307..3e5b982ce 100755
--- a/test/system/build-testimage
+++ b/test/system/build-testimage
@@ -78,7 +78,7 @@ podman rmi -f testimage &> /dev/null || true
# and because Dan says arch emulation is not currently working on podman
# (no further details).
# Arch emulation on Fedora requires the qemu-user-static package.
-for arch in amd64 ppc64le s390x;do
+for arch in amd64 arm64v8 ppc64le s390x;do
${BUILDAH} bud \
--arch=$arch \
--build-arg ARCH=$arch \
@@ -106,9 +106,9 @@ ${BUILDAH} manifest push --all ${remote_tag} docker://${remote_tag}
# As of 2021-02-24 it is simply busybox, because it is super small,
# but it's complicated because of multiarch:
#
-# img=quay.io/libpod/testimage:00000001
+# img=quay.io/libpod/testimage:0000000<current+1>
# buildah manifest create $img
-# for arch in amd64 ppc64le s390x;do
+# for arch in amd64 arm64v8 ppc64le s390x;do
# buildah pull --arch $arch docker.io/$arch/busybox:1.32.0
# buildah manifest add $img docker.io/$arch/busybox:1.32.0
# done
diff --git a/test/system/helpers.bash b/test/system/helpers.bash
index b9eacfd0b..e0c208f57 100644
--- a/test/system/helpers.bash
+++ b/test/system/helpers.bash
@@ -7,14 +7,14 @@ PODMAN=${PODMAN:-podman}
PODMAN_TEST_IMAGE_REGISTRY=${PODMAN_TEST_IMAGE_REGISTRY:-"quay.io"}
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:-"20210223"}
+PODMAN_TEST_IMAGE_TAG=${PODMAN_TEST_IMAGE_TAG:-"20210427"}
PODMAN_TEST_IMAGE_FQN="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:$PODMAN_TEST_IMAGE_TAG"
PODMAN_TEST_IMAGE_ID=
# Remote image that we *DO NOT* fetch or keep by default; used for testing pull
# This changed from 0 to 1 on 2021-02-24 due to multiarch considerations; it
# should change only very rarely.
-PODMAN_NONLOCAL_IMAGE_FQN="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:00000001"
+PODMAN_NONLOCAL_IMAGE_FQN="$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME:00000002"
# Because who wants to spell that out each time?
IMAGE=$PODMAN_TEST_IMAGE_FQN
@@ -35,6 +35,23 @@ fi
# That way individual tests can override with their own setup/teardown,
# while retaining the ability to include these if they so desire.
+# Some CI systems set this to runc, overriding the default crun.
+# Although it would be more elegant to override options in run_podman(),
+# we instead override $PODMAN itself because some tests (170-run-userns)
+# have to invoke $PODMAN directly.
+if [[ -n $OCI_RUNTIME ]]; then
+ if [[ -z $CONTAINERS_CONF ]]; then
+ # FIXME: BATS provides no mechanism for end-of-run cleanup[1]; how
+ # can we avoid leaving this file behind when we finish?
+ # [1] https://github.com/bats-core/bats-core/issues/39
+ export CONTAINERS_CONF=$(mktemp --tmpdir=${BATS_TMPDIR:-/tmp} podman-bats-XXXXXXX.containers.conf)
+ cat >$CONTAINERS_CONF <<EOF
+[engine]
+runtime="$OCI_RUNTIME"
+EOF
+ fi
+fi
+
# Setup helper: establish a test environment with exactly the images needed
function basic_setup() {
# Clean up all containers
@@ -284,6 +301,16 @@ function is_cgroupsv2() {
test "$cgroup_type" = "cgroup2fs"
}
+# Returns the OCI runtime *basename* (typically crun or runc). Much as we'd
+# love to cache this result, we probably shouldn't.
+function podman_runtime() {
+ # This function is intended to be used as '$(podman_runtime)', i.e.
+ # our caller wants our output. run_podman() messes with output because
+ # it emits the command invocation to stdout, hence the redirection.
+ run_podman info --format '{{ .Host.OCIRuntime.Name }}' >/dev/null
+ basename "${output:-[null]}"
+}
+
# rhbz#1895105: rootless journald is unavailable except to users in
# certain magic groups; which our testuser account does not belong to
# (intentional: that is the RHEL default, so that's the setup we test).