mirror of https://github.com/containers/podman.git
163 lines
6.0 KiB
Bash
163 lines
6.0 KiB
Bash
#!/usr/bin/env bats -*- bats -*-
|
|
#
|
|
# tests for podman system df
|
|
#
|
|
# DO NOT PARALLELIZE. All of these tests require complete control of images.
|
|
#
|
|
|
|
load helpers
|
|
|
|
function setup_file() {
|
|
# Pristine setup: no pods, containers, volumes, images
|
|
run_podman pod rm -a -f
|
|
run_podman rm -f -a -t0
|
|
run_podman volume rm -a
|
|
run_podman image rm -f -a
|
|
|
|
_prefetch $IMAGE
|
|
}
|
|
|
|
@test "podman system df - basic functionality" {
|
|
run_podman system df
|
|
is "$output" ".*Images *1 *0 " "Exactly one image"
|
|
is "$output" ".*Containers *0 *0 " "No containers"
|
|
is "$output" ".*Local Volumes *0 *0 " "No volumes"
|
|
}
|
|
|
|
@test "podman system df --format {{ json . }} functionality" {
|
|
run_podman system df --format '{{json .}}'
|
|
is "$output" '.*"TotalCount":1' "Exactly one image"
|
|
is "$output" '.*"RawSize".*"Size"' "RawSize and Size reported"
|
|
is "$output" '.*"RawReclaimable".*"Reclaimable"' "RawReclaimable and Reclaimable reported"
|
|
is "$output" '.*"Containers".*"Total":0' "Total containers reported"
|
|
is "$output" '.*"Local Volumes".*"Size":"0B"' "Total containers reported"
|
|
is "$output" '.*"Local Volumes".*"Size":"0B"' "Total containers reported"
|
|
}
|
|
|
|
@test "podman system df --format json functionality" {
|
|
# Run two dummy containers, one which exits, one which stays running
|
|
cname_stopped=c-stopped-$(safename)
|
|
cname_running=c-running-$(safename)
|
|
|
|
run_podman run --name $cname_stopped $IMAGE true
|
|
run_podman run -d --name $cname_running $IMAGE top
|
|
run_podman system df --format json
|
|
local results="$output"
|
|
|
|
# FIXME! This needs to be fiddled with every time we bump testimage.
|
|
local size=12
|
|
if [[ "$(uname -m)" = "aarch64" ]]; then
|
|
size=14
|
|
fi
|
|
|
|
# FIXME: we can't check exact RawSize or Size because every CI system
|
|
# computes a different value: 12701526, 12702113, 12706209... and
|
|
# those are all amd64. aarch64 gets 12020148, 12019561.
|
|
#
|
|
# WARNING: RawSize and Size tests may fail if $IMAGE is updated. Since
|
|
# that tends to be done yearly or less, and only by Ed, that's OK.
|
|
local tests="
|
|
Type | Images | Containers | Local Volumes
|
|
Total | 1 | 2 | 0
|
|
Active | 1 | 1 | 0
|
|
RawSize | ~${size}...... | !0 | 0
|
|
RawReclaimable | 0 | !0 | 0
|
|
Reclaimable | ~\(0%\) | ~\(50%\) | ~\(0%\)
|
|
TotalCount | 1 | 2 | 0
|
|
Size | ~${size}.*MB | !0B | 0B
|
|
"
|
|
while read -a fields; do
|
|
for i in 0 1 2;do
|
|
expect="${fields[$((i+1))]}"
|
|
actual=$(jq -r ".[$i].${fields[0]}" <<<"$results")
|
|
|
|
# Do exact-match check, unless the expect term starts with ~ or !
|
|
op='='
|
|
if [[ "$expect" =~ ^\! ]]; then
|
|
op='!='
|
|
expect=${expect##\!}
|
|
fi
|
|
if [[ "$expect" =~ ^~ ]]; then
|
|
op='=~'
|
|
expect=${expect##\~}
|
|
fi
|
|
|
|
assert "$actual" "$op" "$expect" "system df[$i].${fields[0]}"
|
|
done
|
|
done < <(parse_table "$tests")
|
|
|
|
# Clean up
|
|
run_podman rm -f -t 0 $cname_stopped $cname_running
|
|
}
|
|
|
|
@test "podman system df - with active containers and volumes" {
|
|
c1=c1-$(safename)
|
|
c2=c2-$(safename)
|
|
run_podman run -v /myvol1 --name $c1 $IMAGE true
|
|
run_podman run -d -v /myvol2 --name $c2 $IMAGE top
|
|
|
|
run_podman system df --format '{{ .Type }}:{{ .Total }}:{{ .Active }}'
|
|
is "${lines[0]}" "Images:1:1" "system df : Images line"
|
|
is "${lines[1]}" "Containers:2:1" "system df : Containers line"
|
|
is "${lines[2]}" "Local Volumes:2:2" "system df : Volumes line"
|
|
|
|
# Try -v. (Grrr. No way to specify individual formats)
|
|
#
|
|
# Yes, I know this would be more elegant as a separate @test, but
|
|
# container/volume setup/teardown costs ~3 seconds and that matters.
|
|
run_podman system df -v
|
|
is "${lines[2]}" \
|
|
"${PODMAN_TEST_IMAGE_REGISTRY}/${PODMAN_TEST_IMAGE_USER}/${PODMAN_TEST_IMAGE_NAME} * ${PODMAN_TEST_IMAGE_TAG} [0-9a-f]* .* 2" \
|
|
"system df -v: the 'Images' line"
|
|
|
|
# Containers are listed in random order. Just check that each has 1 volume
|
|
is "${lines[5]}" \
|
|
"[0-9a-f]\{12\} *[0-9a-f]\{12\} .* 1 .* c[12]-$(safename)" \
|
|
"system df -v, 'Containers', first line"
|
|
is "${lines[6]}" \
|
|
"[0-9a-f]\{12\} *[0-9a-f]\{12\} .* 1 .* c[12]-$(safename)" \
|
|
"system df -v, 'Containers', second line"
|
|
|
|
# Volumes, likewise: random order.
|
|
is "${lines[9]}" "[0-9a-f]\{64\} *[01] * 0B" \
|
|
"system df -v, 'Volumes', first line"
|
|
is "${lines[10]}" "[0-9a-f]\{64\} *[01] * 0B" \
|
|
"system df -v, 'Volumes', second line"
|
|
|
|
# Make sure that the return image "raw" size is correct
|
|
run_podman image inspect $IMAGE --format "{{.Size}}"
|
|
expectedSize="$output"
|
|
|
|
run_podman system df --format "{{.RawSize}}"
|
|
is "${lines[0]}" "$expectedSize" "raw image size is correct"
|
|
|
|
# Clean up and check reclaimable image data
|
|
run_podman system df --format '{{.Reclaimable}}'
|
|
is "${lines[0]}" "0B (0%)" "cannot reclaim image data as it's still used by the containers"
|
|
|
|
run_podman stop $c2
|
|
|
|
# Create a second image by committing a container.
|
|
run_podman container commit -q $c1
|
|
image="$output"
|
|
|
|
run_podman system df --format '{{.Reclaimable}}'
|
|
is "${lines[0]}" ".* (100%)" "100 percent of image data is reclaimable because $IMAGE has unique size of 0"
|
|
|
|
# Make sure the unique size is now really 0. We cannot use --format for
|
|
# that unfortunately but we can exploit the fact that $IMAGE is used by
|
|
# two containers.
|
|
run_podman system df -v
|
|
is "$output" ".*0B\\s\\+2.*"
|
|
|
|
run_podman rm $c1 $c2
|
|
|
|
run_podman system df --format '{{.Reclaimable}}'
|
|
is "${lines[0]}" ".* (100%)" "100 percent of image data is reclaimable because all containers are gone"
|
|
|
|
run_podman rmi $image
|
|
run_podman volume rm -a
|
|
}
|
|
|
|
# vim: filetype=sh
|