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