3 dnl Creates an empty database in the current directory and then starts
4 dnl an ovsdb-server on it for ovs-vsctl to connect to.
5 m4_define([OVS_VSCTL_SETUP],
7 [ovsdb-tool create db $abs_builddir/../vswitchd/vswitch-idl.ovsschema],
8 [0], [stdout], [ignore])
10 [[ovsdb-tool transact db \
12 "table": "Open_vSwitch",
14 [0], [ignore], [ignore])
15 AT_CHECK([ovsdb-server --detach --pidfile=$PWD/pid --listen=punix:socket --unixctl=$PWD/unixctl db >/dev/null 2>&1], [0], [ignore], [ignore])])
19 dnl Kills off the database server.
20 m4_define([OVS_VSCTL_CLEANUP], [test ! -e pid || kill `cat pid`])
22 dnl RUN_OVS_VSCTL(COMMAND, ...)
24 dnl Executes each ovs-vsctl COMMAND.
25 m4_define([RUN_OVS_VSCTL],
26 [m4_foreach([command], [$@], [ovs-vsctl -vreconnect:ANY:emer --db=unix:socket command
29 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
31 dnl Executes each ovs-vsctl COMMAND in a single run of ovs-vsctl.
32 m4_define([RUN_OVS_VSCTL_TOGETHER],
33 [ovs-vsctl -vreconnect:ANY:emer --db=unix:socket m4_join([ -- ], $@)])
35 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
37 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
38 dnl which must be in alphabetical order. Also checks that each BRIDGE has the
39 dnl specified PARENT and is on the given VLAN.
40 m4_define([_CHECK_BRIDGE],
41 [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
42 ], [], [OVS_VSCTL_CLEANUP])
44 # Check br-to-vlan, without --oneline.
45 AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
46 ], [], [OVS_VSCTL_CLEANUP])
47 # Check br-to-vlan, with --oneline.
48 # (This particular test is interesting with --oneline because it returns
49 # an integer instead of a string and that can cause type mismatches inside
50 # python if not done carefully.)
51 AT_CHECK([RUN_OVS_VSCTL([--oneline br-to-vlan $1])], [0], [$3
52 ], [], [OVS_VSCTL_CLEANUP])
54 # Check multiple queries in a single run.
55 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
58 ], [], [OVS_VSCTL_CLEANUP])])
59 m4_define([CHECK_BRIDGES],
60 [dnl Check that the bridges appear on list-br, without --oneline.
62 [RUN_OVS_VSCTL([list-br])],
64 [m4_foreach([brinfo], [$@], [m4_car(brinfo)
69 dnl Check that the bridges appear on list-br, with --oneline.
71 [RUN_OVS_VSCTL([--oneline list-br])],
73 [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
78 dnl Check that each bridge exists according to br-exists and that
79 dnl a bridge that should not exist does not.
80 m4_foreach([brinfo], [$@],
81 [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])], [0], [],
82 [], [OVS_VSCTL_CLEANUP])])
83 AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2], [], [],
86 dnl Check that each bridge has the expected parent and VLAN.
87 m4_map([_CHECK_BRIDGE], [$@])])
89 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
91 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
92 dnl list of ports, which must be in alphabetical order. Also checks
93 dnl that "ovs-vsctl port-to-br" reports that each port is
95 m4_define([CHECK_PORTS],
96 [dnl Check ports without --oneline.
98 [RUN_OVS_VSCTL([list-ports $1])],
100 [m4_foreach([port], m4_cdr($@), [port
105 dnl Check ports with --oneline.
107 [RUN_OVS_VSCTL([--oneline list-ports $1])],
109 [m4_join([\n], m4_shift($@))
113 AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
114 [ovs-vsctl: no port named $1
119 [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
120 ], [], [OVS_VSCTL_CLEANUP])])])
122 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
124 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
125 dnl list of ifaces, which must be in alphabetical order. Also checks
126 dnl that "ovs-vsctl iface-to-br" reports that each interface is
128 m4_define([CHECK_IFACES],
130 [RUN_OVS_VSCTL([list-ifaces $1])],
132 [m4_foreach([iface], m4_cdr($@), [iface
134 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
135 [ovs-vsctl: no interface named $1
140 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
142 [], [OVS_VSCTL_CLEANUP])])])
144 dnl ----------------------------------------------------------------------
145 AT_BANNER([ovs-vsctl unit tests -- real bridges])
148 AT_KEYWORDS([ovs-vsctl])
150 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
151 CHECK_BRIDGES([a, a, 0])
157 AT_SETUP([add-br a, add-br a])
158 AT_KEYWORDS([ovs-vsctl])
160 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
161 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
162 [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
163 ], [OVS_VSCTL_CLEANUP])
167 AT_SETUP([add-br a, add-br b])
168 AT_KEYWORDS([ovs-vsctl])
170 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
172 CHECK_BRIDGES([a, a, 0], [b, b, 0])
180 AT_SETUP([add-br a, add-br b, del-br a])
181 AT_KEYWORDS([ovs-vsctl])
183 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
185 CHECK_BRIDGES([b, b, 0])
191 AT_SETUP([add-br a, add-port a a1, add-port a a2])
192 AT_KEYWORDS([ovs-vsctl])
194 AT_CHECK([RUN_OVS_VSCTL(
197 [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
198 CHECK_BRIDGES([a, a, 0])
199 CHECK_PORTS([a], [a1], [a2])
200 CHECK_IFACES([a], [a1], [a2])
204 AT_SETUP([add-br a, add-port a a1, add-port a a1])
205 AT_KEYWORDS([ovs-vsctl])
207 AT_CHECK([RUN_OVS_VSCTL(
209 [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
210 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
211 [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
212 ], [OVS_VSCTL_CLEANUP])
216 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
217 AT_KEYWORDS([ovs-vsctl])
219 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
224 [del-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
225 CHECK_BRIDGES([b, b, 0])
226 CHECK_PORTS([b], [b1])
227 CHECK_IFACES([b], [b1])
231 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
232 AT_KEYWORDS([ovs-vsctl])
234 AT_CHECK([RUN_OVS_VSCTL(
236 [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
237 CHECK_BRIDGES([a, a, 0])
238 CHECK_PORTS([a], [bond0])
239 CHECK_IFACES([a], [a1], [a2], [a3])
243 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
244 AT_KEYWORDS([ovs-vsctl])
246 AT_CHECK([RUN_OVS_VSCTL(
251 [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
252 CHECK_BRIDGES([a, a, 0], [b, b, 0])
255 CHECK_PORTS([b], [b1])
256 CHECK_IFACES([b], [b1])
260 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
261 AT_KEYWORDS([ovs-vsctl])
263 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
265 [add-bond a bond0 a1 a2 a3],
266 [del-port bond0])], [0], [], [], [OVS_VSCTL_CLEANUP])
267 CHECK_BRIDGES([a, a, 0])
272 m4_define([ovs_vsctl_disabled_tests], [
273 dnl ----------------------------------------------------------------------
274 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
276 m4_define([SIMPLE_FAKE_CONF], [dnl
277 bridge.xenbr0.port=eth0
278 bridge.xenbr0.port=eth0.9
279 bridge.xenbr0.port=xapi1
280 bridge.xenbr0.port=xenbr0
281 iface.xapi1.fake-bridge=true
282 iface.xapi1.internal=true
287 AT_SETUP([simple fake bridge])
288 AT_KEYWORDS([ovs-vsctl fake-bridge])
290 AT_CHECK([RUN_OVS_VSCTL(
292 [add-port xenbr0 eth0],
293 [add-br xapi1 xenbr0 9],
294 [add-port xapi1 eth0.9])])
295 AT_CHECK([cat conf], [0], [SIMPLE_FAKE_CONF])
296 CHECK_BRIDGES([xenbr0, xenbr0, 0], [xapi1, xenbr0, 9])
297 CHECK_PORTS([xenbr0], [eth0])
298 CHECK_IFACES([xenbr0], [eth0])
299 CHECK_PORTS([xapi1], [eth0.9])
300 CHECK_IFACES([xapi1], [eth0.9])
304 AT_SETUP([simple fake bridge + del-br fake bridge])
305 AT_KEYWORDS([ovs-vsctl fake-bridge])
307 AT_DATA([conf], [SIMPLE_FAKE_CONF])
308 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
309 AT_CHECK([cat conf], [0], [dnl
310 bridge.xenbr0.port=eth0
311 bridge.xenbr0.port=xenbr0
313 CHECK_BRIDGES([xenbr0, xenbr0, 0])
314 CHECK_PORTS([xenbr0], [eth0])
315 CHECK_IFACES([xenbr0], [eth0])
319 AT_SETUP([simple fake bridge + del-br real bridge])
320 AT_KEYWORDS([ovs-vsctl fake-bridge])
322 AT_DATA([conf], [SIMPLE_FAKE_CONF])
323 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])])
324 AT_CHECK([cat conf], [0], [])
329 m4_define([BOND_FAKE_CONF], [dnl
330 bonding.bond0.slave=eth0
331 bonding.bond0.slave=eth1
332 bridge.xapi1.port=bond0
333 bridge.xapi1.port=bond0.11
334 bridge.xapi1.port=xapi1
335 bridge.xapi1.port=xapi2
336 iface.xapi2.fake-bridge=true
337 iface.xapi2.internal=true
342 AT_SETUP([fake bridge on bond])
343 AT_KEYWORDS([ovs-vsctl fake-bridge])
345 AT_CHECK([RUN_OVS_VSCTL(
347 [add-bond xapi1 bond0 eth0 eth1],
348 [add-br xapi2 xapi1 11],
349 [add-port xapi2 bond0.11])])
350 AT_CHECK([cat conf], [0], [BOND_FAKE_CONF])
351 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
352 CHECK_PORTS([xapi1], [bond0])
353 CHECK_IFACES([xapi1], [eth0], [eth1])
354 CHECK_PORTS([xapi2], [bond0.11])
355 CHECK_IFACES([xapi2], [bond0.11])
359 AT_SETUP([fake bridge on bond + del-br fake bridge])
360 AT_KEYWORDS([ovs-vsctl fake-bridge])
362 AT_DATA([conf], [BOND_FAKE_CONF])
363 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
365 CHECK_BRIDGES([xapi1, xapi1, 0])
366 CHECK_PORTS([xapi1], [bond0])
367 CHECK_IFACES([xapi1], [eth0], [eth1])
371 AT_SETUP([fake bridge on bond + del-br real bridge])
372 AT_KEYWORDS([ovs-vsctl fake-bridge])
373 AT_DATA([conf], [BOND_FAKE_CONF])
374 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])