diff options
Diffstat (limited to 'test/system')
-rw-r--r-- | test/system/010-images.bats | 12 | ||||
-rw-r--r-- | test/system/030-run.bats | 14 | ||||
-rw-r--r-- | test/system/035-logs.bats | 10 | ||||
-rw-r--r-- | test/system/060-mount.bats | 104 | ||||
-rw-r--r-- | test/system/065-cp.bats | 2 | ||||
-rw-r--r-- | test/system/070-build.bats | 63 | ||||
-rw-r--r-- | test/system/160-volumes.bats | 5 | ||||
-rw-r--r-- | test/system/200-pod.bats | 24 |
8 files changed, 226 insertions, 8 deletions
diff --git a/test/system/010-images.bats b/test/system/010-images.bats index 900a24368..98bb0cc57 100644 --- a/test/system/010-images.bats +++ b/test/system/010-images.bats @@ -3,10 +3,18 @@ load helpers @test "podman images - basic output" { - run_podman images -a + headings="REPOSITORY *TAG *IMAGE ID *CREATED *SIZE" - is "${lines[0]}" "REPOSITORY *TAG *IMAGE ID *CREATED *SIZE" "header line" + run_podman images -a + is "${lines[0]}" "$headings" "header line" is "${lines[1]}" "$PODMAN_TEST_IMAGE_REGISTRY/$PODMAN_TEST_IMAGE_USER/$PODMAN_TEST_IMAGE_NAME *$PODMAN_TEST_IMAGE_TAG *[0-9a-f]\+" "podman images output" + + # 'podman images' should emit headings even if there are no images + # (but --root only works locally) + if ! is_remote; then + run_podman --root ${PODMAN_TMPDIR}/nothing-here-move-along images + is "$output" "$headings" "'podman images' emits headings even w/o images" + fi } @test "podman images - custom formats" { diff --git a/test/system/030-run.bats b/test/system/030-run.bats index b64e80f05..71831da10 100644 --- a/test/system/030-run.bats +++ b/test/system/030-run.bats @@ -14,8 +14,8 @@ load helpers # ...but check the configured runtime engine, and switch to crun as needed run_podman info --format '{{ .Host.OCIRuntime.Path }}' if expr "$output" : ".*/crun"; then - err_no_such_cmd="Error: executable file.* not found in \$PATH: No such file or directory: OCI runtime command not found error" - err_no_exec_dir="Error: open executable: Operation not permitted: OCI runtime permission denied error" + err_no_such_cmd="Error: executable file.* not found in \$PATH: No such file or directory: OCI not found" + err_no_exec_dir="Error: open executable: Operation not permitted: OCI permission denied" fi tests=" @@ -436,6 +436,16 @@ json-file | f @test "podman run --log-driver journald" { skip_if_remote "We cannot read journalctl over remote." + # We can't use journald on RHEL as rootless, either: rhbz#1895105 + if is_rootless; then + run journalctl -n 1 + if [[ $status -ne 0 ]]; then + if [[ $output =~ permission ]]; then + skip "Cannot use rootless journald on this system" + fi + fi + fi + msg=$(random_string 20) pidfile="${PODMAN_TMPDIR}/$(random_string 20)" diff --git a/test/system/035-logs.bats b/test/system/035-logs.bats index 130bc5243..a3d6a5800 100644 --- a/test/system/035-logs.bats +++ b/test/system/035-logs.bats @@ -51,6 +51,16 @@ ${cid[0]} d" "Sequential output from logs" } @test "podman logs over journald" { + # We can't use journald on RHEL as rootless: rhbz#1895105 + if is_rootless; then + run journalctl -n 1 + if [[ $status -ne 0 ]]; then + if [[ $output =~ permission ]]; then + skip "Cannot use rootless journald on this system" + fi + fi + fi + msg=$(random_string 20) run_podman run --name myctr --log-driver journald $IMAGE echo $msg diff --git a/test/system/060-mount.bats b/test/system/060-mount.bats index ece87acf6..f04f34bf6 100644 --- a/test/system/060-mount.bats +++ b/test/system/060-mount.bats @@ -2,7 +2,6 @@ load helpers - @test "podman mount - basic test" { # Only works with root (FIXME: does it work with rootless + vfs?) skip_if_rootless "mount does not work rootless" @@ -78,4 +77,107 @@ load helpers is "$output" "" "podman image mount, no args, after umount" } +@test "podman run --mount image" { + skip_if_rootless "too hard to test rootless" + + # Run a container with an image mount + run_podman run --rm --mount type=image,src=$IMAGE,dst=/image-mount $IMAGE diff /etc/os-release /image-mount/etc/os-release + + # Make sure the mount is read only + run_podman 1 run --rm --mount type=image,src=$IMAGE,dst=/image-mount $IMAGE touch /image-mount/read-only + is "$output" "touch: /image-mount/read-only: Read-only file system" + + # Make sure that rw,readwrite work + run_podman run --rm --mount type=image,src=$IMAGE,dst=/image-mount,rw=true $IMAGE touch /image-mount/readwrite + run_podman run --rm --mount type=image,src=$IMAGE,dst=/image-mount,readwrite=true $IMAGE touch /image-mount/readwrite + + skip_if_remote "mounting remote is meaningless" + + # The mount should be cleaned up during container removal as no other entity mounted the image + run_podman image umount $IMAGE + is "$output" "" "image mount should have been cleaned up during container removal" + + # Now make sure that the image mount is not cleaned up during container removal when another entity mounted the image + run_podman image mount $IMAGE + run_podman run --rm --mount type=image,src=$IMAGE,dst=/image-mount $IMAGE diff /etc/os-release /image-mount/etc/os-release + + run_podman image inspect --format '{{.ID}}' $IMAGE + iid="$output" + + run_podman image umount $IMAGE + is "$output" "$iid" "podman image umount: image ID of what was umounted" + + run_podman image umount $IMAGE + is "$output" "" "image mount should have been cleaned up via 'image umount'" + + # Run a container in the background (source is the ID instead of name) + run_podman run -d --mount type=image,src=$iid,dst=/image-mount,readwrite=true $IMAGE sleep infinity + cid="$output" + + # Unmount the image + run_podman image umount $IMAGE + is "$output" "$iid" "podman image umount: image ID of what was umounted" + run_podman image umount $IMAGE + is "$output" "" "image mount should have been cleaned up via 'image umount'" + + # Make sure that the mount in the container is unaffected + run_podman exec $cid diff /etc/os-release /image-mount/etc/os-release + run_podman exec $cid find /image-mount/etc/ + + # Clean up + run_podman rm -f $cid +} + +@test "podman run --mount image inspection" { + skip_if_rootless "too hard to test rootless" + + # Run a container in the background + run_podman run -d --mount type=image,src=$IMAGE,dst=/image-mount,rw=true $IMAGE sleep infinity + cid="$output" + + run_podman inspect --format "{{(index .Mounts 0).Type}}" $cid + is "$output" "image" "inspect data includes image mount type" + + run_podman inspect --format "{{(index .Mounts 0).Source}}" $cid + is "$output" "$IMAGE" "inspect data includes image mount source" + + run_podman inspect --format "{{(index .Mounts 0).Destination}}" $cid + is "$output" "/image-mount" "inspect data includes image mount source" + + run_podman inspect --format "{{(index .Mounts 0).RW}}" $cid + is "$output" "true" "inspect data includes image mount source" + + run_podman rm -f $cid +} + +@test "podman mount external container - basic test" { + # Only works with root (FIXME: does it work with rootless + vfs?) + skip_if_rootless "mount does not work rootless" + skip_if_remote "mounting remote is meaningless" + + # Create a container that podman does not know about + external_cid=$(buildah from $IMAGE) + + run_podman mount $external_cid + mount_path=$output + + # Test image will always have this file, and will always have the tag + test -d $mount_path + is $(< "$mount_path/home/podman/testimage-id") "$PODMAN_TEST_IMAGE_TAG" \ + "Contents of well-known file in image" + + # Make sure that 'podman mount' (no args) returns the expected path + run_podman mount --notruncate + + reported_mountpoint=$(echo "$output" | awk '{print $2}') + is $reported_mountpoint $mount_path "mountpoint reported by 'podman mount'" + + # umount, and make sure files are gone + run_podman umount $external_cid + if [ -d "$mount_path" ]; then + die "'podman umount' did not umount" + fi + buildah rm $external_cid +} + # vim: filetype=sh diff --git a/test/system/065-cp.bats b/test/system/065-cp.bats index a350c2173..6bf897790 100644 --- a/test/system/065-cp.bats +++ b/test/system/065-cp.bats @@ -148,7 +148,7 @@ load helpers is "$output" "" "output from podman cp 1" run_podman 125 cp --pause=false $srcdir/$rand_filename2 cpcontainer:/tmp/d2/x/ - is "$output" "Error: failed to get stat of dest path .*stat.* no such file or directory" "cp will not create nonexistent destination directory" + is "$output" ".*stat.* no such file or directory" "cp will not create nonexistent destination directory" run_podman cp --pause=false $srcdir/$rand_filename3 cpcontainer:/tmp/d3/x is "$output" "" "output from podman cp 3" diff --git a/test/system/070-build.bats b/test/system/070-build.bats index 0741357ed..83bcd13eb 100644 --- a/test/system/070-build.bats +++ b/test/system/070-build.bats @@ -221,6 +221,11 @@ EOF run_podman run --rm build_test pwd is "$output" "$workdir" "pwd command in container" + # Determine buildah version, so we can confirm it gets into Labels + run_podman info --format '{{ .Host.BuildahVersion }}' + is "$output" "[1-9][0-9.-]\+" ".Host.BuildahVersion is reasonable" + buildah_version=$output + # Confirm that 'podman inspect' shows the expected values # FIXME: can we rely on .Env[0] being PATH, and the rest being in order?? run_podman image inspect build_test @@ -239,6 +244,7 @@ Cmd[0] | /bin/mydefaultcmd Cmd[1] | $s_echo WorkingDir | $workdir Labels.$label_name | $label_value +Labels.\"io.buildah.version\" | $buildah_version " parse_table "$tests" | while read field expect; do @@ -312,6 +318,63 @@ EOF run_podman rmi -f build_test } +# #8092 - podman build should not gobble stdin (Fixes: #8066) +@test "podman build - does not gobble stdin that does not belong to it" { + random1=random1-$(random_string 12) + random2=random2-$(random_string 15) + random3=random3-$(random_string 12) + + tmpdir=$PODMAN_TMPDIR/build-test + mkdir -p $tmpdir + cat >$tmpdir/Containerfile <<EOF +FROM $IMAGE +RUN echo x${random2}y +EOF + + # This is a little rococo, bear with me please. #8092 fixed a bug + # in which 'podman build' would slurp up any input in the pipeline. + # Not a problem in a contrived example such as the one below, but + # definitely a problem when running commands in a pipeline to bash: + # all commands after 'podman build' would silently be ignored. + # In the test below, prior to #8092, the 'sed' would not get + # any input, and we would never see $random3 in the output. + # And, we use 'sed' to massage $random3 juuuuust on the remote + # chance that podman itself could pass stdin through. + results=$(echo $random3 | ( + echo $random1 + run_podman build -t build_test $tmpdir + sed -e 's/^/a/' -e 's/$/z/' + )) + + # First simple test: confirm that we see the piped-in string, as + # massaged by sed. This fails in 287edd4e2, the commit before #8092. + # We do this before the thorough test (below) because, should it + # fail, the diagnostic is much clearer and easier to understand. + is "$results" ".*a${random3}z" "stdin remains after podman-build" + + # More thorough test: verify all the required strings in order. + # This is unlikely to fail, but it costs us nothing and could + # catch a regression somewhere else. + # FIXME: podman-remote output differs from local: #8342 (spurious ^M) + # FIXME: podman-remote output differs from local: #8343 (extra SHA output) + remote_extra="" + if is_remote; then remote_extra=".*";fi + expect="${random1} +.* +STEP 1: FROM $IMAGE +STEP 2: RUN echo x${random2}y +x${random2}y${remote_extra} +STEP 3: COMMIT build_test${remote_extra} +--> [0-9a-f]\{11\} +[0-9a-f]\{64\} +a${random3}z" + + is "$results" "$expect" "Full output from 'podman build' pipeline" + + run_podman rmi -f build_test +} + + function teardown() { # A timeout or other error in 'build' can leave behind stale images # that podman can't even see and which will cascade into subsequent diff --git a/test/system/160-volumes.bats b/test/system/160-volumes.bats index 9f4bb76a2..0b7aab2fb 100644 --- a/test/system/160-volumes.bats +++ b/test/system/160-volumes.bats @@ -119,7 +119,7 @@ EOF # noexec option. This should fail. # ARGH. Unfortunately, runc (used for cgroups v1) produces a different error local expect_rc=126 - local expect_msg='.* OCI runtime permission denied.*' + local expect_msg='.* OCI permission denied.*' run_podman info --format '{{ .Host.OCIRuntime.Path }}' if expr "$output" : ".*/runc"; then expect_rc=1 @@ -162,7 +162,8 @@ EOF myvol=myvol$(random_string) rand=$(random_string) - run_podman run --rm -v $myvol:/myvol:z $IMAGE \ + # Duplicate "-v" confirms #8307, fix for double-lock on same volume + run_podman run --rm -v $myvol:/myvol:z -v $myvol:/myvol2:z $IMAGE \ sh -c "echo $rand >/myvol/myfile" run_podman volume ls -q is "$output" "$myvol" "autocreated named container persists" diff --git a/test/system/200-pod.bats b/test/system/200-pod.bats index 1d17c8cad..b0f645c53 100644 --- a/test/system/200-pod.bats +++ b/test/system/200-pod.bats @@ -116,6 +116,30 @@ function teardown() { run_podman 1 pod exists $podname } +@test "podman pod - communicating via /dev/shm " { + if is_remote && is_rootless; then + skip "FIXME: pending #7139" + fi + + podname=pod$(random_string) + run_podman 1 pod exists $podname + run_podman pod create --infra=true --name=$podname + podid="$output" + run_podman pod exists $podname + run_podman pod exists $podid + + run_podman run --rm --pod $podname $IMAGE touch /dev/shm/test1 + run_podman run --rm --pod $podname $IMAGE ls /dev/shm/test1 + is "$output" "/dev/shm/test1" + + # ...then rm the pod, then rmi the pause image so we don't leave strays. + run_podman pod rm $podname + + # Pod no longer exists + run_podman 1 pod exists $podid + run_podman 1 pod exists $podname +} + # Random byte function octet() { echo $(( $RANDOM & 255 )) |