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 [SCHEMA=$abs_top_builddir/vswitchd/vswitch-idl.ovsschema
8 if test ! -e $SCHEMA; then
9 SCHEMA=$abs_top_srcdir/vswitchd/vswitch-idl.ovsschema
10 if test ! -e $SCHEMA; then
11 echo 'Failed to find vswitch-idl.ovsschema'
15 ovsdb-tool create db $SCHEMA],
16 [0], [stdout], [ignore])
18 [[ovsdb-tool transact db \
20 "table": "Open_vSwitch",
22 [0], [ignore], [ignore])
23 AT_CHECK([ovsdb-server --detach --pidfile=$PWD/pid --remote=punix:socket --unixctl=$PWD/unixctl db >/dev/null 2>&1], [0], [ignore], [ignore])])
27 dnl Kills off the database server.
28 m4_define([OVS_VSCTL_CLEANUP], [test ! -e pid || kill `cat pid`])
30 dnl RUN_OVS_VSCTL(COMMAND, ...)
32 dnl Executes each ovs-vsctl COMMAND.
33 m4_define([RUN_OVS_VSCTL],
34 [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket -- command
36 m4_define([RUN_OVS_VSCTL_ONELINE],
37 [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline -- command
40 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
42 dnl Executes each ovs-vsctl COMMAND in a single run of ovs-vsctl.
43 m4_define([RUN_OVS_VSCTL_TOGETHER],
44 [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline dnl
45 m4_foreach([command], [$@], [ -- command])])
47 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
49 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
50 dnl which must be in alphabetical order. Also checks that each BRIDGE has the
51 dnl specified PARENT and is on the given VLAN.
52 m4_define([_CHECK_BRIDGE],
53 [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
54 ], [], [OVS_VSCTL_CLEANUP])
56 # Check br-to-vlan, without --oneline.
57 AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
58 ], [], [OVS_VSCTL_CLEANUP])
59 # Check br-to-vlan, with --oneline.
60 # (This particular test is interesting with --oneline because it returns
61 # an integer instead of a string and that can cause type mismatches inside
62 # python if not done carefully.)
63 AT_CHECK([RUN_OVS_VSCTL_ONELINE([br-to-vlan $1])], [0], [$3
64 ], [], [OVS_VSCTL_CLEANUP])
66 # Check multiple queries in a single run.
67 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
70 ], [], [OVS_VSCTL_CLEANUP])])
71 m4_define([CHECK_BRIDGES],
72 [dnl Check that the bridges appear on list-br, without --oneline.
74 [RUN_OVS_VSCTL([list-br])],
76 [m4_foreach([brinfo], [$@], [m4_car(brinfo)
81 dnl Check that the bridges appear on list-br, with --oneline.
83 [RUN_OVS_VSCTL_ONELINE([list-br])],
85 [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
90 dnl Check that each bridge exists according to br-exists and that
91 dnl a bridge that should not exist does not.
92 m4_foreach([brinfo], [$@],
93 [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])], [0], [],
94 [], [OVS_VSCTL_CLEANUP])])
95 AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2], [], [],
98 dnl Check that each bridge has the expected parent and VLAN.
99 m4_map([_CHECK_BRIDGE], [$@])])
101 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
103 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
104 dnl list of ports, which must be in alphabetical order. Also checks
105 dnl that "ovs-vsctl port-to-br" reports that each port is
107 m4_define([CHECK_PORTS],
108 [dnl Check ports without --oneline.
110 [RUN_OVS_VSCTL([list-ports $1])],
112 [m4_foreach([port], m4_cdr($@), [port
117 dnl Check ports with --oneline.
119 [RUN_OVS_VSCTL_ONELINE([list-ports $1])],
121 [m4_join([\n], m4_shift($@))
125 AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
126 [ovs-vsctl: no port named $1
131 [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
132 ], [], [OVS_VSCTL_CLEANUP])])])
134 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
136 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
137 dnl list of ifaces, which must be in alphabetical order. Also checks
138 dnl that "ovs-vsctl iface-to-br" reports that each interface is
140 m4_define([CHECK_IFACES],
142 [RUN_OVS_VSCTL([list-ifaces $1])],
144 [m4_foreach([iface], m4_cdr($@), [iface
148 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
149 [ovs-vsctl: no interface named $1
154 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
156 [], [OVS_VSCTL_CLEANUP])])])
158 dnl ----------------------------------------------------------------------
159 AT_BANNER([ovs-vsctl unit tests -- real bridges])
162 AT_KEYWORDS([ovs-vsctl])
164 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
165 CHECK_BRIDGES([a, a, 0])
171 AT_SETUP([add-br a, add-br a])
172 AT_KEYWORDS([ovs-vsctl])
174 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
175 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
176 [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
177 ], [OVS_VSCTL_CLEANUP])
181 AT_SETUP([add-br a, add-br b])
182 AT_KEYWORDS([ovs-vsctl])
184 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
186 CHECK_BRIDGES([a, a, 0], [b, b, 0])
194 AT_SETUP([add-br a, add-br b, del-br a])
195 AT_KEYWORDS([ovs-vsctl])
197 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
199 CHECK_BRIDGES([b, b, 0])
205 AT_SETUP([add-br a, add-port a a1, add-port a a2])
206 AT_KEYWORDS([ovs-vsctl])
208 AT_CHECK([RUN_OVS_VSCTL(
210 [--if-exists del-br b],
212 [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
213 CHECK_BRIDGES([a, a, 0])
214 CHECK_PORTS([a], [a1], [a2])
215 CHECK_IFACES([a], [a1], [a2])
219 AT_SETUP([add-br a, add-port a a1, add-port a a1])
220 AT_KEYWORDS([ovs-vsctl])
222 AT_CHECK([RUN_OVS_VSCTL(
224 [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
225 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
226 [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
227 ], [OVS_VSCTL_CLEANUP])
231 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
232 AT_KEYWORDS([ovs-vsctl])
234 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
239 [--if-exists del-port b b2],
246 ], [], [OVS_VSCTL_CLEANUP])
247 CHECK_BRIDGES([b, b, 0])
248 CHECK_PORTS([b], [b1])
249 CHECK_IFACES([b], [b1])
253 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
254 AT_KEYWORDS([ovs-vsctl])
256 AT_CHECK([RUN_OVS_VSCTL(
258 [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
259 CHECK_BRIDGES([a, a, 0])
260 CHECK_PORTS([a], [bond0])
261 CHECK_IFACES([a], [a1], [a2], [a3])
265 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
266 AT_KEYWORDS([ovs-vsctl])
268 AT_CHECK([RUN_OVS_VSCTL(
273 [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
274 CHECK_BRIDGES([a, a, 0], [b, b, 0])
277 CHECK_PORTS([b], [b1])
278 CHECK_IFACES([b], [b1])
282 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
283 AT_KEYWORDS([ovs-vsctl])
285 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
287 [add-bond a bond0 a1 a2 a3],
288 [del-port bond0])], [0], [
291 ], [], [OVS_VSCTL_CLEANUP])
292 CHECK_BRIDGES([a, a, 0])
297 AT_SETUP([external IDs])
298 AT_KEYWORDS([ovs-vsctl])
300 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
303 [add-bond a bond0 a2 a3],
304 [br-set-external-id a key0 value0],
305 [port-set-external-id a1 key1 value1],
306 [iface-set-external-id a2 key2 value2],
307 [iface-set-external-id a2 key3 value3],
308 [iface-set-external-id a3 key4 value4],
309 [br-get-external-id a],
310 [br-get-external-id a key0],
311 [br-get-external-id a key1],
312 [br-set-external-id a key0 othervalue],
313 [br-get-external-id a],
314 [br-set-external-id a key0],
315 [br-get-external-id a],
316 [port-get-external-id a1],
317 [iface-get-external-id a2],
318 [iface-get-external-id a3])], [0], [
334 key2=value2\nkey3=value3
336 ], [], [OVS_VSCTL_CLEANUP])
337 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
338 [br-get-external-id a],
339 [port-get-external-id a1],
340 [iface-get-external-id a2],
341 [iface-get-external-id a3])], [0],
344 key2=value2\nkey3=value3
346 ], [], [OVS_VSCTL_CLEANUP])
347 CHECK_BRIDGES([a, a, 0])
348 CHECK_PORTS([a], [a1], [bond0])
349 CHECK_IFACES([a], [a1], [a2], [a3])
353 dnl ----------------------------------------------------------------------
354 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
356 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
360 [add-port xenbr0 eth0],
361 [add-br xapi1 xenbr0 9],
362 [add-port xapi1 eth0.9])],
363 [0], [], [], [OVS_VSCTL_CLEANUP])])
365 AT_SETUP([simple fake bridge])
366 AT_KEYWORDS([ovs-vsctl fake-bridge])
368 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
369 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
370 CHECK_PORTS([xenbr0], [eth0])
371 CHECK_IFACES([xenbr0], [eth0])
372 CHECK_PORTS([xapi1], [eth0.9])
373 CHECK_IFACES([xapi1], [eth0.9])
377 AT_SETUP([simple fake bridge + del-br fake bridge])
378 AT_KEYWORDS([ovs-vsctl fake-bridge])
380 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
381 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
382 CHECK_BRIDGES([xenbr0, xenbr0, 0])
383 CHECK_PORTS([xenbr0], [eth0])
384 CHECK_IFACES([xenbr0], [eth0])
388 AT_SETUP([simple fake bridge + del-br real bridge])
389 AT_KEYWORDS([ovs-vsctl fake-bridge])
391 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
392 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
397 AT_SETUP([simple fake bridge + external IDs])
398 AT_KEYWORDS([ovs-vsctl fake-bridge])
400 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
401 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
402 [br-set-external-id xenbr0 key0 value0],
403 [br-set-external-id xapi1 key1 value1],
404 [br-get-external-id xenbr0],
405 [br-get-external-id xenbr0 key0],
406 [br-get-external-id xapi1],
407 [br-get-external-id xapi1 key1])], [0], [
413 ], [], [OVS_VSCTL_CLEANUP])
414 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
415 CHECK_PORTS([xenbr0], [eth0])
416 CHECK_IFACES([xenbr0], [eth0])
417 CHECK_PORTS([xapi1], [eth0.9])
418 CHECK_IFACES([xapi1], [eth0.9])
422 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
426 [add-bond xapi1 bond0 eth0 eth1],
427 [add-br xapi2 xapi1 11],
428 [add-port xapi2 bond0.11])],
429 [0], [], [], [OVS_VSCTL_CLEANUP])])
431 AT_SETUP([fake bridge on bond])
432 AT_KEYWORDS([ovs-vsctl fake-bridge])
434 OVS_VSCTL_SETUP_BOND_FAKE_CONF
435 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
436 CHECK_PORTS([xapi1], [bond0])
437 CHECK_IFACES([xapi1], [eth0], [eth1])
438 CHECK_PORTS([xapi2], [bond0.11])
439 CHECK_IFACES([xapi2], [bond0.11])
443 AT_SETUP([fake bridge on bond + del-br fake bridge])
444 AT_KEYWORDS([ovs-vsctl fake-bridge])
446 OVS_VSCTL_SETUP_BOND_FAKE_CONF
447 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
448 ], [], [OVS_VSCTL_CLEANUP])
449 CHECK_BRIDGES([xapi1, xapi1, 0])
450 CHECK_PORTS([xapi1], [bond0])
451 CHECK_IFACES([xapi1], [eth0], [eth1])
455 AT_SETUP([fake bridge on bond + del-br real bridge])
456 AT_KEYWORDS([ovs-vsctl fake-bridge])
458 OVS_VSCTL_SETUP_BOND_FAKE_CONF
459 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])