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
136 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
137 [ovs-vsctl: no interface named $1
142 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
144 [], [OVS_VSCTL_CLEANUP])])])
146 dnl ----------------------------------------------------------------------
147 AT_BANNER([ovs-vsctl unit tests -- real bridges])
150 AT_KEYWORDS([ovs-vsctl])
152 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
153 CHECK_BRIDGES([a, a, 0])
159 AT_SETUP([add-br a, add-br a])
160 AT_KEYWORDS([ovs-vsctl])
162 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
163 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
164 [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
165 ], [OVS_VSCTL_CLEANUP])
169 AT_SETUP([add-br a, add-br b])
170 AT_KEYWORDS([ovs-vsctl])
172 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
174 CHECK_BRIDGES([a, a, 0], [b, b, 0])
182 AT_SETUP([add-br a, add-br b, del-br a])
183 AT_KEYWORDS([ovs-vsctl])
185 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
187 CHECK_BRIDGES([b, b, 0])
193 AT_SETUP([add-br a, add-port a a1, add-port a a2])
194 AT_KEYWORDS([ovs-vsctl])
196 AT_CHECK([RUN_OVS_VSCTL(
199 [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
200 CHECK_BRIDGES([a, a, 0])
201 CHECK_PORTS([a], [a1], [a2])
202 CHECK_IFACES([a], [a1], [a2])
206 AT_SETUP([add-br a, add-port a a1, add-port a a1])
207 AT_KEYWORDS([ovs-vsctl])
209 AT_CHECK([RUN_OVS_VSCTL(
211 [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
212 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
213 [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
214 ], [OVS_VSCTL_CLEANUP])
218 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
219 AT_KEYWORDS([ovs-vsctl])
221 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
226 [del-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
227 CHECK_BRIDGES([b, b, 0])
228 CHECK_PORTS([b], [b1])
229 CHECK_IFACES([b], [b1])
233 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
234 AT_KEYWORDS([ovs-vsctl])
236 AT_CHECK([RUN_OVS_VSCTL(
238 [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
239 CHECK_BRIDGES([a, a, 0])
240 CHECK_PORTS([a], [bond0])
241 CHECK_IFACES([a], [a1], [a2], [a3])
245 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
246 AT_KEYWORDS([ovs-vsctl])
248 AT_CHECK([RUN_OVS_VSCTL(
253 [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
254 CHECK_BRIDGES([a, a, 0], [b, b, 0])
257 CHECK_PORTS([b], [b1])
258 CHECK_IFACES([b], [b1])
262 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
263 AT_KEYWORDS([ovs-vsctl])
265 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
267 [add-bond a bond0 a1 a2 a3],
268 [del-port bond0])], [0], [], [], [OVS_VSCTL_CLEANUP])
269 CHECK_BRIDGES([a, a, 0])
274 AT_SETUP([external IDs])
275 AT_KEYWORDS([ovs-vsctl])
277 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
278 [--oneline add-br a],
280 [add-bond a bond0 a2 a3],
281 [br-set-external-id a key0 value0],
282 [port-set-external-id a1 key1 value1],
283 [iface-set-external-id a2 key2 value2],
284 [iface-set-external-id a2 key3 value3],
285 [iface-set-external-id a3 key4 value4],
286 [br-get-external-id a],
287 [br-get-external-id a key0],
288 [br-get-external-id a key1],
289 [br-set-external-id a key0 othervalue],
290 [br-get-external-id a],
291 [br-set-external-id a key0],
292 [br-get-external-id a],
293 [port-get-external-id a1],
294 [iface-get-external-id a2],
295 [iface-get-external-id a3])], [0], [
311 key2=value2\nkey3=value3
313 ], [], [OVS_VSCTL_CLEANUP])
314 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
315 [--oneline br-get-external-id a],
316 [port-get-external-id a1],
317 [iface-get-external-id a2],
318 [iface-get-external-id a3])], [0],
321 key2=value2\nkey3=value3
323 ], [], [OVS_VSCTL_CLEANUP])
324 CHECK_BRIDGES([a, a, 0])
325 CHECK_PORTS([a], [a1], [bond0])
326 CHECK_IFACES([a], [a1], [a2], [a3])
330 dnl ----------------------------------------------------------------------
331 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
333 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
337 [add-port xenbr0 eth0],
338 [add-br xapi1 xenbr0 9],
339 [add-port xapi1 eth0.9])],
340 [0], [], [], [OVS_VSCTL_CLEANUP])])
342 AT_SETUP([simple fake bridge])
343 AT_KEYWORDS([ovs-vsctl fake-bridge])
345 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
346 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
347 CHECK_PORTS([xenbr0], [eth0])
348 CHECK_IFACES([xenbr0], [eth0])
349 CHECK_PORTS([xapi1], [eth0.9])
350 CHECK_IFACES([xapi1], [eth0.9])
354 AT_SETUP([simple fake bridge + del-br fake bridge])
355 AT_KEYWORDS([ovs-vsctl fake-bridge])
357 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
358 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
359 CHECK_BRIDGES([xenbr0, xenbr0, 0])
360 CHECK_PORTS([xenbr0], [eth0])
361 CHECK_IFACES([xenbr0], [eth0])
365 AT_SETUP([simple fake bridge + del-br real bridge])
366 AT_KEYWORDS([ovs-vsctl fake-bridge])
368 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
369 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
374 AT_SETUP([simple fake bridge + external IDs])
375 AT_KEYWORDS([ovs-vsctl fake-bridge])
377 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
378 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
379 [--oneline br-set-external-id xenbr0 key0 value0],
380 [br-set-external-id xapi1 key1 value1],
381 [br-get-external-id xenbr0],
382 [br-get-external-id xenbr0 key0],
383 [br-get-external-id xapi1],
384 [br-get-external-id xapi1 key1])], [0], [
390 ], [], [OVS_VSCTL_CLEANUP])
391 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
392 CHECK_PORTS([xenbr0], [eth0])
393 CHECK_IFACES([xenbr0], [eth0])
394 CHECK_PORTS([xapi1], [eth0.9])
395 CHECK_IFACES([xapi1], [eth0.9])
399 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
403 [add-bond xapi1 bond0 eth0 eth1],
404 [add-br xapi2 xapi1 11],
405 [add-port xapi2 bond0.11])],
406 [0], [], [], [OVS_VSCTL_CLEANUP])])
408 AT_SETUP([fake bridge on bond])
409 AT_KEYWORDS([ovs-vsctl fake-bridge])
411 OVS_VSCTL_SETUP_BOND_FAKE_CONF
412 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
413 CHECK_PORTS([xapi1], [bond0])
414 CHECK_IFACES([xapi1], [eth0], [eth1])
415 CHECK_PORTS([xapi2], [bond0.11])
416 CHECK_IFACES([xapi2], [bond0.11])
420 AT_SETUP([fake bridge on bond + del-br fake bridge])
421 AT_KEYWORDS([ovs-vsctl fake-bridge])
423 OVS_VSCTL_SETUP_BOND_FAKE_CONF
424 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
425 ], [], [OVS_VSCTL_CLEANUP])
426 CHECK_BRIDGES([xapi1, xapi1, 0])
427 CHECK_PORTS([xapi1], [bond0])
428 CHECK_IFACES([xapi1], [eth0], [eth1])
432 AT_SETUP([fake bridge on bond + del-br real bridge])
433 AT_KEYWORDS([ovs-vsctl fake-bridge])
435 OVS_VSCTL_SETUP_BOND_FAKE_CONF
436 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])