xref: /openbmc/qemu/tests/qemu-iotests/225 (revision d0fb9657)
1#!/usr/bin/env bash
2# group: rw quick
3#
4# Test vmdk backing file correlation
5#
6# Copyright (C) 2018 Red Hat, Inc.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20#
21
22# creator
23owner=mreitz@redhat.com
24
25seq=$(basename $0)
26echo "QA output created by $seq"
27
28status=1	# failure is the default!
29
30_cleanup()
31{
32    _cleanup_test_img
33    _rm_test_img "$TEST_IMG.not_base"
34}
35trap "_cleanup; exit \$status" 0 1 2 3 15
36
37# get standard environment, filters and checks
38. ./common.rc
39. ./common.filter
40. ./common.qemu
41
42# This tests vmdk-specific low-level functionality
43_supported_fmt vmdk
44_supported_proto file
45_supported_os Linux
46_unsupported_imgopts "subformat=monolithicFlat" \
47                     "subformat=twoGbMaxExtentFlat" \
48                     "subformat=twoGbMaxExtentSparse"
49
50TEST_IMG="$TEST_IMG.base" _make_test_img 1M
51TEST_IMG="$TEST_IMG.not_base" _make_test_img 1M
52_make_test_img -b "$TEST_IMG.base" -F $IMGFMT
53
54make_opts()
55{
56    node_name=$1
57    filename=$2
58    backing=$3
59
60    if [ -z "$backing" ]; then
61        backing="null"
62    else
63        backing="'$backing'"
64    fi
65
66    echo "{ 'node-name': '$node_name',
67            'driver': 'vmdk',
68            'file': {
69                'driver': 'file',
70                'filename': '$filename'
71            },
72            'backing': $backing }"
73}
74
75overlay_opts=$(make_opts overlay "$TEST_IMG" backing)
76base_opts=$(make_opts backing "$TEST_IMG.base")
77not_base_opts=$(make_opts backing "$TEST_IMG.not_base")
78
79not_vmdk_opts="{ 'node-name': 'backing', 'driver': 'null-co' }"
80
81echo
82echo '=== Testing fitting VMDK backing image ==='
83echo
84
85qemu_comm_method=monitor \
86    _launch_qemu -blockdev "$base_opts" -blockdev "$overlay_opts"
87
88# Should not return an error
89_send_qemu_cmd $QEMU_HANDLE 'qemu-io overlay "read 0 512"' 'ops'
90
91_cleanup_qemu
92
93
94echo
95echo '=== Testing unrelated VMDK backing image ==='
96echo
97
98qemu_comm_method=monitor \
99    _launch_qemu -blockdev "$not_base_opts" -blockdev "$overlay_opts"
100
101# Should fail (gracefully)
102_send_qemu_cmd $QEMU_HANDLE 'qemu-io overlay "read 0 512"' 'failed'
103
104_cleanup_qemu
105
106
107echo
108echo '=== Testing non-VMDK backing image ==='
109echo
110
111# FIXME: This is the reason why we have to use two -blockdev
112# invocations.  You can only fully override the backing file options
113# if you either specify a node reference (as done here) or the new
114# options contain file.filename (which in this case they do not).
115# In other cases, file.filename will be set to whatever the image
116# header of the overlay contains (which we do not want).  I consider
117# this a FIXME because with -blockdev, you cannot specify "partial"
118# options, so setting file.filename but leaving the rest as specified
119# by the user does not make sense.
120qemu_comm_method=monitor \
121    _launch_qemu -blockdev "$not_vmdk_opts" -blockdev "$overlay_opts"
122
123# Should fail (gracefully)
124_send_qemu_cmd $QEMU_HANDLE 'qemu-io overlay "read 0 512"' 'failed'
125
126_cleanup_qemu
127
128
129# success, all done
130echo "*** done"
131rm -f $seq.full
132status=0
133