mirror of
https://github.com/containers/podman
synced 2024-10-21 09:45:32 +00:00
6ca705bf1a
Continue progress on use of external containers. This PR adds the ability to mount, umount and list the storage containers whether they are in libpod or not. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
184 lines
6.6 KiB
Bash
184 lines
6.6 KiB
Bash
#!/usr/bin/env bats
|
|
|
|
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"
|
|
skip_if_remote "mounting remote is meaningless"
|
|
|
|
f_path=/tmp/tmpfile_$(random_string 8)
|
|
f_content=$(random_string 30)
|
|
|
|
c_name=mount_test_$(random_string 5)
|
|
run_podman run --name $c_name $IMAGE \
|
|
sh -c "echo $f_content > $f_path"
|
|
|
|
run_podman mount $c_name
|
|
mount_path=$output
|
|
|
|
test -d $mount_path
|
|
test -e "$mount_path/$f_path"
|
|
is $(< "$mount_path/$f_path") "$f_content" "contents of file, as read via fs"
|
|
|
|
# Make sure that 'podman mount' (no args) returns the expected path
|
|
run_podman mount --notruncate
|
|
# FIXME: is it worth the effort to validate the CID ($1) ?
|
|
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 $c_name
|
|
if [ -e "$mount_path/$f_path" ]; then
|
|
die "Mounted file exists even after umount: $mount_path/$f_path"
|
|
fi
|
|
}
|
|
|
|
|
|
@test "podman image mount" {
|
|
skip_if_remote "mounting remote is meaningless"
|
|
skip_if_rootless "too hard to test rootless"
|
|
|
|
# Start with clean slate
|
|
run_podman image umount -a
|
|
|
|
# Get full image ID, to verify umount
|
|
run_podman image inspect --format '{{.ID}}' $IMAGE
|
|
iid="$output"
|
|
|
|
# Mount, and make sure the mount point exists
|
|
run_podman image mount $IMAGE
|
|
mount_path="$output"
|
|
|
|
test -d $mount_path
|
|
|
|
# Image is custom-built and has a file containing the YMD tag. Check it.
|
|
testimage_file="/home/podman/testimage-id"
|
|
test -e "$mount_path$testimage_file"
|
|
is $(< "$mount_path$testimage_file") "$PODMAN_TEST_IMAGE_TAG" \
|
|
"Contents of $testimage_file in image"
|
|
|
|
# 'image mount', no args, tells us what's mounted
|
|
run_podman image mount
|
|
is "$output" "$IMAGE *$mount_path" "podman image mount with no args"
|
|
|
|
# Clean up
|
|
run_podman image umount $IMAGE
|
|
is "$output" "$iid" "podman image umount: image ID of what was umounted"
|
|
|
|
run_podman image umount $IMAGE
|
|
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" \
|
|
"error message from image umount no-such-container"
|
|
|
|
run_podman image mount
|
|
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
|