111a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env bash 29dd003a9SVladimir Sementsov-Ogievskiy# group: img 332a1681aSStefan Hajnoczi# 432a1681aSStefan Hajnoczi# qemu-img measure sub-command tests 532a1681aSStefan Hajnoczi# 632a1681aSStefan Hajnoczi# Copyright (C) 2017 Red Hat, Inc. 732a1681aSStefan Hajnoczi# 832a1681aSStefan Hajnoczi# This program is free software; you can redistribute it and/or modify 932a1681aSStefan Hajnoczi# it under the terms of the GNU General Public License as published by 1032a1681aSStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or 1132a1681aSStefan Hajnoczi# (at your option) any later version. 1232a1681aSStefan Hajnoczi# 1332a1681aSStefan Hajnoczi# This program is distributed in the hope that it will be useful, 1432a1681aSStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of 1532a1681aSStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1632a1681aSStefan Hajnoczi# GNU General Public License for more details. 1732a1681aSStefan Hajnoczi# 1832a1681aSStefan Hajnoczi# You should have received a copy of the GNU General Public License 1932a1681aSStefan Hajnoczi# along with this program. If not, see <http://www.gnu.org/licenses/>. 2032a1681aSStefan Hajnoczi# 2132a1681aSStefan Hajnoczi 2232a1681aSStefan Hajnoczi# creator 2332a1681aSStefan Hajnocziowner=stefanha@redhat.com 2432a1681aSStefan Hajnoczi 2532a1681aSStefan Hajnocziseq=`basename $0` 2632a1681aSStefan Hajnocziecho "QA output created by $seq" 2732a1681aSStefan Hajnoczi 2832a1681aSStefan Hajnoczistatus=1 # failure is the default! 2932a1681aSStefan Hajnoczi 3032a1681aSStefan Hajnoczi_cleanup() 3132a1681aSStefan Hajnoczi{ 3232a1681aSStefan Hajnoczi _cleanup_test_img 33f91ecbd7SMax Reitz _rm_test_img "$TEST_IMG.converted" 3432a1681aSStefan Hajnoczi} 3532a1681aSStefan Hajnoczitrap "_cleanup; exit \$status" 0 1 2 3 15 3632a1681aSStefan Hajnoczi 3732a1681aSStefan Hajnoczi# get standard environment, filters and checks 3832a1681aSStefan Hajnoczi. ./common.rc 3932a1681aSStefan Hajnoczi. ./common.filter 4032a1681aSStefan Hajnoczi. ./common.pattern 4132a1681aSStefan Hajnoczi 4232a1681aSStefan Hajnoczi_supported_fmt raw qcow2 4332a1681aSStefan Hajnoczi_supported_proto file 4432a1681aSStefan Hajnoczi_supported_os Linux 45d2a839edSMax Reitz_require_working_luks 4632a1681aSStefan Hajnoczi 4732a1681aSStefan Hajnocziecho "== Input validation ==" 4832a1681aSStefan Hajnocziecho 4932a1681aSStefan Hajnoczi 5032a1681aSStefan Hajnoczi_make_test_img 1G 5132a1681aSStefan Hajnoczi 5232a1681aSStefan Hajnoczi$QEMU_IMG measure # missing arguments 5332a1681aSStefan Hajnoczi$QEMU_IMG measure --size 2G "$TEST_IMG" # only one allowed 5432a1681aSStefan Hajnoczi$QEMU_IMG measure "$TEST_IMG" a # only one filename allowed 55c3673dcfSStefan Hajnoczi$QEMU_IMG measure --object secret,id=sec0,data=MTIzNDU2,format=base64 # size or filename needed 5632a1681aSStefan Hajnoczi$QEMU_IMG measure --image-opts # missing filename 5732a1681aSStefan Hajnoczi$QEMU_IMG measure -f qcow2 # missing filename 5832a1681aSStefan Hajnoczi$QEMU_IMG measure -l snap1 # missing filename 5932a1681aSStefan Hajnoczi$QEMU_IMG measure -o , # invalid option list 60*bb24cdc5SMax Reitz$QEMU_IMG measure -l snapshot.foo=bar # invalid snapshot option 6132a1681aSStefan Hajnoczi$QEMU_IMG measure --output foo # invalid output format 6232a1681aSStefan Hajnoczi$QEMU_IMG measure --size -1 # invalid image size 6332a1681aSStefan Hajnoczi$QEMU_IMG measure -O foo "$TEST_IMG" # unknown image file format 6432a1681aSStefan Hajnoczi 6532a1681aSStefan Hajnoczimake_test_img_with_fmt() { 6632a1681aSStefan Hajnoczi # Shadow global variables within this function 6710b61256SMax Reitz local IMGFMT="$1" 6810b61256SMax Reitz _make_test_img --no-opts "$2" 6932a1681aSStefan Hajnoczi} 7032a1681aSStefan Hajnoczi 7132a1681aSStefan Hajnocziqemu_io_with_fmt() { 7232a1681aSStefan Hajnoczi # Shadow global variables within this function 7332a1681aSStefan Hajnoczi local QEMU_IO_OPTIONS=$(echo "$QEMU_IO_OPTIONS" | sed "s/-f $IMGFMT/-f $1/") 7432a1681aSStefan Hajnoczi shift 7532a1681aSStefan Hajnoczi $QEMU_IO "$@" 7632a1681aSStefan Hajnoczi} 7732a1681aSStefan Hajnoczi 7832a1681aSStefan Hajnoczi# The proof is in the pudding: converted image size cannot be larger than the 7932a1681aSStefan Hajnoczi# required size. 8032a1681aSStefan Hajnoczi# 8132a1681aSStefan Hajnoczi# Note: if a change to the image format code causes the file size to change, 8232a1681aSStefan Hajnoczi# then this test fails! This is good because it's a reminder to check that the 8332a1681aSStefan Hajnoczi# required size is still at least as big as the actual converted file size. 8432a1681aSStefan Hajnocziconvert_and_show_size() { 8532a1681aSStefan Hajnoczi local fmt="$1" 8632a1681aSStefan Hajnoczi shift 8732a1681aSStefan Hajnoczi $QEMU_IMG convert -f "$fmt" -O "$IMGFMT" "$TEST_IMG" "$@" "$TEST_IMG.converted" 8832a1681aSStefan Hajnoczi stat -c "converted image file size in bytes: %s" "$TEST_IMG.converted" 8932a1681aSStefan Hajnoczi} 9032a1681aSStefan Hajnoczi 9132a1681aSStefan Hajnoczifor ofmt in human json; do 9232a1681aSStefan Hajnoczi echo 9332a1681aSStefan Hajnoczi echo "== Size calculation for a new file ($ofmt) ==" 9432a1681aSStefan Hajnoczi echo 9532a1681aSStefan Hajnoczi 9632a1681aSStefan Hajnoczi # Try a few interesting sizes 9732a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 0 9832a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 2G 9932a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 64G 10032a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 256G 10132a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 1T 10232a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 2P 10332a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -O "$IMGFMT" --size 7E 10432a1681aSStefan Hajnoczi 10532a1681aSStefan Hajnoczi # Always test the raw input files but also IMGFMT 10632a1681aSStefan Hajnoczi for fmt in $(echo -e "raw\n$IMGFMT\n" | sort -u); do 10732a1681aSStefan Hajnoczi echo 10832a1681aSStefan Hajnoczi echo "== Empty $fmt input image ($ofmt) ==" 10932a1681aSStefan Hajnoczi echo 11032a1681aSStefan Hajnoczi make_test_img_with_fmt "$fmt" 0 11132a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 11232a1681aSStefan Hajnoczi echo 11332a1681aSStefan Hajnoczi convert_and_show_size "$fmt" 11432a1681aSStefan Hajnoczi 11532a1681aSStefan Hajnoczi echo 11632a1681aSStefan Hajnoczi echo "== $fmt input image with data ($ofmt) ==" 11732a1681aSStefan Hajnoczi echo 11832a1681aSStefan Hajnoczi make_test_img_with_fmt "$fmt" 1G 11932a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 12032a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 512 512" "$TEST_IMG" | _filter_qemu_io 12132a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 64K 64K" "$TEST_IMG" | _filter_qemu_io 12232a1681aSStefan Hajnoczi if [ "$fmt" = "qcow2" ]; then 12332a1681aSStefan Hajnoczi $QEMU_IMG snapshot -c snapshot1 "$TEST_IMG" 12432a1681aSStefan Hajnoczi fi 12532a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 128M 63K" "$TEST_IMG" | _filter_qemu_io 12632a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 12732a1681aSStefan Hajnoczi echo 12832a1681aSStefan Hajnoczi convert_and_show_size "$fmt" 12932a1681aSStefan Hajnoczi 13032a1681aSStefan Hajnoczi if [ "$fmt" = "qcow2" ]; then 13132a1681aSStefan Hajnoczi echo 13232a1681aSStefan Hajnoczi echo "== $fmt input image with internal snapshot ($ofmt) ==" 13332a1681aSStefan Hajnoczi echo 13432a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -l snapshot1 \ 13532a1681aSStefan Hajnoczi -O "$IMGFMT" "$TEST_IMG" 13632a1681aSStefan Hajnoczi echo 13732a1681aSStefan Hajnoczi convert_and_show_size "$fmt" -l snapshot1 13832a1681aSStefan Hajnoczi fi 13932a1681aSStefan Hajnoczi 14032a1681aSStefan Hajnoczi if [ "$IMGFMT" = "qcow2" ]; then 14132a1681aSStefan Hajnoczi echo 14232a1681aSStefan Hajnoczi echo "== $fmt input image and a backing file ($ofmt) ==" 14332a1681aSStefan Hajnoczi echo 14432a1681aSStefan Hajnoczi # The backing file doesn't need to exist :) 14532a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -o backing_file=x \ 14632a1681aSStefan Hajnoczi -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 14704820986SStefan Hajnoczi 14804820986SStefan Hajnoczi echo 14904820986SStefan Hajnoczi echo "== $fmt input image and LUKS encryption ==" 15004820986SStefan Hajnoczi echo 15104820986SStefan Hajnoczi $QEMU_IMG measure --output=$ofmt \ 15204820986SStefan Hajnoczi --object secret,id=sec0,data=base \ 15304820986SStefan Hajnoczi -o encrypt.format=luks,encrypt.key-secret=sec0,encrypt.iter-time=10 \ 15404820986SStefan Hajnoczi -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 15532a1681aSStefan Hajnoczi fi 15632a1681aSStefan Hajnoczi 15732a1681aSStefan Hajnoczi echo 15832a1681aSStefan Hajnoczi echo "== $fmt input image and preallocation ($ofmt) ==" 15932a1681aSStefan Hajnoczi echo 16032a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -o preallocation=full \ 16132a1681aSStefan Hajnoczi -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 16232a1681aSStefan Hajnoczi echo 16332a1681aSStefan Hajnoczi convert_and_show_size "$fmt" -o preallocation=full 16432a1681aSStefan Hajnoczi 16532a1681aSStefan Hajnoczi echo 16632a1681aSStefan Hajnoczi echo "== Fully-allocated $fmt input image ($ofmt) ==" 16732a1681aSStefan Hajnoczi echo 16832a1681aSStefan Hajnoczi make_test_img_with_fmt "$fmt" 8M 16932a1681aSStefan Hajnoczi qemu_io_with_fmt "$fmt" -c "write 0 8M" "$TEST_IMG" | _filter_qemu_io 17032a1681aSStefan Hajnoczi $QEMU_IMG measure --output=$ofmt -f "$fmt" -O "$IMGFMT" "$TEST_IMG" 17132a1681aSStefan Hajnoczi echo 17232a1681aSStefan Hajnoczi convert_and_show_size "$fmt" 17332a1681aSStefan Hajnoczi done 17432a1681aSStefan Hajnoczidone 17532a1681aSStefan Hajnoczi 17632a1681aSStefan Hajnoczi# success, all done 17732a1681aSStefan Hajnocziecho "*** done" 17832a1681aSStefan Hajnoczirm -f $seq.full 17932a1681aSStefan Hajnoczistatus=0 180