1*0b7e7f66SKevin Wolf#!/bin/bash 2*0b7e7f66SKevin Wolf# 3*0b7e7f66SKevin Wolf# Test vhdx and file image creation 4*0b7e7f66SKevin Wolf# 5*0b7e7f66SKevin Wolf# Copyright (C) 2018 Red Hat, Inc. 6*0b7e7f66SKevin Wolf# 7*0b7e7f66SKevin Wolf# This program is free software; you can redistribute it and/or modify 8*0b7e7f66SKevin Wolf# it under the terms of the GNU General Public License as published by 9*0b7e7f66SKevin Wolf# the Free Software Foundation; either version 2 of the License, or 10*0b7e7f66SKevin Wolf# (at your option) any later version. 11*0b7e7f66SKevin Wolf# 12*0b7e7f66SKevin Wolf# This program is distributed in the hope that it will be useful, 13*0b7e7f66SKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*0b7e7f66SKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*0b7e7f66SKevin Wolf# GNU General Public License for more details. 16*0b7e7f66SKevin Wolf# 17*0b7e7f66SKevin Wolf# You should have received a copy of the GNU General Public License 18*0b7e7f66SKevin Wolf# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*0b7e7f66SKevin Wolf# 20*0b7e7f66SKevin Wolf 21*0b7e7f66SKevin Wolf# creator 22*0b7e7f66SKevin Wolfowner=kwolf@redhat.com 23*0b7e7f66SKevin Wolf 24*0b7e7f66SKevin Wolfseq=`basename $0` 25*0b7e7f66SKevin Wolfecho "QA output created by $seq" 26*0b7e7f66SKevin Wolf 27*0b7e7f66SKevin Wolfhere=`pwd` 28*0b7e7f66SKevin Wolfstatus=1 # failure is the default! 29*0b7e7f66SKevin Wolf 30*0b7e7f66SKevin Wolf# get standard environment, filters and checks 31*0b7e7f66SKevin Wolf. ./common.rc 32*0b7e7f66SKevin Wolf. ./common.filter 33*0b7e7f66SKevin Wolf 34*0b7e7f66SKevin Wolf_supported_fmt vhdx 35*0b7e7f66SKevin Wolf_supported_proto file 36*0b7e7f66SKevin Wolf_supported_os Linux 37*0b7e7f66SKevin Wolf 38*0b7e7f66SKevin Wolffunction do_run_qemu() 39*0b7e7f66SKevin Wolf{ 40*0b7e7f66SKevin Wolf echo Testing: "$@" 41*0b7e7f66SKevin Wolf $QEMU -nographic -qmp stdio -serial none "$@" 42*0b7e7f66SKevin Wolf echo 43*0b7e7f66SKevin Wolf} 44*0b7e7f66SKevin Wolf 45*0b7e7f66SKevin Wolffunction run_qemu() 46*0b7e7f66SKevin Wolf{ 47*0b7e7f66SKevin Wolf do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \ 48*0b7e7f66SKevin Wolf | _filter_qemu | _filter_imgfmt \ 49*0b7e7f66SKevin Wolf | _filter_actual_image_size 50*0b7e7f66SKevin Wolf} 51*0b7e7f66SKevin Wolf 52*0b7e7f66SKevin Wolfecho 53*0b7e7f66SKevin Wolfecho "=== Successful image creation (defaults) ===" 54*0b7e7f66SKevin Wolfecho 55*0b7e7f66SKevin Wolf 56*0b7e7f66SKevin Wolfsize=$((128 * 1024 * 1024)) 57*0b7e7f66SKevin Wolf 58*0b7e7f66SKevin Wolfrun_qemu <<EOF 59*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 60*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 61*0b7e7f66SKevin Wolf "arguments": { 62*0b7e7f66SKevin Wolf "driver": "file", 63*0b7e7f66SKevin Wolf "filename": "$TEST_IMG", 64*0b7e7f66SKevin Wolf "size": 0 65*0b7e7f66SKevin Wolf } 66*0b7e7f66SKevin Wolf} 67*0b7e7f66SKevin Wolf{ "execute": "blockdev-add", 68*0b7e7f66SKevin Wolf "arguments": { 69*0b7e7f66SKevin Wolf "driver": "file", 70*0b7e7f66SKevin Wolf "node-name": "imgfile", 71*0b7e7f66SKevin Wolf "filename": "$TEST_IMG" 72*0b7e7f66SKevin Wolf } 73*0b7e7f66SKevin Wolf} 74*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 75*0b7e7f66SKevin Wolf "arguments": { 76*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 77*0b7e7f66SKevin Wolf "file": "imgfile", 78*0b7e7f66SKevin Wolf "size": $size 79*0b7e7f66SKevin Wolf } 80*0b7e7f66SKevin Wolf} 81*0b7e7f66SKevin Wolf{ "execute": "quit" } 82*0b7e7f66SKevin WolfEOF 83*0b7e7f66SKevin Wolf 84*0b7e7f66SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific 85*0b7e7f66SKevin Wolf 86*0b7e7f66SKevin Wolfecho 87*0b7e7f66SKevin Wolfecho "=== Successful image creation (explicit defaults) ===" 88*0b7e7f66SKevin Wolfecho 89*0b7e7f66SKevin Wolf 90*0b7e7f66SKevin Wolf# Choose a different size to show that we got a new image 91*0b7e7f66SKevin Wolfsize=$((64 * 1024 * 1024)) 92*0b7e7f66SKevin Wolf 93*0b7e7f66SKevin Wolfrun_qemu <<EOF 94*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 95*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 96*0b7e7f66SKevin Wolf "arguments": { 97*0b7e7f66SKevin Wolf "driver": "file", 98*0b7e7f66SKevin Wolf "filename": "$TEST_IMG", 99*0b7e7f66SKevin Wolf "size": 0 100*0b7e7f66SKevin Wolf } 101*0b7e7f66SKevin Wolf} 102*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 103*0b7e7f66SKevin Wolf "arguments": { 104*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 105*0b7e7f66SKevin Wolf "file": { 106*0b7e7f66SKevin Wolf "driver": "file", 107*0b7e7f66SKevin Wolf "filename": "$TEST_IMG" 108*0b7e7f66SKevin Wolf }, 109*0b7e7f66SKevin Wolf "size": $size, 110*0b7e7f66SKevin Wolf "log-size": 1048576, 111*0b7e7f66SKevin Wolf "block-size": 8388608, 112*0b7e7f66SKevin Wolf "subformat": "dynamic", 113*0b7e7f66SKevin Wolf "block-state-zero": true 114*0b7e7f66SKevin Wolf } 115*0b7e7f66SKevin Wolf} 116*0b7e7f66SKevin Wolf{ "execute": "quit" } 117*0b7e7f66SKevin WolfEOF 118*0b7e7f66SKevin Wolf 119*0b7e7f66SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific 120*0b7e7f66SKevin Wolf 121*0b7e7f66SKevin Wolfecho 122*0b7e7f66SKevin Wolfecho "=== Successful image creation (with non-default options) ===" 123*0b7e7f66SKevin Wolfecho 124*0b7e7f66SKevin Wolf 125*0b7e7f66SKevin Wolf# Choose a different size to show that we got a new image 126*0b7e7f66SKevin Wolfsize=$((32 * 1024 * 1024)) 127*0b7e7f66SKevin Wolf 128*0b7e7f66SKevin Wolfrun_qemu <<EOF 129*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 130*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 131*0b7e7f66SKevin Wolf "arguments": { 132*0b7e7f66SKevin Wolf "driver": "file", 133*0b7e7f66SKevin Wolf "filename": "$TEST_IMG", 134*0b7e7f66SKevin Wolf "size": 0 135*0b7e7f66SKevin Wolf } 136*0b7e7f66SKevin Wolf} 137*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 138*0b7e7f66SKevin Wolf "arguments": { 139*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 140*0b7e7f66SKevin Wolf "file": { 141*0b7e7f66SKevin Wolf "driver": "file", 142*0b7e7f66SKevin Wolf "filename": "$TEST_IMG" 143*0b7e7f66SKevin Wolf }, 144*0b7e7f66SKevin Wolf "size": $size, 145*0b7e7f66SKevin Wolf "log-size": 8388608, 146*0b7e7f66SKevin Wolf "block-size": 268435456, 147*0b7e7f66SKevin Wolf "subformat": "fixed", 148*0b7e7f66SKevin Wolf "block-state-zero": false 149*0b7e7f66SKevin Wolf } 150*0b7e7f66SKevin Wolf} 151*0b7e7f66SKevin Wolf{ "execute": "quit" } 152*0b7e7f66SKevin WolfEOF 153*0b7e7f66SKevin Wolf 154*0b7e7f66SKevin Wolf_img_info --format-specific | _filter_img_info --format-specific 155*0b7e7f66SKevin Wolf 156*0b7e7f66SKevin Wolfecho 157*0b7e7f66SKevin Wolfecho "=== Invalid BlockdevRef ===" 158*0b7e7f66SKevin Wolfecho 159*0b7e7f66SKevin Wolf 160*0b7e7f66SKevin Wolfrun_qemu <<EOF 161*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 162*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 163*0b7e7f66SKevin Wolf "arguments": { 164*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 165*0b7e7f66SKevin Wolf "file": "this doesn't exist", 166*0b7e7f66SKevin Wolf "size": $size 167*0b7e7f66SKevin Wolf } 168*0b7e7f66SKevin Wolf} 169*0b7e7f66SKevin Wolf{ "execute": "quit" } 170*0b7e7f66SKevin WolfEOF 171*0b7e7f66SKevin Wolf 172*0b7e7f66SKevin Wolfecho 173*0b7e7f66SKevin Wolfecho "=== Zero size ===" 174*0b7e7f66SKevin Wolfecho 175*0b7e7f66SKevin Wolf 176*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 177*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 178*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 179*0b7e7f66SKevin Wolf "arguments": { 180*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 181*0b7e7f66SKevin Wolf "file": "node0", 182*0b7e7f66SKevin Wolf "size": 0 183*0b7e7f66SKevin Wolf } 184*0b7e7f66SKevin Wolf} 185*0b7e7f66SKevin Wolf{ "execute": "quit" } 186*0b7e7f66SKevin WolfEOF 187*0b7e7f66SKevin Wolf 188*0b7e7f66SKevin Wolf_img_info | _filter_img_info 189*0b7e7f66SKevin Wolf 190*0b7e7f66SKevin Wolfecho 191*0b7e7f66SKevin Wolfecho "=== Maximum size ===" 192*0b7e7f66SKevin Wolfecho 193*0b7e7f66SKevin Wolf 194*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 195*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 196*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 197*0b7e7f66SKevin Wolf "arguments": { 198*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 199*0b7e7f66SKevin Wolf "file": "node0", 200*0b7e7f66SKevin Wolf "size": 70368744177664 201*0b7e7f66SKevin Wolf } 202*0b7e7f66SKevin Wolf} 203*0b7e7f66SKevin Wolf{ "execute": "quit" } 204*0b7e7f66SKevin WolfEOF 205*0b7e7f66SKevin Wolf 206*0b7e7f66SKevin Wolf_img_info | _filter_img_info 207*0b7e7f66SKevin Wolf 208*0b7e7f66SKevin Wolfecho 209*0b7e7f66SKevin Wolfecho "=== Invalid sizes ===" 210*0b7e7f66SKevin Wolfecho 211*0b7e7f66SKevin Wolf 212*0b7e7f66SKevin Wolf# TODO Negative image sizes aren't handled correctly, but this is a problem 213*0b7e7f66SKevin Wolf# with QAPI's implementation of the 'size' type and affects other commands as 214*0b7e7f66SKevin Wolf# well. Once this is fixed, we may want to add a test case here. 215*0b7e7f66SKevin Wolf 216*0b7e7f66SKevin Wolf# 1. 2^64 - 512 217*0b7e7f66SKevin Wolf# 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this) 218*0b7e7f66SKevin Wolf# 3. 2^63 - 512 (generally valid, but with the image header the file will 219*0b7e7f66SKevin Wolf# exceed 63 bits) 220*0b7e7f66SKevin Wolf# 4. 2^46 + 1 (one byte more than maximum image size) 221*0b7e7f66SKevin Wolf 222*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 223*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 224*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 225*0b7e7f66SKevin Wolf "arguments": { 226*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 227*0b7e7f66SKevin Wolf "file": "node0", 228*0b7e7f66SKevin Wolf "size": 18446744073709551104 229*0b7e7f66SKevin Wolf } 230*0b7e7f66SKevin Wolf} 231*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 232*0b7e7f66SKevin Wolf "arguments": { 233*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 234*0b7e7f66SKevin Wolf "file": "node0", 235*0b7e7f66SKevin Wolf "size": 9223372036854775808 236*0b7e7f66SKevin Wolf } 237*0b7e7f66SKevin Wolf} 238*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 239*0b7e7f66SKevin Wolf "arguments": { 240*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 241*0b7e7f66SKevin Wolf "file": "node0", 242*0b7e7f66SKevin Wolf "size": 9223372036854775296 243*0b7e7f66SKevin Wolf } 244*0b7e7f66SKevin Wolf} 245*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 246*0b7e7f66SKevin Wolf "arguments": { 247*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 248*0b7e7f66SKevin Wolf "file": "node0", 249*0b7e7f66SKevin Wolf "size": 70368744177665 250*0b7e7f66SKevin Wolf } 251*0b7e7f66SKevin Wolf} 252*0b7e7f66SKevin Wolf{ "execute": "quit" } 253*0b7e7f66SKevin WolfEOF 254*0b7e7f66SKevin Wolf 255*0b7e7f66SKevin Wolfecho 256*0b7e7f66SKevin Wolfecho "=== Invalid block size ===" 257*0b7e7f66SKevin Wolfecho 258*0b7e7f66SKevin Wolf 259*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 260*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 261*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 262*0b7e7f66SKevin Wolf "arguments": { 263*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 264*0b7e7f66SKevin Wolf "file": "node0", 265*0b7e7f66SKevin Wolf "size": 67108864, 266*0b7e7f66SKevin Wolf "block-size": 1234567 267*0b7e7f66SKevin Wolf } 268*0b7e7f66SKevin Wolf} 269*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 270*0b7e7f66SKevin Wolf "arguments": { 271*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 272*0b7e7f66SKevin Wolf "file": "node0", 273*0b7e7f66SKevin Wolf "size": 67108864, 274*0b7e7f66SKevin Wolf "block-size": 128 275*0b7e7f66SKevin Wolf } 276*0b7e7f66SKevin Wolf} 277*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 278*0b7e7f66SKevin Wolf "arguments": { 279*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 280*0b7e7f66SKevin Wolf "file": "node0", 281*0b7e7f66SKevin Wolf "size": 67108864, 282*0b7e7f66SKevin Wolf "block-size": 3145728 283*0b7e7f66SKevin Wolf } 284*0b7e7f66SKevin Wolf} 285*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 286*0b7e7f66SKevin Wolf "arguments": { 287*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 288*0b7e7f66SKevin Wolf "file": "node0", 289*0b7e7f66SKevin Wolf "size": 67108864, 290*0b7e7f66SKevin Wolf "block-size": 536870912 291*0b7e7f66SKevin Wolf } 292*0b7e7f66SKevin Wolf} 293*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 294*0b7e7f66SKevin Wolf "arguments": { 295*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 296*0b7e7f66SKevin Wolf "file": "node0", 297*0b7e7f66SKevin Wolf "size": 67108864, 298*0b7e7f66SKevin Wolf "block-size": 0 299*0b7e7f66SKevin Wolf } 300*0b7e7f66SKevin Wolf} 301*0b7e7f66SKevin Wolf{ "execute": "quit" } 302*0b7e7f66SKevin WolfEOF 303*0b7e7f66SKevin Wolf 304*0b7e7f66SKevin Wolfecho 305*0b7e7f66SKevin Wolfecho "=== Invalid log size ===" 306*0b7e7f66SKevin Wolfecho 307*0b7e7f66SKevin Wolf 308*0b7e7f66SKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <<EOF 309*0b7e7f66SKevin Wolf{ "execute": "qmp_capabilities" } 310*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 311*0b7e7f66SKevin Wolf "arguments": { 312*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 313*0b7e7f66SKevin Wolf "file": "node0", 314*0b7e7f66SKevin Wolf "size": 67108864, 315*0b7e7f66SKevin Wolf "log-size": 1234567 316*0b7e7f66SKevin Wolf } 317*0b7e7f66SKevin Wolf} 318*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 319*0b7e7f66SKevin Wolf "arguments": { 320*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 321*0b7e7f66SKevin Wolf "file": "node0", 322*0b7e7f66SKevin Wolf "size": 67108864, 323*0b7e7f66SKevin Wolf "log-size": 128 324*0b7e7f66SKevin Wolf } 325*0b7e7f66SKevin Wolf} 326*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 327*0b7e7f66SKevin Wolf "arguments": { 328*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 329*0b7e7f66SKevin Wolf "file": "node0", 330*0b7e7f66SKevin Wolf "size": 67108864, 331*0b7e7f66SKevin Wolf "log-size": 4294967296 332*0b7e7f66SKevin Wolf } 333*0b7e7f66SKevin Wolf} 334*0b7e7f66SKevin Wolf{ "execute": "x-blockdev-create", 335*0b7e7f66SKevin Wolf "arguments": { 336*0b7e7f66SKevin Wolf "driver": "$IMGFMT", 337*0b7e7f66SKevin Wolf "file": "node0", 338*0b7e7f66SKevin Wolf "size": 67108864, 339*0b7e7f66SKevin Wolf "log-size": 0 340*0b7e7f66SKevin Wolf } 341*0b7e7f66SKevin Wolf} 342*0b7e7f66SKevin Wolf{ "execute": "quit" } 343*0b7e7f66SKevin WolfEOF 344*0b7e7f66SKevin Wolf 345*0b7e7f66SKevin Wolf 346*0b7e7f66SKevin Wolf# success, all done 347*0b7e7f66SKevin Wolfecho "*** done" 348*0b7e7f66SKevin Wolfrm -f $seq.full 349*0b7e7f66SKevin Wolfstatus=0 350