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 --no-wait -vreconnect:ANY:emer --db=unix:socket -- command
28 m4_define([RUN_OVS_VSCTL_ONELINE],
29 [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline -- command
32 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
34 dnl Executes each ovs-vsctl COMMAND in a single run of ovs-vsctl.
35 m4_define([RUN_OVS_VSCTL_TOGETHER],
36 [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline dnl
37 m4_foreach([command], [$@], [ -- command])])
39 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
41 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
42 dnl which must be in alphabetical order. Also checks that each BRIDGE has the
43 dnl specified PARENT and is on the given VLAN.
44 m4_define([_CHECK_BRIDGE],
45 [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
46 ], [], [OVS_VSCTL_CLEANUP])
48 # Check br-to-vlan, without --oneline.
49 AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
50 ], [], [OVS_VSCTL_CLEANUP])
51 # Check br-to-vlan, with --oneline.
52 # (This particular test is interesting with --oneline because it returns
53 # an integer instead of a string and that can cause type mismatches inside
54 # python if not done carefully.)
55 AT_CHECK([RUN_OVS_VSCTL_ONELINE([br-to-vlan $1])], [0], [$3
56 ], [], [OVS_VSCTL_CLEANUP])
58 # Check multiple queries in a single run.
59 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
62 ], [], [OVS_VSCTL_CLEANUP])])
63 m4_define([CHECK_BRIDGES],
64 [dnl Check that the bridges appear on list-br, without --oneline.
66 [RUN_OVS_VSCTL([list-br])],
68 [m4_foreach([brinfo], [$@], [m4_car(brinfo)
73 dnl Check that the bridges appear on list-br, with --oneline.
75 [RUN_OVS_VSCTL_ONELINE([list-br])],
77 [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
82 dnl Check that each bridge exists according to br-exists and that
83 dnl a bridge that should not exist does not.
84 m4_foreach([brinfo], [$@],
85 [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])], [0], [],
86 [], [OVS_VSCTL_CLEANUP])])
87 AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2], [], [],
90 dnl Check that each bridge has the expected parent and VLAN.
91 m4_map([_CHECK_BRIDGE], [$@])])
93 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
95 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
96 dnl list of ports, which must be in alphabetical order. Also checks
97 dnl that "ovs-vsctl port-to-br" reports that each port is
99 m4_define([CHECK_PORTS],
100 [dnl Check ports without --oneline.
102 [RUN_OVS_VSCTL([list-ports $1])],
104 [m4_foreach([port], m4_cdr($@), [port
109 dnl Check ports with --oneline.
111 [RUN_OVS_VSCTL_ONELINE([list-ports $1])],
113 [m4_join([\n], m4_shift($@))
117 AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
118 [ovs-vsctl: no port named $1
123 [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
124 ], [], [OVS_VSCTL_CLEANUP])])])
126 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
128 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
129 dnl list of ifaces, which must be in alphabetical order. Also checks
130 dnl that "ovs-vsctl iface-to-br" reports that each interface is
132 m4_define([CHECK_IFACES],
134 [RUN_OVS_VSCTL([list-ifaces $1])],
136 [m4_foreach([iface], m4_cdr($@), [iface
140 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
141 [ovs-vsctl: no interface named $1
146 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
148 [], [OVS_VSCTL_CLEANUP])])])
150 dnl ----------------------------------------------------------------------
151 AT_BANNER([ovs-vsctl unit tests -- real bridges])
154 AT_KEYWORDS([ovs-vsctl])
156 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
157 CHECK_BRIDGES([a, a, 0])
163 AT_SETUP([add-br a, add-br a])
164 AT_KEYWORDS([ovs-vsctl])
166 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
167 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
168 [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
169 ], [OVS_VSCTL_CLEANUP])
173 AT_SETUP([add-br a, add-br b])
174 AT_KEYWORDS([ovs-vsctl])
176 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
178 CHECK_BRIDGES([a, a, 0], [b, b, 0])
186 AT_SETUP([add-br a, add-br b, del-br a])
187 AT_KEYWORDS([ovs-vsctl])
189 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
191 CHECK_BRIDGES([b, b, 0])
197 AT_SETUP([add-br a, add-port a a1, add-port a a2])
198 AT_KEYWORDS([ovs-vsctl])
200 AT_CHECK([RUN_OVS_VSCTL(
202 [--if-exists del-br b],
204 [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
205 CHECK_BRIDGES([a, a, 0])
206 CHECK_PORTS([a], [a1], [a2])
207 CHECK_IFACES([a], [a1], [a2])
211 AT_SETUP([add-br a, add-port a a1, add-port a a1])
212 AT_KEYWORDS([ovs-vsctl])
214 AT_CHECK([RUN_OVS_VSCTL(
216 [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
217 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
218 [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
219 ], [OVS_VSCTL_CLEANUP])
223 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
224 AT_KEYWORDS([ovs-vsctl])
226 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
231 [--if-exists del-port b b2],
238 ], [], [OVS_VSCTL_CLEANUP])
239 CHECK_BRIDGES([b, b, 0])
240 CHECK_PORTS([b], [b1])
241 CHECK_IFACES([b], [b1])
245 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
246 AT_KEYWORDS([ovs-vsctl])
248 AT_CHECK([RUN_OVS_VSCTL(
250 [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
251 CHECK_BRIDGES([a, a, 0])
252 CHECK_PORTS([a], [bond0])
253 CHECK_IFACES([a], [a1], [a2], [a3])
257 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
258 AT_KEYWORDS([ovs-vsctl])
260 AT_CHECK([RUN_OVS_VSCTL(
265 [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
266 CHECK_BRIDGES([a, a, 0], [b, b, 0])
269 CHECK_PORTS([b], [b1])
270 CHECK_IFACES([b], [b1])
274 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
275 AT_KEYWORDS([ovs-vsctl])
277 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
279 [add-bond a bond0 a1 a2 a3],
280 [del-port bond0])], [0], [
283 ], [], [OVS_VSCTL_CLEANUP])
284 CHECK_BRIDGES([a, a, 0])
289 AT_SETUP([external IDs])
290 AT_KEYWORDS([ovs-vsctl])
292 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
295 [add-bond a bond0 a2 a3],
296 [br-set-external-id a key0 value0],
297 [port-set-external-id a1 key1 value1],
298 [iface-set-external-id a2 key2 value2],
299 [iface-set-external-id a2 key3 value3],
300 [iface-set-external-id a3 key4 value4],
301 [br-get-external-id a],
302 [br-get-external-id a key0],
303 [br-get-external-id a key1],
304 [br-set-external-id a key0 othervalue],
305 [br-get-external-id a],
306 [br-set-external-id a key0],
307 [br-get-external-id a],
308 [port-get-external-id a1],
309 [iface-get-external-id a2],
310 [iface-get-external-id a3])], [0], [
326 key2=value2\nkey3=value3
328 ], [], [OVS_VSCTL_CLEANUP])
329 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
330 [br-get-external-id a],
331 [port-get-external-id a1],
332 [iface-get-external-id a2],
333 [iface-get-external-id a3])], [0],
336 key2=value2\nkey3=value3
338 ], [], [OVS_VSCTL_CLEANUP])
339 CHECK_BRIDGES([a, a, 0])
340 CHECK_PORTS([a], [a1], [bond0])
341 CHECK_IFACES([a], [a1], [a2], [a3])
345 dnl ----------------------------------------------------------------------
346 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
348 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
352 [add-port xenbr0 eth0],
353 [add-br xapi1 xenbr0 9],
354 [add-port xapi1 eth0.9])],
355 [0], [], [], [OVS_VSCTL_CLEANUP])])
357 AT_SETUP([simple fake bridge])
358 AT_KEYWORDS([ovs-vsctl fake-bridge])
360 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
361 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
362 CHECK_PORTS([xenbr0], [eth0])
363 CHECK_IFACES([xenbr0], [eth0])
364 CHECK_PORTS([xapi1], [eth0.9])
365 CHECK_IFACES([xapi1], [eth0.9])
369 AT_SETUP([simple fake bridge + del-br fake bridge])
370 AT_KEYWORDS([ovs-vsctl fake-bridge])
372 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
373 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
374 CHECK_BRIDGES([xenbr0, xenbr0, 0])
375 CHECK_PORTS([xenbr0], [eth0])
376 CHECK_IFACES([xenbr0], [eth0])
380 AT_SETUP([simple fake bridge + del-br real bridge])
381 AT_KEYWORDS([ovs-vsctl fake-bridge])
383 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
384 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
389 AT_SETUP([simple fake bridge + external IDs])
390 AT_KEYWORDS([ovs-vsctl fake-bridge])
392 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
393 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
394 [br-set-external-id xenbr0 key0 value0],
395 [br-set-external-id xapi1 key1 value1],
396 [br-get-external-id xenbr0],
397 [br-get-external-id xenbr0 key0],
398 [br-get-external-id xapi1],
399 [br-get-external-id xapi1 key1])], [0], [
405 ], [], [OVS_VSCTL_CLEANUP])
406 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
407 CHECK_PORTS([xenbr0], [eth0])
408 CHECK_IFACES([xenbr0], [eth0])
409 CHECK_PORTS([xapi1], [eth0.9])
410 CHECK_IFACES([xapi1], [eth0.9])
414 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
418 [add-bond xapi1 bond0 eth0 eth1],
419 [add-br xapi2 xapi1 11],
420 [add-port xapi2 bond0.11])],
421 [0], [], [], [OVS_VSCTL_CLEANUP])])
423 AT_SETUP([fake bridge on bond])
424 AT_KEYWORDS([ovs-vsctl fake-bridge])
426 OVS_VSCTL_SETUP_BOND_FAKE_CONF
427 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
428 CHECK_PORTS([xapi1], [bond0])
429 CHECK_IFACES([xapi1], [eth0], [eth1])
430 CHECK_PORTS([xapi2], [bond0.11])
431 CHECK_IFACES([xapi2], [bond0.11])
435 AT_SETUP([fake bridge on bond + del-br fake bridge])
436 AT_KEYWORDS([ovs-vsctl fake-bridge])
438 OVS_VSCTL_SETUP_BOND_FAKE_CONF
439 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
440 ], [], [OVS_VSCTL_CLEANUP])
441 CHECK_BRIDGES([xapi1, xapi1, 0])
442 CHECK_PORTS([xapi1], [bond0])
443 CHECK_IFACES([xapi1], [eth0], [eth1])
447 AT_SETUP([fake bridge on bond + del-br real bridge])
448 AT_KEYWORDS([ovs-vsctl fake-bridge])
450 OVS_VSCTL_SETUP_BOND_FAKE_CONF
451 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])