mirror of
https://github.com/containers/podman
synced 2024-10-20 17:23:30 +00:00
0f7d54b026
Migrate the Podman code base over to `common/libimage` which replaces `libpod/image` and a lot of glue code entirely. Note that I tried to leave bread crumbs for changed tests. Miscellaneous changes: * Some errors yield different messages which required to alter some tests. * I fixed some pre-existing issues in the code. Others were marked as `//TODO`s to prevent the PR from exploding. * The `NamesHistory` of an image is returned as is from the storage. Previously, we did some filtering which I think is undesirable. Instead we should return the data as stored in the storage. * Touched handlers use the ABI interfaces where possible. * Local image resolution: previously Podman would match "foo" on "myfoo". This behaviour has been changed and Podman will now only match on repository boundaries such that "foo" would match "my/foo" but not "myfoo". I consider the old behaviour to be a bug, at the very least an exotic corner case. * Futhermore, "foo:none" does *not* resolve to a local image "foo" without tag anymore. It's a hill I am (almost) willing to die on. * `image prune` prints the IDs of pruned images. Previously, in some cases, the names were printed instead. The API clearly states ID, so we should stick to it. * Compat endpoint image removal with _force_ deletes the entire not only the specified tag. Signed-off-by: Valentin Rothberg <rothberg@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: no-such-container: image not known" \
|
|
"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
|