1 dnl RUN_OVS_VSCTL(COMMAND, ...)
3 dnl Executes each ovs-vsctl COMMAND on a file named "conf" in the
4 dnl current directory. Creates "conf" if it does not already exist.
5 m4_define([RUN_OVS_VSCTL],
7 m4_foreach([command], [$@], [ovs-vsctl --no-reload --config=conf command
10 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
12 dnl Executes each ovs-vsctl COMMAND on a file named "conf" in the
13 dnl current directory, in a single run of ovs-vsctl. Creates "conf" if it
14 dnl does not already exist.
15 m4_define([RUN_OVS_VSCTL_TOGETHER],
17 ovs-vsctl --no-reload --config=conf m4_join([ -- ], $@)])
19 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
21 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
22 dnl which must be in alphabetical order. Also checks that each BRIDGE has the
23 dnl specified PARENT and is on the given VLAN.
24 m4_define([_CHECK_BRIDGE],
25 [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
28 # Check br-to-vlan, without --oneline.
29 AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
31 # Check br-to-vlan, with --oneline.
32 # (This particular test is interesting with --oneline because it returns
33 # an integer instead of a string and that can cause type mismatches inside
34 # python if not done carefully.)
35 AT_CHECK([RUN_OVS_VSCTL([--oneline br-to-vlan $1])], [0], [$3
38 # Check multiple queries in a single run.
39 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
43 m4_define([CHECK_BRIDGES],
44 [dnl Check that the bridges appear on list-br, without --oneline.
46 [RUN_OVS_VSCTL([list-br])],
48 [m4_foreach([brinfo], [$@], [m4_car(brinfo)
51 dnl Check that the bridges appear on list-br, with --oneline.
53 [RUN_OVS_VSCTL([--oneline list-br])],
55 [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
58 dnl Check that each bridge exists according to br-exists and that
59 dnl a bridge that should not exist does not.
60 m4_foreach([brinfo], [$@],
61 [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])])])
62 AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2])
64 dnl Check that each bridge has the expected parent and VLAN.
65 m4_map([_CHECK_BRIDGE], [$@])])
67 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
69 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
70 dnl list of ports, which must be in alphabetical order. Also checks
71 dnl that "ovs-vsctl port-to-br" reports that each port is
73 m4_define([CHECK_PORTS],
74 [dnl Check ports without --oneline.
76 [RUN_OVS_VSCTL([list-ports $1])],
78 [m4_foreach([port], m4_cdr($@), [port
81 dnl Check ports with --oneline.
83 [RUN_OVS_VSCTL([--oneline list-ports $1])],
85 [m4_join([\n], m4_shift($@))
87 AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [], [ovs-vsctl: no port named $1
91 [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
94 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
96 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
97 dnl list of ifaces, which must be in alphabetical order. Also checks
98 dnl that "ovs-vsctl iface-to-br" reports that each interface is
100 m4_define([CHECK_IFACES],
102 [RUN_OVS_VSCTL([list-ifaces $1])],
104 [m4_foreach([iface], m4_cdr($@), [iface
106 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [], [ovs-vsctl: no interface named $1
110 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
113 dnl ----------------------------------------------------------------------
114 AT_BANNER([ovs-vsctl unit tests -- real bridges])
117 AT_KEYWORDS([ovs-vsctl])
118 AT_CHECK([RUN_OVS_VSCTL([add-br a])])
119 AT_CHECK([cat conf], [0], [dnl
122 CHECK_BRIDGES([a, a, 0])
127 AT_SETUP([add-br a, add-br b])
128 AT_KEYWORDS([ovs-vsctl])
129 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])])
130 AT_CHECK([cat conf], [0], [dnl
134 CHECK_BRIDGES([a, a, 0], [b, b, 0])
141 AT_SETUP([add-br a, add-br b, del-br a])
142 AT_KEYWORDS([ovs-vsctl])
143 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])])
144 AT_CHECK([cat conf], [0], [dnl
147 CHECK_BRIDGES([b, b, 0])
152 AT_SETUP([add-br a, add-port a a1, add-port a a2])
153 AT_KEYWORDS([ovs-vsctl])
154 AT_CHECK([RUN_OVS_VSCTL(
158 AT_CHECK([cat conf], [0],
163 CHECK_BRIDGES([a, a, 0])
164 CHECK_PORTS([a], [a1], [a2])
165 CHECK_IFACES([a], [a1], [a2])
168 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
169 AT_KEYWORDS([ovs-vsctl])
170 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
176 AT_CHECK([cat conf], [0],
180 CHECK_BRIDGES([b, b, 0])
181 CHECK_PORTS([b], [b1])
182 CHECK_IFACES([b], [b1])
185 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
186 AT_KEYWORDS([ovs-vsctl])
187 AT_CHECK([RUN_OVS_VSCTL(
189 [add-bond a bond0 a1 a2 a3])])
190 AT_CHECK([cat conf], [0], [dnl
191 bonding.bond0.slave=a1
192 bonding.bond0.slave=a2
193 bonding.bond0.slave=a3
197 CHECK_BRIDGES([a, a, 0])
198 CHECK_PORTS([a], [bond0])
199 CHECK_IFACES([a], [a1], [a2], [a3])
202 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
203 AT_KEYWORDS([ovs-vsctl])
204 AT_CHECK([RUN_OVS_VSCTL(
210 AT_CHECK([cat conf], [0], [dnl
215 CHECK_BRIDGES([a, a, 0], [b, b, 0])
218 CHECK_PORTS([b], [b1])
219 CHECK_IFACES([b], [b1])
222 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
223 AT_KEYWORDS([ovs-vsctl])
224 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
226 [add-bond a bond0 a1 a2 a3],
228 AT_CHECK([cat conf], [0], [dnl
231 CHECK_BRIDGES([a, a, 0])
235 dnl ----------------------------------------------------------------------
236 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
238 m4_define([SIMPLE_FAKE_CONF], [dnl
239 bridge.xenbr0.port=eth0
240 bridge.xenbr0.port=eth0.9
241 bridge.xenbr0.port=xapi1
242 bridge.xenbr0.port=xenbr0
243 iface.xapi1.fake-bridge=true
244 iface.xapi1.internal=true
249 AT_SETUP([simple fake bridge])
250 AT_KEYWORDS([ovs-vsctl fake-bridge])
251 AT_CHECK([RUN_OVS_VSCTL(
253 [add-port xenbr0 eth0],
254 [add-br xapi1 xenbr0 9],
255 [add-port xapi1 eth0.9])])
256 AT_CHECK([cat conf], [0], [SIMPLE_FAKE_CONF])
257 CHECK_BRIDGES([xenbr0, xenbr0, 0], [xapi1, xenbr0, 9])
258 CHECK_PORTS([xenbr0], [eth0])
259 CHECK_IFACES([xenbr0], [eth0])
260 CHECK_PORTS([xapi1], [eth0.9])
261 CHECK_IFACES([xapi1], [eth0.9])
264 AT_SETUP([simple fake bridge + del-br fake bridge])
265 AT_KEYWORDS([ovs-vsctl fake-bridge])
266 AT_DATA([conf], [SIMPLE_FAKE_CONF])
267 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
268 AT_CHECK([cat conf], [0], [dnl
269 bridge.xenbr0.port=eth0
270 bridge.xenbr0.port=xenbr0
272 CHECK_BRIDGES([xenbr0, xenbr0, 0])
273 CHECK_PORTS([xenbr0], [eth0])
274 CHECK_IFACES([xenbr0], [eth0])
277 AT_SETUP([simple fake bridge + del-br real bridge])
278 AT_KEYWORDS([ovs-vsctl fake-bridge])
279 AT_DATA([conf], [SIMPLE_FAKE_CONF])
280 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])])
281 AT_CHECK([cat conf], [0], [])
285 m4_define([BOND_FAKE_CONF], [dnl
286 bonding.bond0.slave=eth0
287 bonding.bond0.slave=eth1
288 bridge.xapi1.port=bond0
289 bridge.xapi1.port=bond0.11
290 bridge.xapi1.port=xapi1
291 bridge.xapi1.port=xapi2
292 iface.xapi2.fake-bridge=true
293 iface.xapi2.internal=true
298 AT_SETUP([fake bridge on bond])
299 AT_KEYWORDS([ovs-vsctl fake-bridge])
300 AT_CHECK([RUN_OVS_VSCTL(
302 [add-bond xapi1 bond0 eth0 eth1],
303 [add-br xapi2 xapi1 11],
304 [add-port xapi2 bond0.11])])
305 AT_CHECK([cat conf], [0], [BOND_FAKE_CONF])
306 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
307 CHECK_PORTS([xapi1], [bond0])
308 CHECK_IFACES([xapi1], [eth0], [eth1])
309 CHECK_PORTS([xapi2], [bond0.11])
310 CHECK_IFACES([xapi2], [bond0.11])
313 AT_SETUP([fake bridge on bond + del-br fake bridge])
314 AT_KEYWORDS([ovs-vsctl fake-bridge])
315 AT_DATA([conf], [BOND_FAKE_CONF])
316 AT_CHECK([RUN_OVS_VSCTL([del-br xapi2])])
317 CHECK_BRIDGES([xapi1, xapi1, 0])
318 CHECK_PORTS([xapi1], [bond0])
319 CHECK_IFACES([xapi1], [eth0], [eth1])
322 AT_SETUP([fake bridge on bond + del-br real bridge])
323 AT_KEYWORDS([ovs-vsctl fake-bridge])
324 AT_DATA([conf], [BOND_FAKE_CONF])
325 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])