mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			188 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			6.7 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"
 | 
						|
 | 
						|
    # Make sure that `mount -a` prints a table
 | 
						|
    run_podman image mount -a
 | 
						|
    is "$output" "$IMAGE .*$mount_path"
 | 
						|
 | 
						|
    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: -f since we mounted it twice
 | 
						|
    run_podman image umount -f $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 -t 0 -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 -t 0 -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
 |