1#!/usr/bin/env bash 2# group: rw auto quick 3# 4# Test I/O throttle block filter driver interface 5# 6# Copyright (C) 2017 Manos Pitsidianakis 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="Manos Pitsidianakis" 24 25seq=`basename $0` 26echo "QA output created by $seq" 27 28status=1 # failure is the default! 29 30trap "exit \$status" 0 1 2 3 15 31 32# get standard environment, filters and checks 33. ./common.rc 34. ./common.filter 35 36_supported_os Linux 37_require_drivers throttle 38 39do_run_qemu() 40{ 41 echo Testing: "$@" | _filter_imgfmt 42 $QEMU -nographic -qmp-pretty stdio -serial none "$@" 43 echo 44} 45 46run_qemu() 47{ 48 do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_qmp\ 49 | _filter_qemu_io | _filter_generated_node_ids 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