util: Fix non-ANSI function declaration.
[openvswitch] / 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   [OVSDB_INIT([db])
7    AT_CHECK([ovsdb-server --detach --pidfile=$PWD/pid --remote=punix:socket --unixctl=$PWD/unixctl db >/dev/null 2>&1], [0], [ignore], [ignore])])
8
9 dnl OVS_VSCTL_CLEANUP
10 dnl
11 dnl Kills off the database server.
12 m4_define([OVS_VSCTL_CLEANUP], [OVSDB_SERVER_SHUTDOWN])
13
14 dnl RUN_OVS_VSCTL(COMMAND, ...)
15 dnl
16 dnl Executes each ovs-vsctl COMMAND.
17 m4_define([RUN_OVS_VSCTL],
18   [m4_foreach([command], [$@], [ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket -- command
19 ])])
20 m4_define([RUN_OVS_VSCTL_ONELINE],
21   [m4_foreach([command], [$@], [ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline -- command
22 ])])
23
24 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
25 dnl
26 dnl Executes each ovs-vsctl COMMAND in a single run of ovs-vsctl.
27 m4_define([RUN_OVS_VSCTL_TOGETHER],
28   [ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline dnl
29 m4_foreach([command], [$@], [ -- command])])
30
31 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
32 dnl
33 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
34 dnl which must be in alphabetical order.  Also checks that each BRIDGE has the
35 dnl specified PARENT and is on the given VLAN.
36 m4_define([_CHECK_BRIDGE],
37   [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
38 ], [], [OVS_VSCTL_CLEANUP])
39
40    # Check br-to-vlan, without --oneline.
41    AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
42 ], [], [OVS_VSCTL_CLEANUP])
43    # Check br-to-vlan, with --oneline.
44    # (This particular test is interesting with --oneline because it returns
45    # an integer instead of a string and that can cause type mismatches inside
46    # python if not done carefully.)
47    AT_CHECK([RUN_OVS_VSCTL_ONELINE([br-to-vlan $1])], [0], [$3
48 ], [], [OVS_VSCTL_CLEANUP])
49
50    # Check multiple queries in a single run.
51    AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
52 [$2
53 $3
54 ], [], [OVS_VSCTL_CLEANUP])])
55 m4_define([CHECK_BRIDGES],
56   [dnl Check that the bridges appear on list-br, without --oneline.
57    AT_CHECK(
58      [RUN_OVS_VSCTL([list-br])],
59      [0],
60      [m4_foreach([brinfo], [$@], [m4_car(brinfo)
61 ])],
62      [],
63      [OVS_VSCTL_CLEANUP])
64
65    dnl Check that the bridges appear on list-br, with --oneline.
66    AT_CHECK(
67      [RUN_OVS_VSCTL_ONELINE([list-br])],
68      [0],
69      [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
70 ],
71      [],
72      [OVS_VSCTL_CLEANUP])
73
74    dnl Check that each bridge exists according to br-exists and that
75    dnl a bridge that should not exist does not.
76    m4_foreach([brinfo], [$@], 
77               [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])], [0], [],
78                         [], [OVS_VSCTL_CLEANUP])])
79    AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2], [], [],
80             [OVS_VSCTL_CLEANUP])
81
82    dnl Check that each bridge has the expected parent and VLAN.
83    m4_map([_CHECK_BRIDGE], [$@])])
84
85 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
86 dnl
87 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
88 dnl list of ports, which must be in alphabetical order.  Also checks
89 dnl that "ovs-vsctl port-to-br" reports that each port is
90 dnl in BRIDGE.
91 m4_define([CHECK_PORTS],
92   [dnl Check ports without --oneline.
93    AT_CHECK(
94      [RUN_OVS_VSCTL([list-ports $1])],
95      [0],
96      [m4_foreach([port], m4_cdr($@), [port
97 ])],
98      [],
99      [OVS_VSCTL_CLEANUP])
100
101    dnl Check ports with --oneline.
102    AT_CHECK(
103      [RUN_OVS_VSCTL_ONELINE([list-ports $1])],
104      [0],
105      [m4_join([\n], m4_shift($@))
106 ],
107      [],
108      [OVS_VSCTL_CLEANUP])
109    AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
110             [ovs-vsctl: no port named $1
111 ],
112             [OVS_VSCTL_CLEANUP])
113    m4_foreach(
114      [port], m4_cdr($@), 
115      [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
116 ], [], [OVS_VSCTL_CLEANUP])])])
117
118 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
119 dnl
120 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
121 dnl list of ifaces, which must be in alphabetical order.  Also checks
122 dnl that "ovs-vsctl iface-to-br" reports that each interface is
123 dnl in BRIDGE.
124 m4_define([CHECK_IFACES],
125   [AT_CHECK(
126      [RUN_OVS_VSCTL([list-ifaces $1])],
127      [0],
128      [m4_foreach([iface], m4_cdr($@), [iface
129 ])],
130      [],
131      [OVS_VSCTL_CLEANUP])
132    AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
133             [ovs-vsctl: no interface named $1
134 ],
135             [OVS_VSCTL_CLEANUP])
136    m4_foreach(
137      [iface], m4_cdr($@), 
138      [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
139 ],
140                [], [OVS_VSCTL_CLEANUP])])])
141
142 dnl ----------------------------------------------------------------------
143 AT_BANNER([ovs-vsctl unit tests -- real bridges])
144
145 AT_SETUP([add-br a])
146 AT_KEYWORDS([ovs-vsctl])
147 OVS_VSCTL_SETUP
148 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
149 CHECK_BRIDGES([a, a, 0])
150 CHECK_PORTS([a])
151 CHECK_IFACES([a])
152 OVS_VSCTL_CLEANUP
153 AT_CLEANUP
154
155 AT_SETUP([add-br a, add-br a])
156 AT_KEYWORDS([ovs-vsctl])
157 OVS_VSCTL_SETUP
158 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
159 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
160   [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
161 ], [OVS_VSCTL_CLEANUP])
162 OVS_VSCTL_CLEANUP
163 AT_CLEANUP
164
165 AT_SETUP([add-br a, add-br b])
166 AT_KEYWORDS([ovs-vsctl])
167 OVS_VSCTL_SETUP
168 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
169          [OVS_VSCTL_CLEANUP])
170 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br a b 9])], [1], [],
171   [ovs-vsctl: "--may-exist add-br a b 9" but a is not a VLAN bridge
172 ],
173   [OVS_VSCTL_CLEANUP])
174 CHECK_BRIDGES([a, a, 0], [b, b, 0])
175 CHECK_PORTS([a])
176 CHECK_IFACES([a])
177 CHECK_PORTS([b])
178 CHECK_IFACES([b])
179 OVS_VSCTL_CLEANUP
180 AT_CLEANUP
181
182 AT_SETUP([add-br a, add-br b, del-br a])
183 AT_KEYWORDS([ovs-vsctl])
184 OVS_VSCTL_SETUP
185 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
186          [OVS_VSCTL_CLEANUP])
187 CHECK_BRIDGES([b, b, 0])
188 CHECK_PORTS([b])
189 CHECK_IFACES([b])
190 OVS_VSCTL_CLEANUP
191 AT_CLEANUP
192
193 AT_SETUP([add-br a, del-br a, add-br a])
194 AT_KEYWORDS([ovs-vsctl])
195 OVS_VSCTL_SETUP
196 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
197   [add-br a],
198   [del-br a],
199   [add-br a],
200   [set Interface a other_config:key=value],
201   [get Interface a other_config:key])], [0], [
202
203
204
205 value
206 ], [], [OVS_VSCTL_CLEANUP])
207 CHECK_BRIDGES([a, a, 0])
208 CHECK_PORTS([a])
209 CHECK_IFACES([a])
210 OVS_VSCTL_CLEANUP
211 AT_CLEANUP
212
213 AT_SETUP([add-br a, add-port a a1, add-port a a2])
214 AT_KEYWORDS([ovs-vsctl])
215 OVS_VSCTL_SETUP
216 AT_CHECK([RUN_OVS_VSCTL(
217    [add-br a],
218    [--if-exists del-br b],
219    [add-port a a1],
220    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
221 CHECK_BRIDGES([a, a, 0])
222 CHECK_PORTS([a], [a1], [a2])
223 CHECK_IFACES([a], [a1], [a2])
224 OVS_VSCTL_CLEANUP
225 AT_CLEANUP
226
227 AT_SETUP([add-br a, add-port a a1, add-port a a1])
228 AT_KEYWORDS([ovs-vsctl])
229 OVS_VSCTL_SETUP
230 AT_CHECK([RUN_OVS_VSCTL(
231    [add-br a], 
232    [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
233 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
234   [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
235 ], [OVS_VSCTL_CLEANUP])
236 OVS_VSCTL_CLEANUP
237 AT_CLEANUP
238
239 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
240 AT_KEYWORDS([ovs-vsctl])
241 OVS_VSCTL_SETUP
242 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
243    [add-br a], 
244    [add-br b], 
245    [add-port a a1],
246    [add-port b b1],
247    [--if-exists del-port b b2],
248    [del-br a])], [0], [
249
250
251
252
253
254 ], [], [OVS_VSCTL_CLEANUP])
255 CHECK_BRIDGES([b, b, 0])
256 CHECK_PORTS([b], [b1])
257 CHECK_IFACES([b], [b1])
258 OVS_VSCTL_CLEANUP
259 AT_CLEANUP
260
261 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
262 AT_KEYWORDS([ovs-vsctl])
263 OVS_VSCTL_SETUP
264 AT_CHECK([RUN_OVS_VSCTL(
265    [add-br a], 
266    [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
267 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a3 a1 a2])], [0], [], [],
268   [OVS_VSCTL_CLEANUP])
269 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a2 a1])], [1], [], 
270   [ovs-vsctl: "--may-exist add-bond a bond0 a2 a1" but bond0 actually has interface(s) a1, a2, a3
271 ],
272   [OVS_VSCTL_CLEANUP])
273 CHECK_BRIDGES([a, a, 0])
274 CHECK_PORTS([a], [bond0])
275 CHECK_IFACES([a], [a1], [a2], [a3])
276 OVS_VSCTL_CLEANUP
277 AT_CLEANUP
278
279 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
280 AT_KEYWORDS([ovs-vsctl])
281 OVS_VSCTL_SETUP
282 AT_CHECK([RUN_OVS_VSCTL(
283   [add-br a], 
284   [add-br b], 
285   [add-port a a1 tag=9],
286   [get port a1 tag],
287   [--may-exist add-port b b1],
288   [del-port a a1])], [0], [9
289 ], [], [OVS_VSCTL_CLEANUP])
290 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port b b1])], [0], [], [],
291   [OVS_VSCTL_CLEANUP])
292 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [], 
293   [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b
294 ],
295   [OVS_VSCTL_CLEANUP])
296 CHECK_BRIDGES([a, a, 0], [b, b, 0])
297 CHECK_PORTS([a])
298 CHECK_IFACES([a])
299 CHECK_PORTS([b], [b1])
300 CHECK_IFACES([b], [b1])
301 OVS_VSCTL_CLEANUP
302 AT_CLEANUP
303
304 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
305 AT_KEYWORDS([ovs-vsctl])
306 OVS_VSCTL_SETUP
307 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
308   [add-br a], 
309   [add-bond a bond0 a1 a2 a3 tag=9],
310   [get Port bond0 tag],
311   [del-port bond0])], [0], [
312
313 9
314
315 ], [], [OVS_VSCTL_CLEANUP])
316 CHECK_BRIDGES([a, a, 0])
317 CHECK_PORTS([a])
318 OVS_VSCTL_CLEANUP
319 AT_CLEANUP
320
321 AT_SETUP([external IDs])
322 AT_KEYWORDS([ovs-vsctl])
323 OVS_VSCTL_SETUP
324 AT_CHECK([RUN_OVS_VSCTL_ONELINE(
325   [add-br a], 
326   [add-port a a1],
327   [add-bond a bond0 a2 a3],
328   [br-set-external-id a key0 value0],
329   [set port a1 external-ids:key1=value1],
330   [set interface a2 external-ids:key2=value2],
331   [set interface a2 external-ids:key3=value3],
332   [set interface a3 external-ids:key4=value4],
333   [br-get-external-id a],
334   [br-get-external-id a key0],
335   [br-get-external-id a key1],
336   [br-set-external-id a key0 othervalue],
337   [br-get-external-id a],
338   [br-set-external-id a key0],
339   [br-get-external-id a],
340   [get port a1 external-ids],
341   [get interface a2 external-ids],
342   [get interface a3 external-ids])], [0], [
343
344
345
346
347
348
349
350 key0=value0
351 value0
352
353
354 key0=othervalue
355
356
357 {"key1"="value1"}
358 {"key2"="value2", "key3"="value3"}
359 {"key4"="value4"}
360 ], [], [OVS_VSCTL_CLEANUP])
361 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
362   [br-get-external-id a],
363   [get port a1 external-ids],
364   [get interface a2 external-ids],
365   [get interface a3 external-ids])], [0],
366 [
367 {"key1"="value1"}
368 {"key2"="value2", "key3"="value3"}
369 {"key4"="value4"}
370 ], [], [OVS_VSCTL_CLEANUP])
371 CHECK_BRIDGES([a, a, 0])
372 CHECK_PORTS([a], [a1], [bond0])
373 CHECK_IFACES([a], [a1], [a2], [a3])
374 OVS_VSCTL_CLEANUP
375 AT_CLEANUP
376
377 AT_SETUP([controllers])
378 AT_KEYWORDS([controller ovs-vsctl])
379 OVS_VSCTL_SETUP
380 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
381   [add-br br0], 
382
383   [get-controller br0],
384   [set-controller br0 tcp:4.5.6.7],
385   [get-controller br0],
386
387   [del-controller br0],
388   [get-controller br0],
389
390   [set-controller br0 tcp:8.9.10.11 tcp:5.4.3.2],
391   [get-controller br0])], [0], [
392
393
394 tcp:4.5.6.7
395
396
397
398 tcp:5.4.3.2\ntcp:8.9.10.11
399 ], [], [OVS_VSCTL_CLEANUP])
400 OVS_VSCTL_CLEANUP
401 AT_CLEANUP
402
403 dnl ----------------------------------------------------------------------
404 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
405
406 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
407   [AT_CHECK(
408      [RUN_OVS_VSCTL(
409         [add-br xenbr0],
410         [--may-exist add-br xenbr0],
411         [add-port xenbr0 eth0],
412         [--may-exist add-port xenbr0 eth0],
413         [add-br xapi1 xenbr0 9],
414         [--may-exist add-br xapi1 xenbr0 9],
415         [add-port xapi1 eth0.9])],
416      [0], [], [], [OVS_VSCTL_CLEANUP])])
417
418 AT_SETUP([simple fake bridge])
419 AT_KEYWORDS([ovs-vsctl fake-bridge])
420 OVS_VSCTL_SETUP
421 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
422 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
423   [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN 9
424 ], [OVS_VSCTL_CLEANUP])
425 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx 9])], [1], [],
426   [ovs-vsctl: "--may-exist add-br xapi1 xxx 9" but xapi1 has the wrong parent xenbr0
427 ], [OVS_VSCTL_CLEANUP])
428 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
429   [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN 9
430 ], [OVS_VSCTL_CLEANUP])
431 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
432 CHECK_PORTS([xenbr0], [eth0])
433 CHECK_IFACES([xenbr0], [eth0])
434 CHECK_PORTS([xapi1], [eth0.9])
435 CHECK_IFACES([xapi1], [eth0.9])
436 OVS_VSCTL_CLEANUP
437 AT_CLEANUP
438
439 AT_SETUP([simple fake bridge + del-br fake bridge])
440 AT_KEYWORDS([ovs-vsctl fake-bridge])
441 OVS_VSCTL_SETUP
442 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
443 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
444 CHECK_BRIDGES([xenbr0, xenbr0, 0])
445 CHECK_PORTS([xenbr0], [eth0])
446 CHECK_IFACES([xenbr0], [eth0])
447 OVS_VSCTL_CLEANUP
448 AT_CLEANUP
449
450 AT_SETUP([simple fake bridge + del-br real bridge])
451 AT_KEYWORDS([ovs-vsctl fake-bridge])
452 OVS_VSCTL_SETUP
453 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
454 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
455 CHECK_BRIDGES
456 OVS_VSCTL_CLEANUP
457 AT_CLEANUP
458
459 AT_SETUP([simple fake bridge + external IDs])
460 AT_KEYWORDS([ovs-vsctl fake-bridge])
461 OVS_VSCTL_SETUP
462 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
463 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
464   [br-set-external-id xenbr0 key0 value0],
465   [br-set-external-id xapi1 key1 value1],
466   [br-get-external-id xenbr0],
467   [br-get-external-id xenbr0 key0],
468   [br-get-external-id xapi1],
469   [br-get-external-id xapi1 key1])], [0], [
470
471 key0=value0
472 value0
473 key1=value1
474 value1
475 ], [], [OVS_VSCTL_CLEANUP])
476 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
477 CHECK_PORTS([xenbr0], [eth0])
478 CHECK_IFACES([xenbr0], [eth0])
479 CHECK_PORTS([xapi1], [eth0.9])
480 CHECK_IFACES([xapi1], [eth0.9])
481 OVS_VSCTL_CLEANUP
482 AT_CLEANUP
483
484 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
485   [AT_CHECK(
486      [RUN_OVS_VSCTL(
487         [add-br xapi1],
488         [add-bond xapi1 bond0 eth0 eth1],
489         [add-br xapi2 xapi1 11],
490         [add-port xapi2 bond0.11])],
491      [0], [], [], [OVS_VSCTL_CLEANUP])])
492
493 AT_SETUP([fake bridge on bond])
494 AT_KEYWORDS([ovs-vsctl fake-bridge])
495 OVS_VSCTL_SETUP
496 OVS_VSCTL_SETUP_BOND_FAKE_CONF
497 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
498 CHECK_PORTS([xapi1], [bond0])
499 CHECK_IFACES([xapi1], [eth0], [eth1])
500 CHECK_PORTS([xapi2], [bond0.11])
501 CHECK_IFACES([xapi2], [bond0.11])
502 OVS_VSCTL_CLEANUP
503 AT_CLEANUP
504
505 AT_SETUP([fake bridge on bond + del-br fake bridge])
506 AT_KEYWORDS([ovs-vsctl fake-bridge])
507 OVS_VSCTL_SETUP
508 OVS_VSCTL_SETUP_BOND_FAKE_CONF
509 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
510 ], [], [OVS_VSCTL_CLEANUP])
511 CHECK_BRIDGES([xapi1, xapi1, 0])
512 CHECK_PORTS([xapi1], [bond0])
513 CHECK_IFACES([xapi1], [eth0], [eth1])
514 OVS_VSCTL_CLEANUP
515 AT_CLEANUP
516
517 AT_SETUP([fake bridge on bond + del-br real bridge])
518 AT_KEYWORDS([ovs-vsctl fake-bridge])
519 OVS_VSCTL_SETUP
520 OVS_VSCTL_SETUP_BOND_FAKE_CONF
521 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
522 CHECK_BRIDGES
523 OVS_VSCTL_CLEANUP
524 AT_CLEANUP
525
526 dnl ----------------------------------------------------------------------
527 AT_BANNER([ovs-vsctl unit tests -- manager commands])
528
529 AT_SETUP([managers])
530 AT_KEYWORDS([manager ovs-vsctl])
531 OVS_VSCTL_SETUP
532 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
533   [del-manager],
534   [get-manager],
535   [set-manager tcp:4.5.6.7],
536   [get-manager],
537   [set-manager tcp:8.9.10.11 tcp:5.4.3.2],
538   [get-manager],
539   [del-manager],
540   [get-manager])], [0], [
541
542
543 tcp:4.5.6.7
544
545 tcp:5.4.3.2\ntcp:8.9.10.11
546
547
548 ], [], [OVS_VSCTL_CLEANUP])
549 OVS_VSCTL_CLEANUP
550 AT_CLEANUP
551
552 dnl ----------------------------------------------------------------------
553 AT_BANNER([ovs-vsctl unit tests -- database commands])
554
555 AT_SETUP([database commands -- positive checks])
556 AT_KEYWORDS([ovs-vsctl])
557 OVS_VSCTL_SETUP
558 AT_CHECK(
559   [RUN_OVS_VSCTL_TOGETHER([--id=@br0 create b name=br0],
560                           [set o . bridges=@br0])],
561   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
562 cp stdout out1
563 AT_CHECK([RUN_OVS_VSCTL([list b], [get b br0 _uuid])], 
564   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
565 cp stdout out2
566 AT_CHECK([perl $srcdir/uuidfilt.pl out1 out2], [0], 
567   [[<0>
568
569 _uuid               : <0>
570 controller          : []
571 datapath_id         : []
572 datapath_type       : ""
573 external_ids        : {}
574 fail_mode           : []
575 flood_vlans         : []
576 mirrors             : []
577 name                : "br0"
578 netflow             : []
579 other_config        : {}
580 ports               : []
581 sflow               : []
582 <0>
583 ]], [ignore], [test ! -e pid || kill `cat pid`])
584 AT_CHECK(
585   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type list b])],
586   [0],
587   [[fail_mode           : []
588 name                : "br0"
589 datapath_type       : ""
590 ]], [ignore], [test ! -e pid || kill `cat pid`])
591 AT_CHECK(
592   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type find b])],
593   [0],
594   [[fail_mode           : []
595 name                : "br0"
596 datapath_type       : ""
597 ]], [ignore], [test ! -e pid || kill `cat pid`])
598 AT_CHECK([
599   RUN_OVS_VSCTL_TOGETHER([--id=@br1 create b name=br1 datapath_type="foo"],
600                          [--id=@br2 create b name=br2 external-ids:bar=quux],
601                          [add o . bridges @br1 @br2])],
602   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
603 AT_CHECK(
604   [RUN_OVS_VSCTL([--columns=name find b datapath_type!=foo])], [0], [stdout],
605   [ignore], [test ! -e pid || kill `cat pid`])
606 AT_CHECK([sed -n '/./p' stdout | sort], [0],
607   [[name                : "br0"
608 name                : "br2"
609 ]])
610 AT_CHECK(
611   [RUN_OVS_VSCTL(
612     [set bridge br0 \
613       'other_config:datapath_id="0123456789ab"' \
614       'other_config:hwaddr="00:11:22:33:44:55"' \
615       'external-ids={"uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
616      add bridge br0 external_ids '"roles"="local; remote; cloud"'])], 
617   [0], [], [], [OVS_VSCTL_CLEANUP])
618 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])], 
619   [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{roles="local; remote; cloud", uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
620 ], [], [OVS_VSCTL_CLEANUP])
621 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])], 
622   [0], ["00:11:22:33:44:55"
623
624 ], [], [OVS_VSCTL_CLEANUP])
625 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])], 
626   [0], [{datapath_id="0123456789ab"}
627 ], [], [OVS_VSCTL_CLEANUP])
628 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])], 
629   [0], [{}
630 ], [], [OVS_VSCTL_CLEANUP])
631 AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])], 
632   [0], [{}
633 ], [], [OVS_VSCTL_CLEANUP])
634 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([destroy b br0],
635                                  [destroy b br1],
636                                  [destroy b br2],
637                                  [clear o . bridges])],
638   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
639 AT_CHECK([RUN_OVS_VSCTL([list b])], 
640   [0], [], [], [OVS_VSCTL_CLEANUP])
641 OVS_VSCTL_CLEANUP
642 AT_CLEANUP
643
644 AT_SETUP([database commands -- negative checks])
645 AT_KEYWORDS([ovs-vsctl])
646 OVS_VSCTL_SETUP
647 AT_CHECK([RUN_OVS_VSCTL([add-br br0])],
648   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
649 AT_CHECK([RUN_OVS_VSCTL([add-br br1])], 
650   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
651 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])], 
652   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
653 AT_CHECK([
654     RUN_OVS_VSCTL_TOGETHER([--id=@n create n targets='"1.2.3.4:567"'],
655                            [set bridge br0 netflow=@n])],
656   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
657 cp stdout netflow-uuid
658 AT_CHECK([RUN_OVS_VSCTL([list n `cat netflow-uuid`])],
659   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
660 AT_CHECK([perl $srcdir/uuidfilt.pl netflow-uuid stdout], [0], 
661   [[<0>
662
663 _uuid               : <0>
664 active_timeout      : 0
665 add_id_to_interface : false
666 engine_id           : []
667 engine_type         : []
668 external_ids        : {}
669 targets             : ["1.2.3.4:567"]
670 ]], [ignore], [test ! -e pid || kill `cat pid`])
671 AT_CHECK([RUN_OVS_VSCTL([list interx x])], 
672   [1], [], [ovs-vsctl: unknown table "interx"
673 ], [OVS_VSCTL_CLEANUP])
674 AT_CHECK([RUN_OVS_VSCTL([list b x])], 
675   [1], [], [ovs-vsctl: no row "x" in table Bridge
676 ], [OVS_VSCTL_CLEANUP])
677 AT_CHECK([RUN_OVS_VSCTL([get b br0 d])], 
678   [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
679 ], [OVS_VSCTL_CLEANUP])
680 AT_CHECK([RUN_OVS_VSCTL([get b br0 x])], 
681   [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
682 ], [OVS_VSCTL_CLEANUP])
683 AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])], 
684   [1], [], [ovs-vsctl: :y=z: missing column name
685 ], [OVS_VSCTL_CLEANUP])
686 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])], 
687   [1], [], [ovs-vsctl: datapath_id:y=z: trailing garbage "=z" in argument
688 ], [OVS_VSCTL_CLEANUP])
689 AT_CHECK([RUN_OVS_VSCTL([set b br0 'datapath_id:y>=z'])], 
690   [1], [], [ovs-vsctl: datapath_id:y>=z: argument does not end in "=" followed by a value.
691 ], [OVS_VSCTL_CLEANUP])
692 AT_CHECK([RUN_OVS_VSCTL([wait-until b br0 datapath_id:y,z])], 
693   [1], [], [ovs-vsctl: datapath_id:y,z: argument does not end in "=", "!=", "<", ">", "<=", or ">=" followed by a value.
694 ], [OVS_VSCTL_CLEANUP])
695 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])], 
696   [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
697 ], [OVS_VSCTL_CLEANUP])
698 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])], 
699   [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
700 ], [OVS_VSCTL_CLEANUP])
701 AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])], 
702   [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
703 ], [OVS_VSCTL_CLEANUP])
704 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])], 
705   [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
706 ], [OVS_VSCTL_CLEANUP])
707 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])], 
708   [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
709 ], [OVS_VSCTL_CLEANUP])
710 AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])], 
711   [1], [], [[ovs-vsctl: constraint violation: xyz is not one of the allowed values ([in-band, out-of-band])
712 ]], [OVS_VSCTL_CLEANUP])
713 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])], 
714   [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
715 ], [OVS_VSCTL_CLEANUP])
716 AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])], 
717   [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
718 ], [OVS_VSCTL_CLEANUP])
719 AT_CHECK([RUN_OVS_VSCTL([remove n `cat netflow-uuid` targets '"1.2.3.4:567"'])], 
720   [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimum number is 1
721 ], [OVS_VSCTL_CLEANUP])
722 AT_CHECK([RUN_OVS_VSCTL([clear n `cat netflow-uuid` targets])], 
723   [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
724 ], [OVS_VSCTL_CLEANUP])
725 AT_CHECK([RUN_OVS_VSCTL([destroy b br2])], 
726   [1], [], [ovs-vsctl: no row "br2" in table Bridge
727 ], [OVS_VSCTL_CLEANUP])
728 OVS_VSCTL_CLEANUP
729 AT_CLEANUP
730
731 AT_SETUP([database commands -- wait-until immediately true])
732 AT_KEYWORDS([ovs-vsctl])
733 OVS_VSCTL_SETUP
734 AT_CHECK([RUN_OVS_VSCTL(
735     [add-br br0], 
736     [add-bond br0 bond0 eth0 eth1],
737     [set port bond0 bond_updelay=500 other-config:abc=def])],
738   [0], [], [], [OVS_VSCTL_CLEANUP])
739 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . manager_options=[]]])],
740   [0], [], [], [OVS_VSCTL_CLEANUP])
741 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . bridges!=[]]])],
742   [0], [], [], [OVS_VSCTL_CLEANUP])
743 AT_CHECK([RUN_OVS_VSCTL([[wait-until Port bond0 other-config:abc=def]])],
744   [0], [], [], [OVS_VSCTL_CLEANUP])
745 AT_CHECK([RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' 'other-config:abc>d' 'other-config:abc<e']])],
746   [0], [], [], [OVS_VSCTL_CLEANUP])
747 OVS_VSCTL_CLEANUP
748 AT_CLEANUP
749
750 AT_SETUP([database commands -- wait-until must wait])
751 AT_KEYWORDS([ovs-vsctl])
752
753 # Disable lcov for this test.  All the programs running in parallel
754 # race badly on access to profiling data.
755 DISABLE_LCOV=true
756 export DISABLE_LCOV
757
758 OVS_VSCTL_SETUP
759
760 # Start ovs-vsctls in background.
761 (RUN_OVS_VSCTL([[wait-until o . bridges!=[] -- get bridge br10 other-config:abc]])) > stdout1 &
762 (RUN_OVS_VSCTL([[wait-until bridge br1 -- get bridge br1 other-config:abc]])) > stdout2 &
763 (RUN_OVS_VSCTL([[wait-until b br1 other-config={abc=def} -- get bridge br1 other-config]])) > stdout3 &
764 (RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' -- get port bond0 bond-updelay]])) > stdout4 &
765
766 # Give the ovs-vsctls a chance to read the database
767 sleep 1
768
769 AT_CHECK([RUN_OVS_VSCTL([add-br br10 -- set bridge br10 other-config:abc=quux])
770 RUN_OVS_VSCTL([add-br br1 -- set bridge br1 other-config:abc=def -- add-bond br1 bond0 eth0 eth1 -- set port bond0 bond_updelay=500])],
771   [0], [], [], [OVS_VSCTL_CLEANUP])
772
773 # Wait for the ovs-vsctls to finish.
774 wait
775
776 # Check output
777 AT_CHECK([cat stdout1], [0], [quux
778 ], [], [OVS_VSCTL_CLEANUP])
779 AT_CHECK([cat stdout2], [0], [def
780 ], [], [OVS_VSCTL_CLEANUP])
781 AT_CHECK([cat stdout3], [0], [{abc=def}
782 ], [], [OVS_VSCTL_CLEANUP])
783 AT_CHECK([cat stdout4], [0], [500
784 ], [], [OVS_VSCTL_CLEANUP])
785
786 OVS_VSCTL_CLEANUP
787 AT_CLEANUP
788
789 AT_SETUP([--id option on create, get commands])
790 AT_KEYWORDS([ovs-vsctl])
791 OVS_VSCTL_SETUP
792 AT_CHECK([RUN_OVS_VSCTL([add-br br0],
793                         [add-port br0 eth0],
794                         [add-port br0 eth1])])
795 AT_CHECK(
796   [RUN_OVS_VSCTL_TOGETHER(
797     [set bridge br0 mirrors=@m],
798     [--id=@eth0 get port eth0],
799     [--id=@eth1 get port eth1],
800     [--id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1])],
801   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
802 AT_CHECK(
803   [perl $srcdir/uuidfilt.pl stdout], [0], [dnl
804
805
806
807 <0>
808 ],
809   [], [OVS_VSCTL_CLEANUP])
810 AT_CHECK(
811   [RUN_OVS_VSCTL(
812     [list port eth0 eth1],
813     [list mirror],
814     [list bridge br0])],
815   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
816 AT_CHECK(
817   [sed -n -e '/uuid/p' -e '/name/p' -e '/mirrors/p' -e '/select/p' -e '/output/p' < stdout | $srcdir/uuidfilt.pl], [0], [dnl
818 [_uuid               : <0>
819 name                : "eth0"
820 _uuid               : <1>
821 name                : "eth1"
822 _uuid               : <2>
823 name                : mymirror
824 output_port         : <1>
825 output_vlan         : []
826 select_all          : false
827 select_dst_port     : [<0>]
828 select_src_port     : [<0>]
829 select_vlan         : []
830 _uuid               : <3>
831 mirrors             : [<2>]
832 name                : "br0"
833 ]],
834   [], [OVS_VSCTL_CLEANUP])
835 OVS_VSCTL_CLEANUP
836 AT_CLEANUP
837
838 AT_SETUP([unreferenced record warnings])
839 AT_KEYWORDS([ovs-vsctl])
840 OVS_VSCTL_SETUP
841 AT_CHECK(
842   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket \
843      -- create Bridge name=br0 | $srcdir/uuidfilt.pl],
844   [0], [<0>
845 ], [vsctl|WARN|applying "create" command to table Bridge without --id option will have no effect
846 ], [OVS_VSCTL_CLEANUP])
847 AT_CHECK(
848   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket \
849      -- --id=@br0 create Bridge name=br0 | $srcdir/uuidfilt.pl],
850   [0], [<0>
851 ], [vsctl|WARN|row id "@br0" was created but no reference to it was inserted, so it will not actually appear in the database
852 ], [OVS_VSCTL_CLEANUP])
853 AT_CHECK(
854   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket \
855      -- --id=@eth0_iface create Interface name=eth0 \
856      -- --id=@eth0 create Port name=eth0 interfaces=@eth0_iface \
857      -- --id=@m0 create Mirror name=m0 output_port=@eth0 \
858      -- --id=@br0 create Bridge name=br0 mirrors=@m0 \
859      -- set Open_vSwitch . bridges=@br0 | $srcdir/uuidfilt.pl],
860   [0], [<0>
861 <1>
862 <2>
863 <3>
864 ], [vsctl|WARN|row id "@eth0" was created but only a weak reference to it was inserted, so it will not actually appear in the database
865 ], [OVS_VSCTL_CLEANUP])
866 OVS_VSCTL_CLEANUP
867 AT_CLEANUP
868
869 dnl This test really shows a bug -- "create" followed by "list" in
870 dnl the same execution shows the wrong UUID on the "list" command.
871 dnl The bug is documented in ovs-vsctl.8.
872 AT_SETUP([created row UUID is wrong in same execution])
873 AT_KEYWORDS([ovs-vsctl])
874 OVS_VSCTL_SETUP
875 AT_CHECK([RUN_OVS_VSCTL([--id=@br0 create Bridge name=br0 -- add Open_vSwitch . bridges @br0 -- list b])],
876   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
877 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], 
878   [[<0>
879 _uuid               : <1>
880 controller          : []
881 datapath_id         : []
882 datapath_type       : ""
883 external_ids        : {}
884 fail_mode           : []
885 flood_vlans         : []
886 mirrors             : []
887 name                : "br0"
888 netflow             : []
889 other_config        : {}
890 ports               : []
891 sflow               : []
892 ]], [ignore], [test ! -e pid || kill `cat pid`])
893 OVS_VSCTL_CLEANUP
894 AT_CLEANUP