Make ovs-vswitchd report when it is done configuring; make ovs-vsctl wait.
[cascardo/ovs.git] / tests / ovs-vsctl.at
1 dnl OVS_VSCTL_SETUP
2 dnl
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],
6   [OVS_CHECK_LCOV(
7      [ovsdb-tool create db $abs_builddir/../vswitchd/vswitch-idl.ovsschema], 
8      [0], [stdout], [ignore])
9    OVS_CHECK_LCOV(
10      [[ovsdb-tool transact db \
11         '[{"op": "insert",
12            "table": "Open_vSwitch",
13            "row": {}}]']],
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])])
16
17 dnl OVS_VSCTL_CLEANUP
18 dnl
19 dnl Kills off the database server.
20 m4_define([OVS_VSCTL_CLEANUP], [test ! -e pid || kill `cat pid`])
21
22 dnl RUN_OVS_VSCTL(COMMAND, ...)
23 dnl
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
27 ])])
28 m4_define([RUN_OVS_VSCTL_ONELINE],
29   [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline -- command
30 ])])
31
32 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
33 dnl
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])])
38
39 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
40 dnl
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])
47
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])
57
58    # Check multiple queries in a single run.
59    AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
60 [$2
61 $3
62 ], [], [OVS_VSCTL_CLEANUP])])
63 m4_define([CHECK_BRIDGES],
64   [dnl Check that the bridges appear on list-br, without --oneline.
65    AT_CHECK(
66      [RUN_OVS_VSCTL([list-br])],
67      [0],
68      [m4_foreach([brinfo], [$@], [m4_car(brinfo)
69 ])],
70      [],
71      [OVS_VSCTL_CLEANUP])
72
73    dnl Check that the bridges appear on list-br, with --oneline.
74    AT_CHECK(
75      [RUN_OVS_VSCTL_ONELINE([list-br])],
76      [0],
77      [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
78 ],
79      [],
80      [OVS_VSCTL_CLEANUP])
81
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], [], [],
88             [OVS_VSCTL_CLEANUP])
89
90    dnl Check that each bridge has the expected parent and VLAN.
91    m4_map([_CHECK_BRIDGE], [$@])])
92
93 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
94 dnl
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
98 dnl in BRIDGE.
99 m4_define([CHECK_PORTS],
100   [dnl Check ports without --oneline.
101    AT_CHECK(
102      [RUN_OVS_VSCTL([list-ports $1])],
103      [0],
104      [m4_foreach([port], m4_cdr($@), [port
105 ])],
106      [],
107      [OVS_VSCTL_CLEANUP])
108
109    dnl Check ports with --oneline.
110    AT_CHECK(
111      [RUN_OVS_VSCTL_ONELINE([list-ports $1])],
112      [0],
113      [m4_join([\n], m4_shift($@))
114 ],
115      [],
116      [OVS_VSCTL_CLEANUP])
117    AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
118             [ovs-vsctl: no port named $1
119 ],
120             [OVS_VSCTL_CLEANUP])
121    m4_foreach(
122      [port], m4_cdr($@), 
123      [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
124 ], [], [OVS_VSCTL_CLEANUP])])])
125
126 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
127 dnl
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
131 dnl in BRIDGE.
132 m4_define([CHECK_IFACES],
133   [AT_CHECK(
134      [RUN_OVS_VSCTL([list-ifaces $1])],
135      [0],
136      [m4_foreach([iface], m4_cdr($@), [iface
137 ])],
138      [],
139      [OVS_VSCTL_CLEANUP])
140    AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
141             [ovs-vsctl: no interface named $1
142 ],
143             [OVS_VSCTL_CLEANUP])
144    m4_foreach(
145      [iface], m4_cdr($@), 
146      [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
147 ],
148                [], [OVS_VSCTL_CLEANUP])])])
149
150 dnl ----------------------------------------------------------------------
151 AT_BANNER([ovs-vsctl unit tests -- real bridges])
152
153 AT_SETUP([add-br a])
154 AT_KEYWORDS([ovs-vsctl])
155 OVS_VSCTL_SETUP
156 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
157 CHECK_BRIDGES([a, a, 0])
158 CHECK_PORTS([a])
159 CHECK_IFACES([a])
160 OVS_VSCTL_CLEANUP
161 AT_CLEANUP
162
163 AT_SETUP([add-br a, add-br a])
164 AT_KEYWORDS([ovs-vsctl])
165 OVS_VSCTL_SETUP
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])
170 OVS_VSCTL_CLEANUP
171 AT_CLEANUP
172
173 AT_SETUP([add-br a, add-br b])
174 AT_KEYWORDS([ovs-vsctl])
175 OVS_VSCTL_SETUP
176 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
177          [OVS_VSCTL_CLEANUP])
178 CHECK_BRIDGES([a, a, 0], [b, b, 0])
179 CHECK_PORTS([a])
180 CHECK_IFACES([a])
181 CHECK_PORTS([b])
182 CHECK_IFACES([b])
183 OVS_VSCTL_CLEANUP
184 AT_CLEANUP
185
186 AT_SETUP([add-br a, add-br b, del-br a])
187 AT_KEYWORDS([ovs-vsctl])
188 OVS_VSCTL_SETUP
189 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
190          [OVS_VSCTL_CLEANUP])
191 CHECK_BRIDGES([b, b, 0])
192 CHECK_PORTS([b])
193 CHECK_IFACES([b])
194 OVS_VSCTL_CLEANUP
195 AT_CLEANUP
196
197 AT_SETUP([add-br a, add-port a a1, add-port a a2])
198 AT_KEYWORDS([ovs-vsctl])
199 OVS_VSCTL_SETUP
200 AT_CHECK([RUN_OVS_VSCTL(
201    [add-br a],
202    [--if-exists del-br b],
203    [add-port a a1],
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])
208 OVS_VSCTL_CLEANUP
209 AT_CLEANUP
210
211 AT_SETUP([add-br a, add-port a a1, add-port a a1])
212 AT_KEYWORDS([ovs-vsctl])
213 OVS_VSCTL_SETUP
214 AT_CHECK([RUN_OVS_VSCTL(
215    [add-br a], 
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])
220 OVS_VSCTL_CLEANUP
221 AT_CLEANUP
222
223 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
224 AT_KEYWORDS([ovs-vsctl])
225 OVS_VSCTL_SETUP
226 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
227    [add-br a], 
228    [add-br b], 
229    [add-port a a1],
230    [add-port b b1],
231    [--if-exists del-port b b2],
232    [del-br a])], [0], [
233
234
235
236
237
238 ], [], [OVS_VSCTL_CLEANUP])
239 CHECK_BRIDGES([b, b, 0])
240 CHECK_PORTS([b], [b1])
241 CHECK_IFACES([b], [b1])
242 OVS_VSCTL_CLEANUP
243 AT_CLEANUP
244
245 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
246 AT_KEYWORDS([ovs-vsctl])
247 OVS_VSCTL_SETUP
248 AT_CHECK([RUN_OVS_VSCTL(
249    [add-br a], 
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])
254 OVS_VSCTL_CLEANUP
255 AT_CLEANUP
256
257 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
258 AT_KEYWORDS([ovs-vsctl])
259 OVS_VSCTL_SETUP
260 AT_CHECK([RUN_OVS_VSCTL(
261   [add-br a], 
262   [add-br b], 
263   [add-port a a1],
264   [add-port b b1],
265   [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
266 CHECK_BRIDGES([a, a, 0], [b, b, 0])
267 CHECK_PORTS([a])
268 CHECK_IFACES([a])
269 CHECK_PORTS([b], [b1])
270 CHECK_IFACES([b], [b1])
271 OVS_VSCTL_CLEANUP
272 AT_CLEANUP
273
274 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
275 AT_KEYWORDS([ovs-vsctl])
276 OVS_VSCTL_SETUP
277 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
278   [add-br a], 
279   [add-bond a bond0 a1 a2 a3],
280   [del-port bond0])], [0], [
281
282
283 ], [], [OVS_VSCTL_CLEANUP])
284 CHECK_BRIDGES([a, a, 0])
285 CHECK_PORTS([a])
286 OVS_VSCTL_CLEANUP
287 AT_CLEANUP
288
289 AT_SETUP([external IDs])
290 AT_KEYWORDS([ovs-vsctl])
291 OVS_VSCTL_SETUP
292 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
293   [add-br a], 
294   [add-port a a1],
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], [
311
312
313
314
315
316
317
318 key0=value0
319 value0
320
321
322 key0=othervalue
323
324
325 key1=value1
326 key2=value2\nkey3=value3
327 key4=value4
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],
334 [
335 key1=value1
336 key2=value2\nkey3=value3
337 key4=value4
338 ], [], [OVS_VSCTL_CLEANUP])
339 CHECK_BRIDGES([a, a, 0])
340 CHECK_PORTS([a], [a1], [bond0])
341 CHECK_IFACES([a], [a1], [a2], [a3])
342 OVS_VSCTL_CLEANUP
343 AT_CLEANUP
344
345 dnl ----------------------------------------------------------------------
346 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
347
348 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
349   [AT_CHECK(
350      [RUN_OVS_VSCTL(
351         [add-br xenbr0],
352         [add-port xenbr0 eth0],
353         [add-br xapi1 xenbr0 9],
354         [add-port xapi1 eth0.9])],
355      [0], [], [], [OVS_VSCTL_CLEANUP])])
356
357 AT_SETUP([simple fake bridge])
358 AT_KEYWORDS([ovs-vsctl fake-bridge])
359 OVS_VSCTL_SETUP
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])
366 OVS_VSCTL_CLEANUP
367 AT_CLEANUP
368
369 AT_SETUP([simple fake bridge + del-br fake bridge])
370 AT_KEYWORDS([ovs-vsctl fake-bridge])
371 OVS_VSCTL_SETUP
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])
377 OVS_VSCTL_CLEANUP
378 AT_CLEANUP
379
380 AT_SETUP([simple fake bridge + del-br real bridge])
381 AT_KEYWORDS([ovs-vsctl fake-bridge])
382 OVS_VSCTL_SETUP
383 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
384 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
385 CHECK_BRIDGES
386 OVS_VSCTL_CLEANUP
387 AT_CLEANUP
388
389 AT_SETUP([simple fake bridge + external IDs])
390 AT_KEYWORDS([ovs-vsctl fake-bridge])
391 OVS_VSCTL_SETUP
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], [
400
401 key0=value0
402 value0
403 key1=value1
404 value1
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])
411 OVS_VSCTL_CLEANUP
412 AT_CLEANUP
413
414 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
415   [AT_CHECK(
416      [RUN_OVS_VSCTL(
417         [add-br xapi1],
418         [add-bond xapi1 bond0 eth0 eth1],
419         [add-br xapi2 xapi1 11],
420         [add-port xapi2 bond0.11])],
421      [0], [], [], [OVS_VSCTL_CLEANUP])])
422
423 AT_SETUP([fake bridge on bond])
424 AT_KEYWORDS([ovs-vsctl fake-bridge])
425 OVS_VSCTL_SETUP
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])
432 OVS_VSCTL_CLEANUP
433 AT_CLEANUP
434
435 AT_SETUP([fake bridge on bond + del-br fake bridge])
436 AT_KEYWORDS([ovs-vsctl fake-bridge])
437 OVS_VSCTL_SETUP
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])
444 OVS_VSCTL_CLEANUP
445 AT_CLEANUP
446
447 AT_SETUP([fake bridge on bond + del-br real bridge])
448 AT_KEYWORDS([ovs-vsctl fake-bridge])
449 OVS_VSCTL_SETUP
450 OVS_VSCTL_SETUP_BOND_FAKE_CONF
451 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
452 CHECK_BRIDGES
453 OVS_VSCTL_CLEANUP
454 AT_CLEANUP