xref: /qemu/tests/qemu-iotests/184 (revision 2e8f72ac)
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