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} 50 51test_throttle=$($QEMU_IMG --help|grep throttle) 52[ "$test_throttle" = "" ] && _supported_fmt throttle 53 54echo 55echo "== checking interface ==" 56 57run_qemu <<EOF 58{ "execute": "qmp_capabilities" } 59{ "execute": "blockdev-add", 60 "arguments": { 61 "driver": "null-co", 62 "node-name": "disk0" 63 } 64} 65{ "execute": "object-add", 66 "arguments": { 67 "qom-type": "throttle-group", 68 "id": "group0", 69 "props": { 70 "limits" : { 71 "iops-total": 1000 72 } 73 } 74 } 75} 76{ "execute": "blockdev-add", 77 "arguments": { 78 "driver": "throttle", 79 "node-name": "throttle0", 80 "throttle-group": "group0", 81 "file": "disk0" 82 } 83} 84{ "execute": "query-named-block-nodes" } 85{ "execute": "query-block" } 86{ "execute": "quit" } 87EOF 88 89echo 90echo "== property changes in ThrottleGroup ==" 91 92run_qemu <<EOF 93{ "execute": "qmp_capabilities" } 94{ "execute": "object-add", 95 "arguments": { 96 "qom-type": "throttle-group", 97 "id": "group0", 98 "props" : { 99 "limits": { 100 "iops-total": 1000 101 } 102 } 103 } 104} 105{ "execute" : "qom-get", 106 "arguments" : { 107 "path" : "group0", 108 "property" : "limits" 109 } 110} 111{ "execute" : "qom-set", 112 "arguments" : { 113 "path" : "group0", 114 "property" : "limits", 115 "value" : { 116 "iops-total" : 0 117 } 118 } 119} 120{ "execute" : "qom-get", 121 "arguments" : { 122 "path" : "group0", 123 "property" : "limits" 124 } 125} 126{ "execute": "quit" } 127EOF 128 129echo 130echo "== object creation/set errors ==" 131 132run_qemu <<EOF 133{ "execute": "qmp_capabilities" } 134{ "execute": "object-add", 135 "arguments": { 136 "qom-type": "throttle-group", 137 "id": "group0", 138 "props" : { 139 "limits": { 140 "iops-total": 1000 141 } 142 } 143 } 144} 145{ "execute" : "qom-set", 146 "arguments" : { 147 "path" : "group0", 148 "property" : "x-iops-total", 149 "value" : 0 150 } 151} 152{ "execute" : "qom-set", 153 "arguments" : { 154 "path" : "group0", 155 "property" : "limits", 156 "value" : { 157 "iops-total" : 10, 158 "iops-read" : 10 159 } 160 } 161} 162{ "execute": "quit" } 163EOF 164 165echo 166echo "== don't specify group ==" 167 168run_qemu <<EOF 169{ "execute": "qmp_capabilities" } 170{ "execute": "blockdev-add", 171 "arguments": { 172 "driver": "null-co", 173 "node-name": "disk0" 174 } 175} 176{ "execute": "blockdev-add", 177 "arguments": { 178 "driver": "throttle", 179 "node-name": "throttle0", 180 "file": "disk0" 181 } 182} 183{ "execute": "quit" } 184EOF 185 186echo 187# success, all done 188echo "*** done" 189rm -f $seq.full 190status=0 191