1#!/usr/bin/env bash 2# 3# Test I/O throttle block filter driver interface 4# 5# Copyright (C) 2017 Manos Pitsidianakis 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <http://www.gnu.org/licenses/>. 19# 20 21# creator 22owner="Manos Pitsidianakis" 23 24seq=`basename $0` 25echo "QA output created by $seq" 26 27status=1 # failure is the default! 28 29trap "exit \$status" 0 1 2 3 15 30 31# get standard environment, filters and checks 32. ./common.rc 33. ./common.filter 34 35_supported_os Linux 36_require_drivers throttle 37 38do_run_qemu() 39{ 40 echo Testing: "$@" | _filter_imgfmt 41 $QEMU -nographic -qmp-pretty stdio -serial none "$@" 42 echo 43} 44 45run_qemu() 46{ 47 do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\ 48 | _filter_qemu_io | _filter_generated_node_ids \ 49 | _filter_actual_image_size 50} 51 52test_throttle=$($QEMU_IMG --help|grep throttle) 53[ "$test_throttle" = "" ] && _supported_fmt throttle 54 55echo 56echo "== checking interface ==" 57 58run_qemu <<EOF 59{ "execute": "qmp_capabilities" } 60{ "execute": "blockdev-add", 61 "arguments": { 62 "driver": "null-co", 63 "node-name": "disk0" 64 } 65} 66{ "execute": "object-add", 67 "arguments": { 68 "qom-type": "throttle-group", 69 "id": "group0", 70 "props": { 71 "limits" : { 72 "iops-total": 1000 73 } 74 } 75 } 76} 77{ "execute": "blockdev-add", 78 "arguments": { 79 "driver": "throttle", 80 "node-name": "throttle0", 81 "throttle-group": "group0", 82 "file": "disk0" 83 } 84} 85{ "execute": "query-named-block-nodes" } 86{ "execute": "query-block" } 87{ "execute": "quit" } 88EOF 89 90echo 91echo "== property changes in ThrottleGroup ==" 92 93run_qemu <<EOF 94{ "execute": "qmp_capabilities" } 95{ "execute": "object-add", 96 "arguments": { 97 "qom-type": "throttle-group", 98 "id": "group0", 99 "props" : { 100 "limits": { 101 "iops-total": 1000 102 } 103 } 104 } 105} 106{ "execute" : "qom-get", 107 "arguments" : { 108 "path" : "group0", 109 "property" : "limits" 110 } 111} 112{ "execute" : "qom-set", 113 "arguments" : { 114 "path" : "group0", 115 "property" : "limits", 116 "value" : { 117 "iops-total" : 0 118 } 119 } 120} 121{ "execute" : "qom-get", 122 "arguments" : { 123 "path" : "group0", 124 "property" : "limits" 125 } 126} 127{ "execute": "quit" } 128EOF 129 130echo 131echo "== object creation/set errors ==" 132 133run_qemu <<EOF 134{ "execute": "qmp_capabilities" } 135{ "execute": "object-add", 136 "arguments": { 137 "qom-type": "throttle-group", 138 "id": "group0", 139 "props" : { 140 "limits": { 141 "iops-total": 1000 142 } 143 } 144 } 145} 146{ "execute" : "qom-set", 147 "arguments" : { 148 "path" : "group0", 149 "property" : "x-iops-total", 150 "value" : 0 151 } 152} 153{ "execute" : "qom-set", 154 "arguments" : { 155 "path" : "group0", 156 "property" : "limits", 157 "value" : { 158 "iops-total" : 10, 159 "iops-read" : 10 160 } 161 } 162} 163{ "execute": "quit" } 164EOF 165 166echo 167echo "== don't specify group ==" 168 169run_qemu <<EOF 170{ "execute": "qmp_capabilities" } 171{ "execute": "blockdev-add", 172 "arguments": { 173 "driver": "null-co", 174 "node-name": "disk0" 175 } 176} 177{ "execute": "blockdev-add", 178 "arguments": { 179 "driver": "throttle", 180 "node-name": "throttle0", 181 "file": "disk0" 182 } 183} 184{ "execute": "quit" } 185EOF 186 187echo 188# success, all done 189echo "*** done" 190rm -f $seq.full 191status=0 192