tests: Gracefully shut down ovsdb-server, to avoid valgrind leak warnings.
[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 dnl OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([VLAN])
405 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
406   [AT_CHECK(
407      [RUN_OVS_VSCTL(
408         [add-br xenbr0],
409         [--may-exist add-br xenbr0],
410         [add-port xenbr0 eth0],
411         [--may-exist add-port xenbr0 eth0],
412         [add-br xapi1 xenbr0 $1],
413         [--may-exist add-br xapi1 xenbr0 $1],
414         [add-port xapi1 eth0.$1])],
415      [0], [], [], [OVS_VSCTL_CLEANUP])])
416
417 dnl OVS_VSCTL_FAKE_BRIDGE_TESTS([VLAN])
418 m4_define([OVS_VSCTL_FAKE_BRIDGE_TESTS], [
419 AT_BANNER([ovs-vsctl unit tests -- fake bridges (VLAN $1)])
420
421 AT_SETUP([simple fake bridge (VLAN $1)])
422 AT_KEYWORDS([ovs-vsctl fake-bridge])
423 OVS_VSCTL_SETUP
424 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
425 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
426   [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN $1
427 ], [OVS_VSCTL_CLEANUP])
428 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx $1])], [1], [],
429   [ovs-vsctl: "--may-exist add-br xapi1 xxx $1" but xapi1 has the wrong parent xenbr0
430 ], [OVS_VSCTL_CLEANUP])
431 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
432   [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN $1
433 ], [OVS_VSCTL_CLEANUP])
434 CHECK_BRIDGES([xapi1, xenbr0, $1], [xenbr0, xenbr0, 0])
435 CHECK_PORTS([xenbr0], [eth0])
436 CHECK_IFACES([xenbr0], [eth0])
437 CHECK_PORTS([xapi1], [eth0.$1])
438 CHECK_IFACES([xapi1], [eth0.$1])
439 OVS_VSCTL_CLEANUP
440 AT_CLEANUP
441
442 AT_SETUP([simple fake bridge + del-br fake bridge (VLAN $1)])
443 AT_KEYWORDS([ovs-vsctl fake-bridge])
444 OVS_VSCTL_SETUP
445 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
446 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
447 CHECK_BRIDGES([xenbr0, xenbr0, 0])
448 CHECK_PORTS([xenbr0], [eth0])
449 CHECK_IFACES([xenbr0], [eth0])
450 OVS_VSCTL_CLEANUP
451 AT_CLEANUP
452
453 AT_SETUP([simple fake bridge + del-br real bridge (VLAN $1)])
454 AT_KEYWORDS([ovs-vsctl fake-bridge])
455 OVS_VSCTL_SETUP
456 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
457 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
458 CHECK_BRIDGES
459 OVS_VSCTL_CLEANUP
460 AT_CLEANUP
461
462 AT_SETUP([simple fake bridge + external IDs (VLAN $1)])
463 AT_KEYWORDS([ovs-vsctl fake-bridge])
464 OVS_VSCTL_SETUP
465 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
466 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
467   [br-set-external-id xenbr0 key0 value0],
468   [br-set-external-id xapi1 key1 value1],
469   [br-get-external-id xenbr0],
470   [br-get-external-id xenbr0 key0],
471   [br-get-external-id xapi1],
472   [br-get-external-id xapi1 key1])], [0], [
473
474 key0=value0
475 value0
476 key1=value1
477 value1
478 ], [], [OVS_VSCTL_CLEANUP])
479 CHECK_BRIDGES([xapi1, xenbr0, $1], [xenbr0, xenbr0, 0])
480 CHECK_PORTS([xenbr0], [eth0])
481 CHECK_IFACES([xenbr0], [eth0])
482 CHECK_PORTS([xapi1], [eth0.$1])
483 CHECK_IFACES([xapi1], [eth0.$1])
484 OVS_VSCTL_CLEANUP
485 AT_CLEANUP
486 ]) # OVS_VSCTL_FAKE_BRIDGE_TESTS
487
488 OVS_VSCTL_FAKE_BRIDGE_TESTS([9])
489 OVS_VSCTL_FAKE_BRIDGE_TESTS([0])
490
491 dnl OVS_VSCTL_SETUP_BOND_FAKE_CONF([VLAN])
492 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
493   [AT_CHECK(
494      [RUN_OVS_VSCTL(
495         [add-br xapi1],
496         [add-bond xapi1 bond0 eth0 eth1],
497         [add-br xapi2 xapi1 $1],
498         [add-port xapi2 bond0.$1])],
499      [0], [], [], [OVS_VSCTL_CLEANUP])])
500
501 AT_SETUP([fake bridge on bond])
502 AT_KEYWORDS([ovs-vsctl fake-bridge])
503 OVS_VSCTL_SETUP
504 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
505 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
506 CHECK_PORTS([xapi1], [bond0])
507 CHECK_IFACES([xapi1], [eth0], [eth1])
508 CHECK_PORTS([xapi2], [bond0.11])
509 CHECK_IFACES([xapi2], [bond0.11])
510 OVS_VSCTL_CLEANUP
511 AT_CLEANUP
512
513 AT_SETUP([fake bridge on bond + del-br fake bridge])
514 AT_KEYWORDS([ovs-vsctl fake-bridge])
515 OVS_VSCTL_SETUP
516 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
517 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
518 ], [], [OVS_VSCTL_CLEANUP])
519 CHECK_BRIDGES([xapi1, xapi1, 0])
520 CHECK_PORTS([xapi1], [bond0])
521 CHECK_IFACES([xapi1], [eth0], [eth1])
522 OVS_VSCTL_CLEANUP
523 AT_CLEANUP
524
525 AT_SETUP([fake bridge on bond + del-br real bridge])
526 AT_KEYWORDS([ovs-vsctl fake-bridge])
527 OVS_VSCTL_SETUP
528 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
529 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
530 CHECK_BRIDGES
531 OVS_VSCTL_CLEANUP
532 AT_CLEANUP
533
534 dnl ----------------------------------------------------------------------
535 AT_BANNER([ovs-vsctl unit tests -- manager commands])
536
537 AT_SETUP([managers])
538 AT_KEYWORDS([manager ovs-vsctl])
539 OVS_VSCTL_SETUP
540 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
541   [del-manager],
542   [get-manager],
543   [set-manager tcp:4.5.6.7],
544   [get-manager],
545   [set-manager tcp:8.9.10.11 tcp:5.4.3.2],
546   [get-manager],
547   [del-manager],
548   [get-manager])], [0], [
549
550
551 tcp:4.5.6.7
552
553 tcp:5.4.3.2\ntcp:8.9.10.11
554
555
556 ], [], [OVS_VSCTL_CLEANUP])
557 OVS_VSCTL_CLEANUP
558 AT_CLEANUP
559
560 dnl ----------------------------------------------------------------------
561 AT_BANNER([ovs-vsctl unit tests -- database commands])
562
563 AT_SETUP([database commands -- positive checks])
564 AT_KEYWORDS([ovs-vsctl])
565 OVS_VSCTL_SETUP
566 AT_CHECK(
567   [RUN_OVS_VSCTL_TOGETHER([--id=@br0 create b name=br0],
568                           [set o . bridges=@br0])],
569   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
570 cp stdout out1
571 AT_CHECK([RUN_OVS_VSCTL([list b], [get b br0 _uuid])], 
572   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
573 cp stdout out2
574 AT_CHECK([perl $srcdir/uuidfilt.pl out1 out2], [0], 
575   [[<0>
576
577 _uuid               : <0>
578 controller          : []
579 datapath_id         : []
580 datapath_type       : ""
581 external_ids        : {}
582 fail_mode           : []
583 flood_vlans         : []
584 flow_tables         : {}
585 mirrors             : []
586 name                : "br0"
587 netflow             : []
588 other_config        : {}
589 ports               : []
590 sflow               : []
591 status              : {}
592 stp_enable          : false
593 <0>
594 ]], [ignore], [test ! -e pid || kill `cat pid`])
595 AT_CHECK(
596   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type list b])],
597   [0],
598   [[fail_mode           : []
599 name                : "br0"
600 datapath_type       : ""
601 ]], [ignore], [test ! -e pid || kill `cat pid`])
602 AT_CHECK(
603   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type find b])],
604   [0],
605   [[fail_mode           : []
606 name                : "br0"
607 datapath_type       : ""
608 ]], [ignore], [test ! -e pid || kill `cat pid`])
609 AT_CHECK([
610   RUN_OVS_VSCTL_TOGETHER([--id=@br1 create b name=br1 datapath_type="foo"],
611                          [--id=@br2 create b name=br2 external-ids:bar=quux],
612                          [add o . bridges @br1 @br2])],
613   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
614 AT_CHECK(
615   [RUN_OVS_VSCTL([--columns=name find b datapath_type!=foo])], [0], [stdout],
616   [ignore], [test ! -e pid || kill `cat pid`])
617 AT_CHECK([sed -n '/./p' stdout | sort], [0],
618   [[name                : "br0"
619 name                : "br2"
620 ]])
621 AT_CHECK(
622   [RUN_OVS_VSCTL(
623     [set bridge br0 \
624       'other_config:datapath_id="0123456789ab"' \
625       'other_config:hwaddr="00:11:22:33:44:55"' \
626       'external-ids={"uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
627      add bridge br0 external_ids '"roles"="local; remote; cloud"'])], 
628   [0], [], [], [OVS_VSCTL_CLEANUP])
629 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])], 
630   [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{roles="local; remote; cloud", uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
631 ], [], [OVS_VSCTL_CLEANUP])
632 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])], 
633   [0], ["00:11:22:33:44:55"
634
635 ], [], [OVS_VSCTL_CLEANUP])
636 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])], 
637   [0], [{datapath_id="0123456789ab"}
638 ], [], [OVS_VSCTL_CLEANUP])
639 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])], 
640   [0], [{}
641 ], [], [OVS_VSCTL_CLEANUP])
642 AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])], 
643   [0], [{}
644 ], [], [OVS_VSCTL_CLEANUP])
645 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([destroy b br0],
646                                  [destroy b br1],
647                                  [destroy b br2],
648                                  [clear o . bridges])],
649   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
650 AT_CHECK([RUN_OVS_VSCTL([list b])], 
651   [0], [], [], [OVS_VSCTL_CLEANUP])
652 OVS_VSCTL_CLEANUP
653 AT_CLEANUP
654
655 AT_SETUP([database commands -- negative checks])
656 AT_KEYWORDS([ovs-vsctl])
657 OVS_VSCTL_SETUP
658 AT_CHECK([RUN_OVS_VSCTL([add-br br0])],
659   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
660 AT_CHECK([RUN_OVS_VSCTL([add-br br1])], 
661   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
662 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])], 
663   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
664 AT_CHECK([
665     RUN_OVS_VSCTL_TOGETHER([--id=@n create netflow targets='"1.2.3.4:567"'],
666                            [set bridge br0 netflow=@n])],
667   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
668 cp stdout netflow-uuid
669 AT_CHECK([RUN_OVS_VSCTL([list netflow `cat netflow-uuid`])],
670   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
671 AT_CHECK([perl $srcdir/uuidfilt.pl netflow-uuid stdout], [0], 
672   [[<0>
673
674 _uuid               : <0>
675 active_timeout      : 0
676 add_id_to_interface : false
677 engine_id           : []
678 engine_type         : []
679 external_ids        : {}
680 targets             : ["1.2.3.4:567"]
681 ]], [ignore], [test ! -e pid || kill `cat pid`])
682 AT_CHECK([RUN_OVS_VSCTL([list interx x])], 
683   [1], [], [ovs-vsctl: unknown table "interx"
684 ], [OVS_VSCTL_CLEANUP])
685 AT_CHECK([RUN_OVS_VSCTL([list b x])], 
686   [1], [], [ovs-vsctl: no row "x" in table Bridge
687 ], [OVS_VSCTL_CLEANUP])
688 AT_CHECK([RUN_OVS_VSCTL([get b br0 d])], 
689   [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
690 ], [OVS_VSCTL_CLEANUP])
691 AT_CHECK([RUN_OVS_VSCTL([get b br0 x])], 
692   [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
693 ], [OVS_VSCTL_CLEANUP])
694 AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])], 
695   [1], [], [ovs-vsctl: :y=z: missing column name
696 ], [OVS_VSCTL_CLEANUP])
697 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])], 
698   [1], [], [ovs-vsctl: datapath_id:y=z: trailing garbage "=z" in argument
699 ], [OVS_VSCTL_CLEANUP])
700 AT_CHECK([RUN_OVS_VSCTL([set b br0 'datapath_id:y>=z'])], 
701   [1], [], [ovs-vsctl: datapath_id:y>=z: argument does not end in "=" followed by a value.
702 ], [OVS_VSCTL_CLEANUP])
703 AT_CHECK([RUN_OVS_VSCTL([wait-until b br0 datapath_id:y,z])], 
704   [1], [], [ovs-vsctl: datapath_id:y,z: argument does not end in "=", "!=", "<", ">", "<=", ">=", "{=}", "{!=}", "{<}", "{>}", "{<=}", or "{>=}" followed by a value.
705 ], [OVS_VSCTL_CLEANUP])
706 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])], 
707   [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
708 ], [OVS_VSCTL_CLEANUP])
709 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])], 
710   [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
711 ], [OVS_VSCTL_CLEANUP])
712 AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])], 
713   [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
714 ], [OVS_VSCTL_CLEANUP])
715 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])], 
716   [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
717 ], [OVS_VSCTL_CLEANUP])
718 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])], 
719   [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
720 ], [OVS_VSCTL_CLEANUP])
721 AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])], 
722   [1], [], [[ovs-vsctl: constraint violation: xyz is not one of the allowed values ([in-band, out-of-band])
723 ]], [OVS_VSCTL_CLEANUP])
724 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])], 
725   [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
726 ], [OVS_VSCTL_CLEANUP])
727 AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])], 
728   [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
729 ], [OVS_VSCTL_CLEANUP])
730 AT_CHECK([RUN_OVS_VSCTL([remove netflow `cat netflow-uuid` targets '"1.2.3.4:567"'])], 
731   [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimum number is 1
732 ], [OVS_VSCTL_CLEANUP])
733 AT_CHECK([RUN_OVS_VSCTL([clear netflow `cat netflow-uuid` targets])], 
734   [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
735 ], [OVS_VSCTL_CLEANUP])
736 AT_CHECK([RUN_OVS_VSCTL([destroy b br2])], 
737   [1], [], [ovs-vsctl: no row "br2" in table Bridge
738 ], [OVS_VSCTL_CLEANUP])
739 OVS_VSCTL_CLEANUP
740 AT_CLEANUP
741
742 AT_SETUP([database commands -- conditions])
743 AT_KEYWORDS([ovs-vsctl])
744 trap 'kill `cat pid`' 0
745 OVS_VSCTL_SETUP
746 AT_CHECK(
747   [RUN_OVS_VSCTL_TOGETHER(
748      [add-br br0],
749      [add-br br1], [set bridge br1 flood_vlans=0 other-config:x='""'],
750      [add-br br2], [set bridge br2 flood_vlans=1 other-config:x=y],
751      [add-br br3], [set bridge br3 flood_vlans=0,1 other-config:x=z],
752      [add-br br4], [set bridge br4 flood_vlans=2],
753      [add-br br5], [set bridge br5 flood_vlans=0,2],
754      [add-br br6], [set bridge br6 flood_vlans=1,2],
755      [add-br br7], [set bridge br7 flood_vlans=0,1,2])], [0], [
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770 ])
771 m4_define([VSCTL_CHECK_FIND],
772   [AT_CHECK([ovs-vsctl --bare --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket -- --columns=name find bridge '$1' | sort | xargs echo], [0], [$2
773 ])])
774
775 # Arithmetic relational operators without keys.
776 VSCTL_CHECK_FIND([flood_vlans=0], [br1])
777 VSCTL_CHECK_FIND([flood_vlans=1], [br2])
778 VSCTL_CHECK_FIND([flood_vlans=0,2], [br5])
779 VSCTL_CHECK_FIND([flood_vlans=0,1,2], [br7])
780 VSCTL_CHECK_FIND([flood_vlans=3], [])
781
782 VSCTL_CHECK_FIND([flood_vlans!=0], [br0 br2 br3 br4 br5 br6 br7])
783 VSCTL_CHECK_FIND([flood_vlans!=1], [br0 br1 br3 br4 br5 br6 br7])
784 VSCTL_CHECK_FIND([flood_vlans!=0,2], [br0 br1 br2 br3 br4 br6 br7])
785 VSCTL_CHECK_FIND([flood_vlans!=0,1,2], [br0 br1 br2 br3 br4 br5 br6])
786 VSCTL_CHECK_FIND([flood_vlans!=3], [br0 br1 br2 br3 br4 br5 br6 br7])
787
788 VSCTL_CHECK_FIND([flood_vlans<2], [br0 br1 br2])
789 VSCTL_CHECK_FIND([flood_vlans<0,2], [br0 br1 br2 br3 br4])
790 VSCTL_CHECK_FIND([flood_vlans>1], [br3 br4 br5 br6 br7])
791 VSCTL_CHECK_FIND([flood_vlans>0,1], [br5 br6 br7])
792 VSCTL_CHECK_FIND([flood_vlans<=2], [br0 br1 br2 br4])
793 VSCTL_CHECK_FIND([flood_vlans<=0,2], [br0 br1 br2 br3 br4 br5])
794 VSCTL_CHECK_FIND([flood_vlans>=1], [br2 br3 br4 br5 br6 br7])
795 VSCTL_CHECK_FIND([flood_vlans>=0,1], [br3 br5 br6 br7])
796
797 # Set relational operators without keys.
798 VSCTL_CHECK_FIND([flood_vlans{=}0], [br1])
799 VSCTL_CHECK_FIND([flood_vlans{=}1], [br2])
800 VSCTL_CHECK_FIND([flood_vlans{=}0,2], [br5])
801 VSCTL_CHECK_FIND([flood_vlans{=}0,1,2], [br7])
802 VSCTL_CHECK_FIND([flood_vlans{=}3], [])
803
804 VSCTL_CHECK_FIND([flood_vlans{!=}0], [br0 br2 br3 br4 br5 br6 br7])
805 VSCTL_CHECK_FIND([flood_vlans{!=}1], [br0 br1 br3 br4 br5 br6 br7])
806 VSCTL_CHECK_FIND([flood_vlans{!=}0,2], [br0 br1 br2 br3 br4 br6 br7])
807 VSCTL_CHECK_FIND([flood_vlans{!=}0,1,2], [br0 br1 br2 br3 br4 br5 br6])
808 VSCTL_CHECK_FIND([flood_vlans{!=}3], [br0 br1 br2 br3 br4 br5 br6 br7])
809
810 VSCTL_CHECK_FIND([flood_vlans{<}[[]]], [])
811 VSCTL_CHECK_FIND([flood_vlans{<=}[[]]], [br0])
812 VSCTL_CHECK_FIND([flood_vlans{<}0], [br0])
813 VSCTL_CHECK_FIND([flood_vlans{<=}0], [br0 br1])
814 VSCTL_CHECK_FIND([flood_vlans{<}1,2], [br0 br2 br4])
815 VSCTL_CHECK_FIND([flood_vlans{<=}1,2], [br0 br2 br4 br6])
816
817 VSCTL_CHECK_FIND([flood_vlans{>}[[]]], [br1 br2 br3 br4 br5 br6 br7])
818 VSCTL_CHECK_FIND([flood_vlans{>=}[[]]], [br0 br1 br2 br3 br4 br5 br6 br7])
819 VSCTL_CHECK_FIND([flood_vlans{>}0], [br3 br5 br7])
820 VSCTL_CHECK_FIND([flood_vlans{>=}0], [br1 br3 br5 br7])
821 VSCTL_CHECK_FIND([flood_vlans{>}0,2], [br7])
822 VSCTL_CHECK_FIND([flood_vlans{>=}1,2], [br6 br7])
823 VSCTL_CHECK_FIND([flood_vlans{>=}0,2], [br5 br7])
824
825 # Arithmetic relational operators with keys.
826 VSCTL_CHECK_FIND([other-config:x=""], [br1])
827 VSCTL_CHECK_FIND([other-config:x=y], [br2])
828 VSCTL_CHECK_FIND([other-config:x=z], [br3])
829
830 VSCTL_CHECK_FIND([other-config:x!=""], [br2 br3])
831 VSCTL_CHECK_FIND([other-config:x!=y], [br1 br3])
832 VSCTL_CHECK_FIND([other-config:x!=z], [br1 br2])
833
834 VSCTL_CHECK_FIND([other-config:x>y], [br3])
835 VSCTL_CHECK_FIND([other-config:x>=y], [br2 br3])
836 VSCTL_CHECK_FIND([other-config:x<y], [br1])
837 VSCTL_CHECK_FIND([other-config:x<=y], [br1 br2])
838
839 # Set relational operators with keys.
840 VSCTL_CHECK_FIND([other-config:x{=}[[]]], [br0 br4 br5 br6 br7])
841 VSCTL_CHECK_FIND([other-config:x{=}""], [br1])
842 VSCTL_CHECK_FIND([other-config:x{=}y], [br2])
843 VSCTL_CHECK_FIND([other-config:x{=}z], [br3])
844
845 VSCTL_CHECK_FIND([other-config:x{!=}[[]]], [br1 br2 br3])
846 VSCTL_CHECK_FIND([other-config:x{!=}""], [br0 br2 br3 br4 br5 br6 br7])
847 VSCTL_CHECK_FIND([other-config:x{!=}y], [br0 br1 br3 br4 br5 br6 br7])
848 VSCTL_CHECK_FIND([other-config:x{!=}z], [br0 br1 br2 br4 br5 br6 br7])
849
850 VSCTL_CHECK_FIND([other-config:x{<=}[[]]], [br0 br4 br5 br6 br7])
851 VSCTL_CHECK_FIND([other-config:x{<=}x], [br0 br4 br5 br6 br7])
852 VSCTL_CHECK_FIND([other-config:x{<=}""], [br0 br1 br4 br5 br6 br7])
853 VSCTL_CHECK_FIND([other-config:x{<=}y], [br0 br2 br4 br5 br6 br7])
854 VSCTL_CHECK_FIND([other-config:x{<=}z], [br0 br3 br4 br5 br6 br7])
855 VSCTL_CHECK_FIND([other-config:x{<=}x,y,z], [br0 br2 br3 br4 br5 br6 br7])
856
857 VSCTL_CHECK_FIND([other-config:x{<}[[]]], [])
858 VSCTL_CHECK_FIND([other-config:x{<}x], [br0 br4 br5 br6 br7])
859 VSCTL_CHECK_FIND([other-config:x{<}""], [br0 br4 br5 br6 br7])
860 VSCTL_CHECK_FIND([other-config:x{<}y], [br0 br4 br5 br6 br7])
861 VSCTL_CHECK_FIND([other-config:x{<}z], [br0 br4 br5 br6 br7])
862
863 VSCTL_CHECK_FIND([other-config:x{>=}[[]]], [br0 br1 br2 br3 br4 br5 br6 br7])
864 VSCTL_CHECK_FIND([other-config:x{>=}x], [])
865 VSCTL_CHECK_FIND([other-config:x{>=}""], [br1])
866 VSCTL_CHECK_FIND([other-config:x{>=}y], [br2])
867 VSCTL_CHECK_FIND([other-config:x{>=}z], [br3])
868
869 VSCTL_CHECK_FIND([other-config:x{>}[[]]], [br1 br2 br3])
870 VSCTL_CHECK_FIND([other-config:x{>}x], [])
871 VSCTL_CHECK_FIND([other-config:x{>}""], [])
872 VSCTL_CHECK_FIND([other-config:x{>}y], [])
873 VSCTL_CHECK_FIND([other-config:x{>}z], [])
874 OVS_VSCTL_CLEANUP
875 AT_CLEANUP
876
877 AT_SETUP([database commands -- wait-until immediately true])
878 AT_KEYWORDS([ovs-vsctl])
879 OVS_VSCTL_SETUP
880 AT_CHECK([RUN_OVS_VSCTL(
881     [add-br br0], 
882     [add-bond br0 bond0 eth0 eth1],
883     [set port bond0 bond_updelay=500 other-config:abc=def])],
884   [0], [], [], [OVS_VSCTL_CLEANUP])
885 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . manager_options=[]]])],
886   [0], [], [], [OVS_VSCTL_CLEANUP])
887 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . bridges!=[]]])],
888   [0], [], [], [OVS_VSCTL_CLEANUP])
889 AT_CHECK([RUN_OVS_VSCTL([[wait-until Port bond0 other-config:abc=def]])],
890   [0], [], [], [OVS_VSCTL_CLEANUP])
891 AT_CHECK([RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' 'other-config:abc>d' 'other-config:abc<e']])],
892   [0], [], [], [OVS_VSCTL_CLEANUP])
893 OVS_VSCTL_CLEANUP
894 AT_CLEANUP
895
896 AT_SETUP([database commands -- wait-until must wait])
897 AT_KEYWORDS([ovs-vsctl])
898
899 # Disable lcov for this test.  All the programs running in parallel
900 # race badly on access to profiling data.
901 DISABLE_LCOV=true
902 export DISABLE_LCOV
903
904 OVS_VSCTL_SETUP
905
906 # Start ovs-vsctls in background.
907 (RUN_OVS_VSCTL([[wait-until o . bridges!=[] -- get bridge br10 other-config:abc]])) > stdout1 &
908 (RUN_OVS_VSCTL([[wait-until bridge br1 -- get bridge br1 other-config:abc]])) > stdout2 &
909 (RUN_OVS_VSCTL([[wait-until b br1 other-config={abc=def} -- get bridge br1 other-config]])) > stdout3 &
910 (RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' -- get port bond0 bond-updelay]])) > stdout4 &
911
912 # Give the ovs-vsctls a chance to read the database
913 sleep 1
914
915 AT_CHECK([RUN_OVS_VSCTL([add-br br10 -- set bridge br10 other-config:abc=quux])
916 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])],
917   [0], [], [], [OVS_VSCTL_CLEANUP])
918
919 # Wait for the ovs-vsctls to finish.
920 wait
921
922 # Check output
923 AT_CHECK([cat stdout1], [0], [quux
924 ], [], [OVS_VSCTL_CLEANUP])
925 AT_CHECK([cat stdout2], [0], [def
926 ], [], [OVS_VSCTL_CLEANUP])
927 AT_CHECK([cat stdout3], [0], [{abc=def}
928 ], [], [OVS_VSCTL_CLEANUP])
929 AT_CHECK([cat stdout4], [0], [500
930 ], [], [OVS_VSCTL_CLEANUP])
931
932 OVS_VSCTL_CLEANUP
933 AT_CLEANUP
934
935 AT_SETUP([--id option on create, get commands])
936 AT_KEYWORDS([ovs-vsctl])
937 OVS_VSCTL_SETUP
938 AT_CHECK([RUN_OVS_VSCTL([add-br br0],
939                         [add-port br0 eth0],
940                         [add-port br0 eth1])])
941 AT_CHECK(
942   [RUN_OVS_VSCTL_TOGETHER(
943     [set bridge br0 mirrors=@m],
944     [--id=@eth0 get port eth0],
945     [--id=@eth1 get port eth1],
946     [--id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1])],
947   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
948 AT_CHECK(
949   [perl $srcdir/uuidfilt.pl stdout], [0], [dnl
950
951
952
953 <0>
954 ],
955   [], [OVS_VSCTL_CLEANUP])
956 AT_CHECK(
957   [RUN_OVS_VSCTL(
958     [list port eth0 eth1],
959     [list mirror],
960     [list bridge br0])],
961   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
962 AT_CHECK(
963   [sed -n -e '/uuid/p' -e '/name/p' -e '/mirrors/p' -e '/select/p' -e '/output/p' < stdout | $srcdir/uuidfilt.pl], [0], [dnl
964 [_uuid               : <0>
965 name                : "eth0"
966 _uuid               : <1>
967 name                : "eth1"
968 _uuid               : <2>
969 name                : mymirror
970 output_port         : <1>
971 output_vlan         : []
972 select_all          : false
973 select_dst_port     : [<0>]
974 select_src_port     : [<0>]
975 select_vlan         : []
976 _uuid               : <3>
977 mirrors             : [<2>]
978 name                : "br0"
979 ]],
980   [], [OVS_VSCTL_CLEANUP])
981 OVS_VSCTL_CLEANUP
982 AT_CLEANUP
983
984 AT_SETUP([unreferenced record warnings])
985 AT_KEYWORDS([ovs-vsctl])
986 OVS_VSCTL_SETUP
987 AT_CHECK(
988   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket \
989      -- create Bridge name=br0 | $srcdir/uuidfilt.pl],
990   [0], [<0>
991 ], [vsctl|WARN|applying "create" command to table Bridge without --id option will have no effect
992 ], [OVS_VSCTL_CLEANUP])
993 AT_CHECK(
994   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket \
995      -- --id=@br0 create Bridge name=br0 | $srcdir/uuidfilt.pl],
996   [0], [<0>
997 ], [vsctl|WARN|row id "@br0" was created but no reference to it was inserted, so it will not actually appear in the database
998 ], [OVS_VSCTL_CLEANUP])
999 AT_CHECK(
1000   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket \
1001      -- --id=@eth0_iface create Interface name=eth0 \
1002      -- --id=@eth0 create Port name=eth0 interfaces=@eth0_iface \
1003      -- --id=@m0 create Mirror name=m0 output_port=@eth0 \
1004      -- --id=@br0 create Bridge name=br0 mirrors=@m0 \
1005      -- set Open_vSwitch . bridges=@br0 | $srcdir/uuidfilt.pl],
1006   [0], [<0>
1007 <1>
1008 <2>
1009 <3>
1010 ], [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
1011 ], [OVS_VSCTL_CLEANUP])
1012 OVS_VSCTL_CLEANUP
1013 AT_CLEANUP
1014
1015 dnl This test really shows a bug -- "create" followed by "list" in
1016 dnl the same execution shows the wrong UUID on the "list" command.
1017 dnl The bug is documented in ovs-vsctl.8.
1018 AT_SETUP([created row UUID is wrong in same execution])
1019 AT_KEYWORDS([ovs-vsctl])
1020 OVS_VSCTL_SETUP
1021 AT_CHECK([RUN_OVS_VSCTL([--id=@br0 create Bridge name=br0 -- add Open_vSwitch . bridges @br0 -- list b])],
1022   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1023 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], 
1024   [[<0>
1025 _uuid               : <1>
1026 controller          : []
1027 datapath_id         : []
1028 datapath_type       : ""
1029 external_ids        : {}
1030 fail_mode           : []
1031 flood_vlans         : []
1032 flow_tables         : {}
1033 mirrors             : []
1034 name                : "br0"
1035 netflow             : []
1036 other_config        : {}
1037 ports               : []
1038 sflow               : []
1039 status              : {}
1040 stp_enable          : false
1041 ]], [ignore], [test ! -e pid || kill `cat pid`])
1042 OVS_VSCTL_CLEANUP
1043 AT_CLEANUP