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