1*b7de0777SKevin Wolf#!/bin/bash 2*b7de0777SKevin Wolf# 3*b7de0777SKevin Wolf# Test VDI and file image creation 4*b7de0777SKevin Wolf# 5*b7de0777SKevin Wolf# Copyright (C) 2018 Red Hat, Inc. 6*b7de0777SKevin Wolf# 7*b7de0777SKevin Wolf# This program is free software; you can redistribute it and/or modify 8*b7de0777SKevin Wolf# it under the terms of the GNU General Public License as published by 9*b7de0777SKevin Wolf# the Free Software Foundation; either version 2 of the License, or 10*b7de0777SKevin Wolf# (at your option) any later version. 11*b7de0777SKevin Wolf# 12*b7de0777SKevin Wolf# This program is distributed in the hope that it will be useful, 13*b7de0777SKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*b7de0777SKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*b7de0777SKevin Wolf# GNU General Public License for more details. 16*b7de0777SKevin Wolf# 17*b7de0777SKevin Wolf# You should have received a copy of the GNU General Public License 18*b7de0777SKevin Wolf# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*b7de0777SKevin Wolf# 20*b7de0777SKevin Wolf 21*b7de0777SKevin Wolf# creator 22*b7de0777SKevin Wolfowner=kwolf@redhat.com 23*b7de0777SKevin Wolf 24*b7de0777SKevin Wolfseq=`basename $0` 25*b7de0777SKevin Wolfecho "QA output created by $seq" 26*b7de0777SKevin Wolf 27*b7de0777SKevin Wolfhere=`pwd` 28*b7de0777SKevin Wolfstatus=1 # failure is the default! 29*b7de0777SKevin Wolf 30*b7de0777SKevin Wolf# get standard environment, filters and checks 31*b7de0777SKevin Wolf. ./common.rc 32*b7de0777SKevin Wolf. ./common.filter 33*b7de0777SKevin Wolf 34*b7de0777SKevin Wolf_supported_fmt vdi 35*b7de0777SKevin Wolf_supported_proto file 36*b7de0777SKevin Wolf_supported_os Linux 37*b7de0777SKevin Wolf 38*b7de0777SKevin Wolffunction do_run_qemu() 39*b7de0777SKevin Wolf{ 40*b7de0777SKevin Wolf echo Testing: "$@" 41*b7de0777SKevin Wolf $QEMU -nographic -qmp stdio -serial none "$@" 42*b7de0777SKevin Wolf echo 43*b7de0777SKevin Wolf} 44*b7de0777SKevin Wolf 45*b7de0777SKevin Wolffunction run_qemu() 46*b7de0777SKevin Wolf{ 47*b7de0777SKevin Wolf do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \ 48*b7de0777SKevin Wolf | _filter_qemu | _filter_imgfmt \ 49*b7de0777SKevin Wolf | _filter_actual_image_size 50*b7de0777SKevin Wolf} 51*b7de0777SKevin Wolf 52*b7de0777SKevin Wolfecho 53*b7de0777SKevin Wolfecho "=== Successful image creation (defaults) ===" 54*b7de0777SKevin Wolfecho 55*b7de0777SKevin Wolf 56*b7de0777SKevin Wolfsize=$((128 * 1024 * 1024)) 57*b7de0777SKevin Wolf 58*b7de0777SKevin Wolfrun_qemu <<EOF 59*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 60*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 61*b7de0777SKevin Wolf "arguments": { 62*b7de0777SKevin Wolf "driver": "file", 63*b7de0777SKevin Wolf "filename": "$TEST_IMG", 64*b7de0777SKevin Wolf "size": 0 65*b7de0777SKevin Wolf } 66*b7de0777SKevin Wolf} 67*b7de0777SKevin Wolf{ "execute": "blockdev-add", 68*b7de0777SKevin Wolf "arguments": { 69*b7de0777SKevin Wolf "driver": "file", 70*b7de0777SKevin Wolf "node-name": "imgfile", 71*b7de0777SKevin Wolf "filename": "$TEST_IMG" 72*b7de0777SKevin Wolf } 73*b7de0777SKevin Wolf} 74*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 75*b7de0777SKevin Wolf "arguments": { 76*b7de0777SKevin Wolf "driver": "$IMGFMT", 77*b7de0777SKevin Wolf "file": "imgfile", 78*b7de0777SKevin Wolf "size": $size 79*b7de0777SKevin Wolf } 80*b7de0777SKevin Wolf} 81*b7de0777SKevin Wolf{ "execute": "quit" } 82*b7de0777SKevin WolfEOF 83*b7de0777SKevin Wolf 84*b7de0777SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific 85*b7de0777SKevin Wolf$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 86*b7de0777SKevin Wolf 87*b7de0777SKevin Wolfecho 88*b7de0777SKevin Wolfecho "=== Successful image creation (explicit defaults) ===" 89*b7de0777SKevin Wolfecho 90*b7de0777SKevin Wolf 91*b7de0777SKevin Wolf# Choose a different size to show that we got a new image 92*b7de0777SKevin Wolfsize=$((64 * 1024 * 1024)) 93*b7de0777SKevin Wolf 94*b7de0777SKevin Wolfrun_qemu <<EOF 95*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 96*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 97*b7de0777SKevin Wolf "arguments": { 98*b7de0777SKevin Wolf "driver": "file", 99*b7de0777SKevin Wolf "filename": "$TEST_IMG", 100*b7de0777SKevin Wolf "size": 0 101*b7de0777SKevin Wolf } 102*b7de0777SKevin Wolf} 103*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 104*b7de0777SKevin Wolf "arguments": { 105*b7de0777SKevin Wolf "driver": "$IMGFMT", 106*b7de0777SKevin Wolf "file": { 107*b7de0777SKevin Wolf "driver": "file", 108*b7de0777SKevin Wolf "filename": "$TEST_IMG" 109*b7de0777SKevin Wolf }, 110*b7de0777SKevin Wolf "size": $size, 111*b7de0777SKevin Wolf "preallocation": "off" 112*b7de0777SKevin Wolf } 113*b7de0777SKevin Wolf} 114*b7de0777SKevin Wolf{ "execute": "quit" } 115*b7de0777SKevin WolfEOF 116*b7de0777SKevin Wolf 117*b7de0777SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific 118*b7de0777SKevin Wolf$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 119*b7de0777SKevin Wolf 120*b7de0777SKevin Wolfecho 121*b7de0777SKevin Wolfecho "=== Successful image creation (with non-default options) ===" 122*b7de0777SKevin Wolfecho 123*b7de0777SKevin Wolf 124*b7de0777SKevin Wolf# Choose a different size to show that we got a new image 125*b7de0777SKevin Wolfsize=$((32 * 1024 * 1024)) 126*b7de0777SKevin Wolf 127*b7de0777SKevin Wolfrun_qemu <<EOF 128*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 129*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 130*b7de0777SKevin Wolf "arguments": { 131*b7de0777SKevin Wolf "driver": "file", 132*b7de0777SKevin Wolf "filename": "$TEST_IMG", 133*b7de0777SKevin Wolf "size": 0 134*b7de0777SKevin Wolf } 135*b7de0777SKevin Wolf} 136*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 137*b7de0777SKevin Wolf "arguments": { 138*b7de0777SKevin Wolf "driver": "$IMGFMT", 139*b7de0777SKevin Wolf "file": { 140*b7de0777SKevin Wolf "driver": "file", 141*b7de0777SKevin Wolf "filename": "$TEST_IMG" 142*b7de0777SKevin Wolf }, 143*b7de0777SKevin Wolf "size": $size, 144*b7de0777SKevin Wolf "preallocation": "metadata" 145*b7de0777SKevin Wolf } 146*b7de0777SKevin Wolf} 147*b7de0777SKevin Wolf{ "execute": "quit" } 148*b7de0777SKevin WolfEOF 149*b7de0777SKevin Wolf 150*b7de0777SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific 151*b7de0777SKevin Wolf$QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map 152*b7de0777SKevin Wolf 153*b7de0777SKevin Wolfecho 154*b7de0777SKevin Wolfecho "=== Invalid BlockdevRef ===" 155*b7de0777SKevin Wolfecho 156*b7de0777SKevin Wolf 157*b7de0777SKevin Wolfrun_qemu <<EOF 158*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 159*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 160*b7de0777SKevin Wolf "arguments": { 161*b7de0777SKevin Wolf "driver": "$IMGFMT", 162*b7de0777SKevin Wolf "file": "this doesn't exist", 163*b7de0777SKevin Wolf "size": $size 164*b7de0777SKevin Wolf } 165*b7de0777SKevin Wolf} 166*b7de0777SKevin Wolf{ "execute": "quit" } 167*b7de0777SKevin WolfEOF 168*b7de0777SKevin Wolf 169*b7de0777SKevin Wolfecho 170*b7de0777SKevin Wolfecho "=== Zero size ===" 171*b7de0777SKevin Wolfecho 172*b7de0777SKevin Wolf 173*b7de0777SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 174*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 175*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 176*b7de0777SKevin Wolf "arguments": { 177*b7de0777SKevin Wolf "driver": "$IMGFMT", 178*b7de0777SKevin Wolf "file": "node0", 179*b7de0777SKevin Wolf "size": 0 180*b7de0777SKevin Wolf } 181*b7de0777SKevin Wolf} 182*b7de0777SKevin Wolf{ "execute": "quit" } 183*b7de0777SKevin WolfEOF 184*b7de0777SKevin Wolf 185*b7de0777SKevin Wolf_img_info | _filter_img_info 186*b7de0777SKevin Wolf 187*b7de0777SKevin Wolfecho 188*b7de0777SKevin Wolfecho "=== Maximum size ===" 189*b7de0777SKevin Wolfecho 190*b7de0777SKevin Wolf 191*b7de0777SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 192*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 193*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 194*b7de0777SKevin Wolf "arguments": { 195*b7de0777SKevin Wolf "driver": "$IMGFMT", 196*b7de0777SKevin Wolf "file": "node0", 197*b7de0777SKevin Wolf "size": 562949819203584 198*b7de0777SKevin Wolf } 199*b7de0777SKevin Wolf} 200*b7de0777SKevin Wolf{ "execute": "quit" } 201*b7de0777SKevin WolfEOF 202*b7de0777SKevin Wolf 203*b7de0777SKevin Wolf_img_info | _filter_img_info 204*b7de0777SKevin Wolf 205*b7de0777SKevin Wolfecho 206*b7de0777SKevin Wolfecho "=== Invalid sizes ===" 207*b7de0777SKevin Wolfecho 208*b7de0777SKevin Wolf 209*b7de0777SKevin Wolf# TODO Negative image sizes aren't handled correctly, but this is a problem 210*b7de0777SKevin Wolf# with QAPI's implementation of the 'size' type and affects other commands as 211*b7de0777SKevin Wolf# well. Once this is fixed, we may want to add a test case here. 212*b7de0777SKevin Wolf 213*b7de0777SKevin Wolf# 1. 2^64 - 512 214*b7de0777SKevin Wolf# 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this) 215*b7de0777SKevin Wolf# 3. 0x1fffff8000001 (one byte more than maximum image size for VDI) 216*b7de0777SKevin Wolf 217*b7de0777SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 218*b7de0777SKevin Wolf{ "execute": "qmp_capabilities" } 219*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 220*b7de0777SKevin Wolf "arguments": { 221*b7de0777SKevin Wolf "driver": "$IMGFMT", 222*b7de0777SKevin Wolf "file": "node0", 223*b7de0777SKevin Wolf "size": 18446744073709551104 224*b7de0777SKevin Wolf } 225*b7de0777SKevin Wolf} 226*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 227*b7de0777SKevin Wolf "arguments": { 228*b7de0777SKevin Wolf "driver": "$IMGFMT", 229*b7de0777SKevin Wolf "file": "node0", 230*b7de0777SKevin Wolf "size": 9223372036854775808 231*b7de0777SKevin Wolf } 232*b7de0777SKevin Wolf} 233*b7de0777SKevin Wolf{ "execute": "x-blockdev-create", 234*b7de0777SKevin Wolf "arguments": { 235*b7de0777SKevin Wolf "driver": "$IMGFMT", 236*b7de0777SKevin Wolf "file": "node0", 237*b7de0777SKevin Wolf "size": 562949819203585 238*b7de0777SKevin Wolf } 239*b7de0777SKevin Wolf} 240*b7de0777SKevin Wolf{ "execute": "quit" } 241*b7de0777SKevin WolfEOF 242*b7de0777SKevin Wolf 243*b7de0777SKevin Wolf# success, all done 244*b7de0777SKevin Wolfecho "*** done" 245*b7de0777SKevin Wolfrm -f $seq.full 246*b7de0777SKevin Wolfstatus=0 247