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 dnl ----------------------------------------------------------------------
275 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
277 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
281 [add-port xenbr0 eth0],
282 [add-br xapi1 xenbr0 9],
283 [add-port xapi1 eth0.9])],
284 [0], [], [], [OVS_VSCTL_CLEANUP])])
286 AT_SETUP([simple fake bridge])
287 AT_KEYWORDS([ovs-vsctl fake-bridge])
289 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
290 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
291 CHECK_PORTS([xenbr0], [eth0])
292 CHECK_IFACES([xenbr0], [eth0])
293 CHECK_PORTS([xapi1], [eth0.9])
294 CHECK_IFACES([xapi1], [eth0.9])
298 AT_SETUP([simple fake bridge + del-br fake bridge])
299 AT_KEYWORDS([ovs-vsctl fake-bridge])
301 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
302 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
303 CHECK_BRIDGES([xenbr0, xenbr0, 0])
304 CHECK_PORTS([xenbr0], [eth0])
305 CHECK_IFACES([xenbr0], [eth0])
309 AT_SETUP([simple fake bridge + del-br real bridge])
310 AT_KEYWORDS([ovs-vsctl fake-bridge])
312 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
313 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
318 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
322 [add-bond xapi1 bond0 eth0 eth1],
323 [add-br xapi2 xapi1 11],
324 [add-port xapi2 bond0.11])],
325 [0], [], [], [OVS_VSCTL_CLEANUP])])
327 AT_SETUP([fake bridge on bond])
328 AT_KEYWORDS([ovs-vsctl fake-bridge])
330 OVS_VSCTL_SETUP_BOND_FAKE_CONF
331 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
332 CHECK_PORTS([xapi1], [bond0])
333 CHECK_IFACES([xapi1], [eth0], [eth1])
334 CHECK_PORTS([xapi2], [bond0.11])
335 CHECK_IFACES([xapi2], [bond0.11])
339 AT_SETUP([fake bridge on bond + del-br fake bridge])
340 AT_KEYWORDS([ovs-vsctl fake-bridge])
342 OVS_VSCTL_SETUP_BOND_FAKE_CONF
343 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
344 ], [], [OVS_VSCTL_CLEANUP])
345 CHECK_BRIDGES([xapi1, xapi1, 0])
346 CHECK_PORTS([xapi1], [bond0])
347 CHECK_IFACES([xapi1], [eth0], [eth1])
351 AT_SETUP([fake bridge on bond + del-br real bridge])
352 AT_KEYWORDS([ovs-vsctl fake-bridge])
354 OVS_VSCTL_SETUP_BOND_FAKE_CONF
355 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])