Implement IPFIX export
[sliver-openvswitch.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   [OVSDB_INIT([db])
7    AT_CHECK([ovsdb-server --detach --no-chdir --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 --no-wait -vreconnect:emer --db=unix:socket command
19 ])])
20 m4_define([RUN_OVS_VSCTL_ONELINE],
21   [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect: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 --no-wait -vreconnect: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])
144
145 AT_SETUP([ovs-vsctl connection retry])
146 OVS_RUNDIR=$PWD; export OVS_RUNDIR
147
148 dnl Without --retry, there should be no retry for active connections.
149 AT_CHECK([ovs-vsctl --db=unix:foo --timeout=10 -vreconnect:emer -- init],
150   [1], [], [stderr])
151 AT_CHECK([[sed 's/([^()]*)/(...reason...)/' stderr]], [0],
152   [ovs-vsctl: unix:foo: database connection failed (...reason...)
153 ])
154
155 dnl With --retry, we should retry for active connections.
156 AT_CHECK(
157   [ovs-vsctl --db=unix:foo --timeout=1 --retry -vreconnect:emer -vPATTERN:console:'%c|%p|%m' -- init
158    echo $? > status],
159   [0], [], [stderr])
160 AT_CHECK([grep -c 'terminating with signal' stderr], [0], [1
161 ])
162 AT_CHECK([kill -l `cat status`], [0], [ALRM
163 ])
164
165 dnl Without --retry, we should retry for passive connections.
166 AT_CHECK(
167   [ovs-vsctl --db=punix:foo --timeout=1 -vreconnect:emer -vPATTERN:console:'%c|%p|%m' -- init
168    echo $? > status],
169   [0], [], [stderr])
170 AT_CHECK([grep -c 'terminating with signal' stderr], [0], [1
171 ])
172 AT_CHECK([kill -l `cat status`], [0], [ALRM
173 ])
174 AT_CLEANUP
175
176 dnl ----------------------------------------------------------------------
177 AT_BANNER([ovs-vsctl unit tests -- real bridges])
178
179 AT_SETUP([add-br a])
180 AT_KEYWORDS([ovs-vsctl])
181 OVS_VSCTL_SETUP
182 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
183 CHECK_BRIDGES([a, a, 0])
184 CHECK_PORTS([a])
185 CHECK_IFACES([a])
186 OVS_VSCTL_CLEANUP
187 AT_CLEANUP
188
189 AT_SETUP([add-br a, add-br a])
190 AT_KEYWORDS([ovs-vsctl])
191 OVS_VSCTL_SETUP
192 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
193 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
194   [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
195 ], [OVS_VSCTL_CLEANUP])
196 OVS_VSCTL_CLEANUP
197 AT_CLEANUP
198
199 AT_SETUP([add-br a, add-br b])
200 AT_KEYWORDS([ovs-vsctl])
201 OVS_VSCTL_SETUP
202 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
203          [OVS_VSCTL_CLEANUP])
204 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br a b 9])], [1], [],
205   [ovs-vsctl: "--may-exist add-br a b 9" but a is not a VLAN bridge
206 ],
207   [OVS_VSCTL_CLEANUP])
208 CHECK_BRIDGES([a, a, 0], [b, b, 0])
209 CHECK_PORTS([a])
210 CHECK_IFACES([a])
211 CHECK_PORTS([b])
212 CHECK_IFACES([b])
213 OVS_VSCTL_CLEANUP
214 AT_CLEANUP
215
216 AT_SETUP([add-br a, add-br b, del-br a])
217 AT_KEYWORDS([ovs-vsctl])
218 OVS_VSCTL_SETUP
219 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
220          [OVS_VSCTL_CLEANUP])
221 CHECK_BRIDGES([b, b, 0])
222 CHECK_PORTS([b])
223 CHECK_IFACES([b])
224 OVS_VSCTL_CLEANUP
225 AT_CLEANUP
226
227 AT_SETUP([add-br a, del-br a, add-br a])
228 AT_KEYWORDS([ovs-vsctl])
229 OVS_VSCTL_SETUP
230 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
231   [add-br a],
232   [del-br a],
233   [add-br a],
234   [set Interface a other_config:key=value],
235   [get Interface a other_config:key])], [0], [
236
237
238
239 value
240 ], [], [OVS_VSCTL_CLEANUP])
241 CHECK_BRIDGES([a, a, 0])
242 CHECK_PORTS([a])
243 CHECK_IFACES([a])
244 OVS_VSCTL_CLEANUP
245 AT_CLEANUP
246
247 AT_SETUP([add-br a, add-port a a1, add-port a a2])
248 AT_KEYWORDS([ovs-vsctl])
249 OVS_VSCTL_SETUP
250 AT_CHECK([RUN_OVS_VSCTL(
251    [add-br a],
252    [--if-exists del-br b],
253    [add-port a a1],
254    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
255 CHECK_BRIDGES([a, a, 0])
256 CHECK_PORTS([a], [a1], [a2])
257 CHECK_IFACES([a], [a1], [a2])
258 OVS_VSCTL_CLEANUP
259 AT_CLEANUP
260
261 AT_SETUP([add-br a, add-port a a1, add-port a a1])
262 AT_KEYWORDS([ovs-vsctl])
263 OVS_VSCTL_SETUP
264 AT_CHECK([RUN_OVS_VSCTL(
265    [add-br a], 
266    [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
267 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
268   [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
269 ], [OVS_VSCTL_CLEANUP])
270 OVS_VSCTL_CLEANUP
271 AT_CLEANUP
272
273 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
274 AT_KEYWORDS([ovs-vsctl])
275 OVS_VSCTL_SETUP
276 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
277    [add-br a], 
278    [add-br b], 
279    [add-port a a1],
280    [add-port b b1],
281    [--if-exists del-port b b2],
282    [del-br a])], [0], [
283
284
285
286
287
288 ], [], [OVS_VSCTL_CLEANUP])
289 CHECK_BRIDGES([b, b, 0])
290 CHECK_PORTS([b], [b1])
291 CHECK_IFACES([b], [b1])
292 OVS_VSCTL_CLEANUP
293 AT_CLEANUP
294
295 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
296 AT_KEYWORDS([ovs-vsctl])
297 OVS_VSCTL_SETUP
298 AT_CHECK([RUN_OVS_VSCTL(
299    [add-br a], 
300    [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
301 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a3 a1 a2])], [0], [], [],
302   [OVS_VSCTL_CLEANUP])
303 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a2 a1])], [1], [], 
304   [ovs-vsctl: "--may-exist add-bond a bond0 a2 a1" but bond0 actually has interface(s) a1, a2, a3
305 ],
306   [OVS_VSCTL_CLEANUP])
307 CHECK_BRIDGES([a, a, 0])
308 CHECK_PORTS([a], [bond0])
309 CHECK_IFACES([a], [a1], [a2], [a3])
310 OVS_VSCTL_CLEANUP
311 AT_CLEANUP
312
313 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
314 AT_KEYWORDS([ovs-vsctl])
315 OVS_VSCTL_SETUP
316 AT_CHECK([RUN_OVS_VSCTL(
317   [add-br a], 
318   [add-br b], 
319   [add-port a a1 tag=9],
320   [get port a1 tag],
321   [--may-exist add-port b b1],
322   [del-port a a1])], [0], [9
323 ], [], [OVS_VSCTL_CLEANUP])
324 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port b b1])], [0], [], [],
325   [OVS_VSCTL_CLEANUP])
326 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [], 
327   [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b
328 ],
329   [OVS_VSCTL_CLEANUP])
330 CHECK_BRIDGES([a, a, 0], [b, b, 0])
331 CHECK_PORTS([a])
332 CHECK_IFACES([a])
333 CHECK_PORTS([b], [b1])
334 CHECK_IFACES([b], [b1])
335 OVS_VSCTL_CLEANUP
336 AT_CLEANUP
337
338 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
339 AT_KEYWORDS([ovs-vsctl])
340 OVS_VSCTL_SETUP
341 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
342   [add-br a], 
343   [add-bond a bond0 a1 a2 a3 tag=9],
344   [get Port bond0 tag],
345   [del-port bond0])], [0], [
346
347 9
348
349 ], [], [OVS_VSCTL_CLEANUP])
350 CHECK_BRIDGES([a, a, 0])
351 CHECK_PORTS([a])
352 OVS_VSCTL_CLEANUP
353 AT_CLEANUP
354
355 AT_SETUP([external IDs])
356 AT_KEYWORDS([ovs-vsctl])
357 OVS_VSCTL_SETUP
358 AT_CHECK([RUN_OVS_VSCTL_ONELINE(
359   [add-br a], 
360   [add-port a a1],
361   [add-bond a bond0 a2 a3],
362   [br-set-external-id a key0 value0],
363   [set port a1 external-ids:key1=value1],
364   [set interface a2 external-ids:key2=value2],
365   [set interface a2 external-ids:key3=value3],
366   [set interface a3 external-ids:key4=value4],
367   [br-get-external-id a],
368   [br-get-external-id a key0],
369   [br-get-external-id a key1],
370   [br-set-external-id a key0 othervalue],
371   [br-get-external-id a],
372   [br-set-external-id a key0],
373   [br-get-external-id a],
374   [get port a1 external-ids],
375   [get interface a2 external-ids],
376   [get interface a3 external-ids])], [0], [
377
378
379
380
381
382
383
384 key0=value0
385 value0
386
387
388 key0=othervalue
389
390
391 {"key1"="value1"}
392 {"key2"="value2", "key3"="value3"}
393 {"key4"="value4"}
394 ], [], [OVS_VSCTL_CLEANUP])
395 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
396   [br-get-external-id a],
397   [get port a1 external-ids],
398   [get interface a2 external-ids],
399   [get interface a3 external-ids])], [0],
400 [
401 {"key1"="value1"}
402 {"key2"="value2", "key3"="value3"}
403 {"key4"="value4"}
404 ], [], [OVS_VSCTL_CLEANUP])
405 CHECK_BRIDGES([a, a, 0])
406 CHECK_PORTS([a], [a1], [bond0])
407 CHECK_IFACES([a], [a1], [a2], [a3])
408 OVS_VSCTL_CLEANUP
409 AT_CLEANUP
410
411 AT_SETUP([controllers])
412 AT_KEYWORDS([controller ovs-vsctl])
413 OVS_VSCTL_SETUP
414 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
415   [add-br br0],
416
417   [get-controller br0],
418   [set-controller br0 tcp:4.5.6.7],
419   [get-controller br0],
420
421   [del-controller br0],
422   [get-controller br0],
423
424   [set-controller br0 tcp:8.9.10.11 tcp:5.4.3.2],
425   [get-controller br0])], [0], [
426
427
428 tcp:4.5.6.7
429
430
431
432 tcp:5.4.3.2\ntcp:8.9.10.11
433 ], [], [OVS_VSCTL_CLEANUP])
434 OVS_VSCTL_CLEANUP
435 AT_CLEANUP
436
437 dnl ----------------------------------------------------------------------
438 dnl OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([VLAN])
439 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
440   [AT_CHECK(
441      [RUN_OVS_VSCTL(
442         [add-br xenbr0],
443         [--may-exist add-br xenbr0],
444         [add-port xenbr0 eth0],
445         [--may-exist add-port xenbr0 eth0],
446         [add-br xapi1 xenbr0 $1],
447         [--may-exist add-br xapi1 xenbr0 $1],
448         [add-port xapi1 eth0.$1])],
449      [0], [], [], [OVS_VSCTL_CLEANUP])])
450
451 dnl OVS_VSCTL_FAKE_BRIDGE_TESTS([VLAN])
452 m4_define([OVS_VSCTL_FAKE_BRIDGE_TESTS], [
453 AT_BANNER([ovs-vsctl unit tests -- fake bridges (VLAN $1)])
454
455 AT_SETUP([simple fake bridge (VLAN $1)])
456 AT_KEYWORDS([ovs-vsctl fake-bridge])
457 OVS_VSCTL_SETUP
458 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
459 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
460   [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN $1
461 ], [OVS_VSCTL_CLEANUP])
462 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx $1])], [1], [],
463   [ovs-vsctl: "--may-exist add-br xapi1 xxx $1" but xapi1 has the wrong parent xenbr0
464 ], [OVS_VSCTL_CLEANUP])
465 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
466   [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN $1
467 ], [OVS_VSCTL_CLEANUP])
468 CHECK_BRIDGES([xapi1, xenbr0, $1], [xenbr0, xenbr0, 0])
469 CHECK_PORTS([xenbr0], [eth0])
470 CHECK_IFACES([xenbr0], [eth0])
471 CHECK_PORTS([xapi1], [eth0.$1])
472 CHECK_IFACES([xapi1], [eth0.$1])
473 OVS_VSCTL_CLEANUP
474 AT_CLEANUP
475
476 AT_SETUP([list bridges -- real and fake (VLAN $1)])
477 AT_KEYWORDS([ovs-vsctl fake-bridge])
478 OVS_VSCTL_SETUP
479 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
480 AT_CHECK([RUN_OVS_VSCTL_ONELINE([-- list-br])], [0],
481   [xapi1\nxenbr0
482 ], [], [OVS_VSCTL_CLEANUP])
483 AT_CHECK([RUN_OVS_VSCTL_ONELINE([-- --real list-br])], [0],
484   [xenbr0
485 ], [], [OVS_VSCTL_CLEANUP])
486 AT_CHECK([RUN_OVS_VSCTL_ONELINE([-- --fake list-br])], [0],
487   [xapi1
488 ], [], [OVS_VSCTL_CLEANUP])
489 OVS_VSCTL_CLEANUP
490 AT_CLEANUP
491
492 AT_SETUP([simple fake bridge + del-br fake bridge (VLAN $1)])
493 AT_KEYWORDS([ovs-vsctl fake-bridge])
494 OVS_VSCTL_SETUP
495 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
496 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
497 CHECK_BRIDGES([xenbr0, xenbr0, 0])
498 CHECK_PORTS([xenbr0], [eth0])
499 CHECK_IFACES([xenbr0], [eth0])
500 OVS_VSCTL_CLEANUP
501 AT_CLEANUP
502
503 AT_SETUP([simple fake bridge + del-br real bridge (VLAN $1)])
504 AT_KEYWORDS([ovs-vsctl fake-bridge])
505 OVS_VSCTL_SETUP
506 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
507 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
508 CHECK_BRIDGES
509 OVS_VSCTL_CLEANUP
510 AT_CLEANUP
511
512 AT_SETUP([simple fake bridge + external IDs (VLAN $1)])
513 AT_KEYWORDS([ovs-vsctl fake-bridge])
514 OVS_VSCTL_SETUP
515 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
516 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
517   [br-set-external-id xenbr0 key0 value0],
518   [br-set-external-id xapi1 key1 value1],
519   [br-get-external-id xenbr0],
520   [br-get-external-id xenbr0 key0],
521   [br-get-external-id xapi1],
522   [br-get-external-id xapi1 key1])], [0], [
523
524 key0=value0
525 value0
526 key1=value1
527 value1
528 ], [], [OVS_VSCTL_CLEANUP])
529 CHECK_BRIDGES([xapi1, xenbr0, $1], [xenbr0, xenbr0, 0])
530 CHECK_PORTS([xenbr0], [eth0])
531 CHECK_IFACES([xenbr0], [eth0])
532 CHECK_PORTS([xapi1], [eth0.$1])
533 CHECK_IFACES([xapi1], [eth0.$1])
534 OVS_VSCTL_CLEANUP
535 AT_CLEANUP
536 ]) # OVS_VSCTL_FAKE_BRIDGE_TESTS
537
538 OVS_VSCTL_FAKE_BRIDGE_TESTS([9])
539 OVS_VSCTL_FAKE_BRIDGE_TESTS([0])
540
541 dnl OVS_VSCTL_SETUP_BOND_FAKE_CONF([VLAN])
542 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
543   [AT_CHECK(
544      [RUN_OVS_VSCTL(
545         [add-br xapi1],
546         [add-bond xapi1 bond0 eth0 eth1],
547         [add-br xapi2 xapi1 $1],
548         [add-port xapi2 bond0.$1])],
549      [0], [], [], [OVS_VSCTL_CLEANUP])])
550
551 AT_SETUP([fake bridge on bond])
552 AT_KEYWORDS([ovs-vsctl fake-bridge])
553 OVS_VSCTL_SETUP
554 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
555 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
556 CHECK_PORTS([xapi1], [bond0])
557 CHECK_IFACES([xapi1], [eth0], [eth1])
558 CHECK_PORTS([xapi2], [bond0.11])
559 CHECK_IFACES([xapi2], [bond0.11])
560 OVS_VSCTL_CLEANUP
561 AT_CLEANUP
562
563 AT_SETUP([fake bridge on bond + del-br fake bridge])
564 AT_KEYWORDS([ovs-vsctl fake-bridge])
565 OVS_VSCTL_SETUP
566 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
567 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
568 ], [], [OVS_VSCTL_CLEANUP])
569 CHECK_BRIDGES([xapi1, xapi1, 0])
570 CHECK_PORTS([xapi1], [bond0])
571 CHECK_IFACES([xapi1], [eth0], [eth1])
572 OVS_VSCTL_CLEANUP
573 AT_CLEANUP
574
575 AT_SETUP([fake bridge on bond + del-br real bridge])
576 AT_KEYWORDS([ovs-vsctl fake-bridge])
577 OVS_VSCTL_SETUP
578 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
579 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
580 CHECK_BRIDGES
581 OVS_VSCTL_CLEANUP
582 AT_CLEANUP
583
584 dnl ----------------------------------------------------------------------
585 AT_BANNER([ovs-vsctl unit tests -- manager commands])
586
587 AT_SETUP([managers])
588 AT_KEYWORDS([manager ovs-vsctl])
589 OVS_VSCTL_SETUP
590 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
591   [del-manager],
592   [get-manager],
593   [set-manager tcp:4.5.6.7],
594   [get-manager],
595   [set-manager tcp:8.9.10.11 tcp:5.4.3.2],
596   [get-manager],
597   [del-manager],
598   [get-manager])], [0], [
599
600
601 tcp:4.5.6.7
602
603 tcp:5.4.3.2\ntcp:8.9.10.11
604
605
606 ], [], [OVS_VSCTL_CLEANUP])
607 OVS_VSCTL_CLEANUP
608 AT_CLEANUP
609
610 dnl ----------------------------------------------------------------------
611 AT_BANNER([ovs-vsctl unit tests -- database commands])
612
613 AT_SETUP([database commands -- positive checks])
614 AT_KEYWORDS([ovs-vsctl])
615 OVS_VSCTL_SETUP
616 AT_CHECK(
617   [RUN_OVS_VSCTL_TOGETHER([--id=@br0 create b name=br0],
618                           [set o . bridges=@br0])],
619   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
620 cp stdout out1
621 AT_CHECK([RUN_OVS_VSCTL([list b], [get b br0 _uuid])],
622   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
623 cp stdout out2
624 AT_CHECK([${PERL} $srcdir/uuidfilt.pl out1 out2], [0], 
625   [[<0>
626
627 _uuid               : <0>
628 controller          : []
629 datapath_id         : []
630 datapath_type       : ""
631 external_ids        : {}
632 fail_mode           : []
633 flood_vlans         : []
634 flow_tables         : {}
635 ipfix               : []
636 mirrors             : []
637 name                : "br0"
638 netflow             : []
639 other_config        : {}
640 ports               : []
641 protocols           : []
642 sflow               : []
643 status              : {}
644 stp_enable          : false
645 <0>
646 ]], [ignore], [test ! -e pid || kill `cat pid`])
647 AT_CHECK(
648   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type list b])],
649   [0],
650   [[fail_mode           : []
651 name                : "br0"
652 datapath_type       : ""
653 ]], [ignore], [test ! -e pid || kill `cat pid`])
654 AT_CHECK(
655   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type find b])],
656   [0],
657   [[fail_mode           : []
658 name                : "br0"
659 datapath_type       : ""
660 ]], [ignore], [test ! -e pid || kill `cat pid`])
661 AT_CHECK([
662   RUN_OVS_VSCTL_TOGETHER([--id=@br1 create b name=br1 datapath_type="foo"],
663                          [--id=@br2 create b name=br2 external-ids:bar=quux],
664                          [add o . bridges @br1 @br2])],
665   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
666 AT_CHECK(
667   [RUN_OVS_VSCTL([--columns=name find b datapath_type!=foo])], [0], [stdout],
668   [ignore], [test ! -e pid || kill `cat pid`])
669 AT_CHECK([sed -n '/./p' stdout | sort], [0],
670   [[name                : "br0"
671 name                : "br2"
672 ]])
673 AT_CHECK(
674   [RUN_OVS_VSCTL(
675     [set bridge br0 \
676       'other_config:datapath_id="0123456789ab"' \
677       'other_config:hwaddr="00:11:22:33:44:55"' \
678       'external-ids={"uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
679      add bridge br0 external_ids '"roles"="local; remote; cloud"'])],
680   [0], [], [], [OVS_VSCTL_CLEANUP])
681 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])],
682   [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{roles="local; remote; cloud", uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
683 ], [], [OVS_VSCTL_CLEANUP])
684 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])],
685   [0], ["00:11:22:33:44:55"
686
687 ], [], [OVS_VSCTL_CLEANUP])
688 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])], 
689   [0], [{datapath_id="0123456789ab"}
690 ], [], [OVS_VSCTL_CLEANUP])
691 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])], 
692   [0], [{}
693 ], [], [OVS_VSCTL_CLEANUP])
694 AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])], 
695   [0], [{}
696 ], [], [OVS_VSCTL_CLEANUP])
697 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([destroy b br0],
698                                  [destroy b br1],
699                                  [destroy b br2],
700                                  [clear o . bridges])],
701   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
702 AT_CHECK([RUN_OVS_VSCTL([list b])], 
703   [0], [], [], [OVS_VSCTL_CLEANUP])
704 AT_CHECK([RUN_OVS_VSCTL([--if-exists get b x datapath_id])],
705   [0], [], [], [OVS_VSCTL_CLEANUP])
706 AT_CHECK([RUN_OVS_VSCTL([--if-exists list b x])],
707   [0], [], [], [OVS_VSCTL_CLEANUP])
708 AT_CHECK([RUN_OVS_VSCTL([--if-exists set controller x connection_mode=standalone])],
709   [0], [], [], [OVS_VSCTL_CLEANUP])
710 AT_CHECK(
711   [RUN_OVS_VSCTL([--if-exists remove netflow x targets '"1.2.3.4:567"'])],
712   [0], [], [], [OVS_VSCTL_CLEANUP])
713 AT_CHECK(
714   [RUN_OVS_VSCTL([--if-exists clear netflow x targets])],
715   [0], [], [], [OVS_VSCTL_CLEANUP])
716 OVS_VSCTL_CLEANUP
717 AT_CLEANUP
718
719 AT_SETUP([database commands -- negative checks])
720 AT_KEYWORDS([ovs-vsctl])
721 OVS_VSCTL_SETUP
722
723 AT_CHECK([ovs-vsctl --may-exist],
724   [1], [ignore], [ovs-vsctl: missing command name (use --help for help)
725 ], [OVS_VSCTL_CLEANUP])
726 AT_CHECK([ovs-vsctl --may-exist --],
727   [1], [ignore], [ovs-vsctl: missing command name (use --help for help)
728 ], [OVS_VSCTL_CLEANUP])
729 AT_CHECK([ovs-vsctl -- --may-exist],
730   [1], [ignore], [ovs-vsctl: missing command name (use --help for help)
731 ], [OVS_VSCTL_CLEANUP])
732
733 AT_CHECK([RUN_OVS_VSCTL([add-br br0])],
734   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
735 AT_CHECK([RUN_OVS_VSCTL([add-br br1])], 
736   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
737 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])], 
738   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
739 AT_CHECK([
740     RUN_OVS_VSCTL_TOGETHER([--id=@n create netflow targets='"1.2.3.4:567"'],
741                            [set bridge br0 netflow=@n])],
742   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
743 cp stdout netflow-uuid
744 AT_CHECK([RUN_OVS_VSCTL([list netflow `cat netflow-uuid`])],
745   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
746 AT_CHECK([${PERL} $srcdir/uuidfilt.pl netflow-uuid stdout], [0], 
747   [[<0>
748
749 _uuid               : <0>
750 active_timeout      : 0
751 add_id_to_interface : false
752 engine_id           : []
753 engine_type         : []
754 external_ids        : {}
755 targets             : ["1.2.3.4:567"]
756 ]], [ignore], [test ! -e pid || kill `cat pid`])
757 AT_CHECK([RUN_OVS_VSCTL([list interx x])], 
758   [1], [], [ovs-vsctl: unknown table "interx"
759 ], [OVS_VSCTL_CLEANUP])
760 AT_CHECK([RUN_OVS_VSCTL([list b x])], 
761   [1], [], [ovs-vsctl: no row "x" in table Bridge
762 ], [OVS_VSCTL_CLEANUP])
763 AT_CHECK([RUN_OVS_VSCTL([get b x datapath_id])],
764   [1], [], [ovs-vsctl: no row "x" in table Bridge
765 ], [OVS_VSCTL_CLEANUP])
766 AT_CHECK([RUN_OVS_VSCTL([get b br0 d])], 
767   [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
768 ], [OVS_VSCTL_CLEANUP])
769 AT_CHECK([RUN_OVS_VSCTL([get b br0 x])], 
770   [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
771 ], [OVS_VSCTL_CLEANUP])
772 AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])], 
773   [1], [], [ovs-vsctl: :y=z: missing column name
774 ], [OVS_VSCTL_CLEANUP])
775 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])], 
776   [1], [], [ovs-vsctl: datapath_id:y=z: trailing garbage "=z" in argument
777 ], [OVS_VSCTL_CLEANUP])
778 AT_CHECK([RUN_OVS_VSCTL([set b br0 'datapath_id:y>=z'])], 
779   [1], [], [ovs-vsctl: datapath_id:y>=z: argument does not end in "=" followed by a value.
780 ], [OVS_VSCTL_CLEANUP])
781 AT_CHECK([RUN_OVS_VSCTL([set controller x connection_mode=standalone])],
782   [1], [], [ovs-vsctl: no row "x" in table Controller
783 ], [OVS_VSCTL_CLEANUP])
784 AT_CHECK([RUN_OVS_VSCTL([wait-until b br0 datapath_id:y,z])], 
785   [1], [], [ovs-vsctl: datapath_id:y,z: argument does not end in "=", "!=", "<", ">", "<=", ">=", "{=}", "{!=}", "{<}", "{>}", "{<=}", or "{>=}" followed by a value.
786 ], [OVS_VSCTL_CLEANUP])
787 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])], 
788   [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
789 ], [OVS_VSCTL_CLEANUP])
790 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])], 
791   [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
792 ], [OVS_VSCTL_CLEANUP])
793 AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])], 
794   [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
795 ], [OVS_VSCTL_CLEANUP])
796 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])], 
797   [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
798 ], [OVS_VSCTL_CLEANUP])
799 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])], 
800   [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
801 ], [OVS_VSCTL_CLEANUP])
802 AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])], 
803   [1], [], [[ovs-vsctl: constraint violation: xyz is not one of the allowed values ([in-band, out-of-band])
804 ]], [OVS_VSCTL_CLEANUP])
805 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])], 
806   [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
807 ], [OVS_VSCTL_CLEANUP])
808 AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])], 
809   [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
810 ], [OVS_VSCTL_CLEANUP])
811 AT_CHECK([RUN_OVS_VSCTL([remove netflow `cat netflow-uuid` targets '"1.2.3.4:567"'])], 
812   [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimum number is 1
813 ], [OVS_VSCTL_CLEANUP])
814 AT_CHECK([RUN_OVS_VSCTL([remove netflow x targets '"1.2.3.4:567"'])], 
815   [1], [], [ovs-vsctl: no row "x" in table NetFlow
816 ], [OVS_VSCTL_CLEANUP])
817 AT_CHECK([RUN_OVS_VSCTL([clear netflow x targets])],
818   [1], [], [ovs-vsctl: no row "x" in table NetFlow
819 ], [OVS_VSCTL_CLEANUP])
820 AT_CHECK([RUN_OVS_VSCTL([clear netflow `cat netflow-uuid` targets])], 
821   [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
822 ], [OVS_VSCTL_CLEANUP])
823 AT_CHECK([RUN_OVS_VSCTL([destroy b br2])], 
824   [1], [], [ovs-vsctl: no row "br2" in table Bridge
825 ], [OVS_VSCTL_CLEANUP])
826 AT_CHECK([RUN_OVS_VSCTL([add in br1 name x])],
827   [1], [], [ovs-vsctl: cannot modify read-only column name in table Interface
828 ], [OVS_VSCTL_CLEANUP])
829 AT_CHECK([RUN_OVS_VSCTL([set port br1 name br2])],
830   [1], [], [ovs-vsctl: cannot modify read-only column name in table Port
831 ], [OVS_VSCTL_CLEANUP])
832 AT_CHECK([RUN_OVS_VSCTL([remove b br1 name br1])],
833   [1], [], [ovs-vsctl: cannot modify read-only column name in table Bridge
834 ], [OVS_VSCTL_CLEANUP])
835 AT_CHECK([RUN_OVS_VSCTL([clear b br1 name])],
836   [1], [], [ovs-vsctl: cannot modify read-only column name in table Bridge
837 ], [OVS_VSCTL_CLEANUP])
838 OVS_VSCTL_CLEANUP
839 AT_CLEANUP
840
841 AT_SETUP([database commands -- conditions])
842 AT_KEYWORDS([ovs-vsctl])
843 ON_EXIT([kill `cat pid`])
844 OVS_VSCTL_SETUP
845 AT_CHECK(
846   [RUN_OVS_VSCTL_TOGETHER(
847      [add-br br0],
848      [add-br br1], [set bridge br1 flood_vlans=0 other-config:x='""'],
849      [add-br br2], [set bridge br2 flood_vlans=1 other-config:x=y],
850      [add-br br3], [set bridge br3 flood_vlans=0,1 other-config:x=z],
851      [add-br br4], [set bridge br4 flood_vlans=2],
852      [add-br br5], [set bridge br5 flood_vlans=0,2],
853      [add-br br6], [set bridge br6 flood_vlans=1,2],
854      [add-br br7], [set bridge br7 flood_vlans=0,1,2])], [0], [
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869 ])
870 m4_define([VSCTL_CHECK_FIND],
871   [AT_CHECK([echo `ovs-vsctl --bare --no-wait -vreconnect:emer --db=unix:socket -- --columns=name find bridge '$1' | sort`], [0], [$2
872 ])])
873
874 # Arithmetic relational operators without keys.
875 VSCTL_CHECK_FIND([flood_vlans=0], [br1])
876 VSCTL_CHECK_FIND([flood_vlans=1], [br2])
877 VSCTL_CHECK_FIND([flood_vlans=0,2], [br5])
878 VSCTL_CHECK_FIND([flood_vlans=0,1,2], [br7])
879 VSCTL_CHECK_FIND([flood_vlans=3], [])
880
881 VSCTL_CHECK_FIND([flood_vlans!=0], [br0 br2 br3 br4 br5 br6 br7])
882 VSCTL_CHECK_FIND([flood_vlans!=1], [br0 br1 br3 br4 br5 br6 br7])
883 VSCTL_CHECK_FIND([flood_vlans!=0,2], [br0 br1 br2 br3 br4 br6 br7])
884 VSCTL_CHECK_FIND([flood_vlans!=0,1,2], [br0 br1 br2 br3 br4 br5 br6])
885 VSCTL_CHECK_FIND([flood_vlans!=3], [br0 br1 br2 br3 br4 br5 br6 br7])
886
887 VSCTL_CHECK_FIND([flood_vlans<2], [br0 br1 br2])
888 VSCTL_CHECK_FIND([flood_vlans<0,2], [br0 br1 br2 br3 br4])
889 VSCTL_CHECK_FIND([flood_vlans>1], [br3 br4 br5 br6 br7])
890 VSCTL_CHECK_FIND([flood_vlans>0,1], [br5 br6 br7])
891 VSCTL_CHECK_FIND([flood_vlans<=2], [br0 br1 br2 br4])
892 VSCTL_CHECK_FIND([flood_vlans<=0,2], [br0 br1 br2 br3 br4 br5])
893 VSCTL_CHECK_FIND([flood_vlans>=1], [br2 br3 br4 br5 br6 br7])
894 VSCTL_CHECK_FIND([flood_vlans>=0,1], [br3 br5 br6 br7])
895
896 # Set relational operators without keys.
897 VSCTL_CHECK_FIND([flood_vlans{=}0], [br1])
898 VSCTL_CHECK_FIND([flood_vlans{=}1], [br2])
899 VSCTL_CHECK_FIND([flood_vlans{=}0,2], [br5])
900 VSCTL_CHECK_FIND([flood_vlans{=}0,1,2], [br7])
901 VSCTL_CHECK_FIND([flood_vlans{=}3], [])
902
903 VSCTL_CHECK_FIND([flood_vlans{!=}0], [br0 br2 br3 br4 br5 br6 br7])
904 VSCTL_CHECK_FIND([flood_vlans{!=}1], [br0 br1 br3 br4 br5 br6 br7])
905 VSCTL_CHECK_FIND([flood_vlans{!=}0,2], [br0 br1 br2 br3 br4 br6 br7])
906 VSCTL_CHECK_FIND([flood_vlans{!=}0,1,2], [br0 br1 br2 br3 br4 br5 br6])
907 VSCTL_CHECK_FIND([flood_vlans{!=}3], [br0 br1 br2 br3 br4 br5 br6 br7])
908
909 VSCTL_CHECK_FIND([flood_vlans{<}[[]]], [])
910 VSCTL_CHECK_FIND([flood_vlans{<=}[[]]], [br0])
911 VSCTL_CHECK_FIND([flood_vlans{<}0], [br0])
912 VSCTL_CHECK_FIND([flood_vlans{<=}0], [br0 br1])
913 VSCTL_CHECK_FIND([flood_vlans{<}1,2], [br0 br2 br4])
914 VSCTL_CHECK_FIND([flood_vlans{<=}1,2], [br0 br2 br4 br6])
915
916 VSCTL_CHECK_FIND([flood_vlans{>}[[]]], [br1 br2 br3 br4 br5 br6 br7])
917 VSCTL_CHECK_FIND([flood_vlans{>=}[[]]], [br0 br1 br2 br3 br4 br5 br6 br7])
918 VSCTL_CHECK_FIND([flood_vlans{>}0], [br3 br5 br7])
919 VSCTL_CHECK_FIND([flood_vlans{>=}0], [br1 br3 br5 br7])
920 VSCTL_CHECK_FIND([flood_vlans{>}0,2], [br7])
921 VSCTL_CHECK_FIND([flood_vlans{>=}1,2], [br6 br7])
922 VSCTL_CHECK_FIND([flood_vlans{>=}0,2], [br5 br7])
923
924 # Arithmetic relational operators with keys.
925 VSCTL_CHECK_FIND([other-config:x=""], [br1])
926 VSCTL_CHECK_FIND([other-config:x=y], [br2])
927 VSCTL_CHECK_FIND([other-config:x=z], [br3])
928
929 VSCTL_CHECK_FIND([other-config:x!=""], [br2 br3])
930 VSCTL_CHECK_FIND([other-config:x!=y], [br1 br3])
931 VSCTL_CHECK_FIND([other-config:x!=z], [br1 br2])
932
933 VSCTL_CHECK_FIND([other-config:x>y], [br3])
934 VSCTL_CHECK_FIND([other-config:x>=y], [br2 br3])
935 VSCTL_CHECK_FIND([other-config:x<y], [br1])
936 VSCTL_CHECK_FIND([other-config:x<=y], [br1 br2])
937
938 # Set relational operators with keys.
939 VSCTL_CHECK_FIND([other-config:x{=}[[]]], [br0 br4 br5 br6 br7])
940 VSCTL_CHECK_FIND([other-config:x{=}""], [br1])
941 VSCTL_CHECK_FIND([other-config:x{=}y], [br2])
942 VSCTL_CHECK_FIND([other-config:x{=}z], [br3])
943
944 VSCTL_CHECK_FIND([other-config:x{!=}[[]]], [br1 br2 br3])
945 VSCTL_CHECK_FIND([other-config:x{!=}""], [br0 br2 br3 br4 br5 br6 br7])
946 VSCTL_CHECK_FIND([other-config:x{!=}y], [br0 br1 br3 br4 br5 br6 br7])
947 VSCTL_CHECK_FIND([other-config:x{!=}z], [br0 br1 br2 br4 br5 br6 br7])
948
949 VSCTL_CHECK_FIND([other-config:x{<=}[[]]], [br0 br4 br5 br6 br7])
950 VSCTL_CHECK_FIND([other-config:x{<=}x], [br0 br4 br5 br6 br7])
951 VSCTL_CHECK_FIND([other-config:x{<=}""], [br0 br1 br4 br5 br6 br7])
952 VSCTL_CHECK_FIND([other-config:x{<=}y], [br0 br2 br4 br5 br6 br7])
953 VSCTL_CHECK_FIND([other-config:x{<=}z], [br0 br3 br4 br5 br6 br7])
954 VSCTL_CHECK_FIND([other-config:x{<=}x,y,z], [br0 br2 br3 br4 br5 br6 br7])
955
956 VSCTL_CHECK_FIND([other-config:x{<}[[]]], [])
957 VSCTL_CHECK_FIND([other-config:x{<}x], [br0 br4 br5 br6 br7])
958 VSCTL_CHECK_FIND([other-config:x{<}""], [br0 br4 br5 br6 br7])
959 VSCTL_CHECK_FIND([other-config:x{<}y], [br0 br4 br5 br6 br7])
960 VSCTL_CHECK_FIND([other-config:x{<}z], [br0 br4 br5 br6 br7])
961
962 VSCTL_CHECK_FIND([other-config:x{>=}[[]]], [br0 br1 br2 br3 br4 br5 br6 br7])
963 VSCTL_CHECK_FIND([other-config:x{>=}x], [])
964 VSCTL_CHECK_FIND([other-config:x{>=}""], [br1])
965 VSCTL_CHECK_FIND([other-config:x{>=}y], [br2])
966 VSCTL_CHECK_FIND([other-config:x{>=}z], [br3])
967
968 VSCTL_CHECK_FIND([other-config:x{>}[[]]], [br1 br2 br3])
969 VSCTL_CHECK_FIND([other-config:x{>}x], [])
970 VSCTL_CHECK_FIND([other-config:x{>}""], [])
971 VSCTL_CHECK_FIND([other-config:x{>}y], [])
972 VSCTL_CHECK_FIND([other-config:x{>}z], [])
973 OVS_VSCTL_CLEANUP
974 AT_CLEANUP
975
976 AT_SETUP([database commands -- wait-until immediately true])
977 AT_KEYWORDS([ovs-vsctl])
978 OVS_VSCTL_SETUP
979 AT_CHECK([RUN_OVS_VSCTL(
980     [add-br br0], 
981     [add-bond br0 bond0 eth0 eth1],
982     [set port bond0 bond_updelay=500 other-config:abc=def])],
983   [0], [], [], [OVS_VSCTL_CLEANUP])
984 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . manager_options=[]]])],
985   [0], [], [], [OVS_VSCTL_CLEANUP])
986 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . bridges!=[]]])],
987   [0], [], [], [OVS_VSCTL_CLEANUP])
988 AT_CHECK([RUN_OVS_VSCTL([[wait-until Port bond0 other-config:abc=def]])],
989   [0], [], [], [OVS_VSCTL_CLEANUP])
990 AT_CHECK([RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' 'other-config:abc>d' 'other-config:abc<e']])],
991   [0], [], [], [OVS_VSCTL_CLEANUP])
992 OVS_VSCTL_CLEANUP
993 AT_CLEANUP
994
995 AT_SETUP([database commands -- wait-until must wait])
996 AT_KEYWORDS([ovs-vsctl])
997
998 OVS_VSCTL_SETUP
999
1000 # Start ovs-vsctls in background.
1001 (RUN_OVS_VSCTL([[wait-until o . bridges!=[] -- get bridge br10 other-config:abc]])) > stdout1 &
1002 (RUN_OVS_VSCTL([[wait-until bridge br1 -- get bridge br1 other-config:abc]])) > stdout2 &
1003 (RUN_OVS_VSCTL([[wait-until b br1 other-config={abc=def} -- get bridge br1 other-config]])) > stdout3 &
1004 (RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' -- get port bond0 bond-updelay]])) > stdout4 &
1005
1006 # Give the ovs-vsctls a chance to read the database
1007 sleep 1
1008
1009 AT_CHECK([RUN_OVS_VSCTL([add-br br10 -- set bridge br10 other-config:abc=quux])
1010 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])],
1011   [0], [], [], [OVS_VSCTL_CLEANUP])
1012
1013 # Wait for the ovs-vsctls to finish.
1014 wait
1015
1016 # Check output
1017 AT_CHECK([cat stdout1], [0], [quux
1018 ], [], [OVS_VSCTL_CLEANUP])
1019 AT_CHECK([cat stdout2], [0], [def
1020 ], [], [OVS_VSCTL_CLEANUP])
1021 AT_CHECK([cat stdout3], [0], [{abc=def}
1022 ], [], [OVS_VSCTL_CLEANUP])
1023 AT_CHECK([cat stdout4], [0], [500
1024 ], [], [OVS_VSCTL_CLEANUP])
1025
1026 OVS_VSCTL_CLEANUP
1027 AT_CLEANUP
1028
1029 AT_SETUP([--id option on create, get commands])
1030 AT_KEYWORDS([ovs-vsctl])
1031 OVS_VSCTL_SETUP
1032 AT_CHECK([RUN_OVS_VSCTL([add-br br0],
1033                         [add-port br0 eth0],
1034                         [add-port br0 eth1])])
1035 AT_CHECK(
1036   [RUN_OVS_VSCTL_TOGETHER(
1037     [set bridge br0 mirrors=@m],
1038     [--id=@eth0 get port eth0],
1039     [--id=@eth1 get port eth1],
1040     [--id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1])],
1041   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1042 AT_CHECK(
1043   [${PERL} $srcdir/uuidfilt.pl stdout], [0], [dnl
1044
1045
1046
1047 <0>
1048 ],
1049   [], [OVS_VSCTL_CLEANUP])
1050 AT_CHECK(
1051   [RUN_OVS_VSCTL(
1052     [list port eth0 eth1],
1053     [list mirror],
1054     [list bridge br0])],
1055   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1056 AT_CHECK(
1057   [sed -n -e '/uuid/p' -e '/name/p' -e '/mirrors/p' -e '/select/p' -e '/output/p' < stdout | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl
1058 [_uuid               : <0>
1059 name                : "eth0"
1060 _uuid               : <1>
1061 name                : "eth1"
1062 _uuid               : <2>
1063 name                : mymirror
1064 output_port         : <1>
1065 output_vlan         : []
1066 select_all          : false
1067 select_dst_port     : [<0>]
1068 select_src_port     : [<0>]
1069 select_vlan         : []
1070 _uuid               : <3>
1071 mirrors             : [<2>]
1072 name                : "br0"
1073 ]],
1074   [], [OVS_VSCTL_CLEANUP])
1075 OVS_VSCTL_CLEANUP
1076 AT_CLEANUP
1077
1078 AT_SETUP([unreferenced record warnings])
1079 AT_KEYWORDS([ovs-vsctl])
1080 OVS_VSCTL_SETUP
1081 AT_CHECK(
1082   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --no-wait -vreconnect:emer --db=unix:socket \
1083      -- create Bridge name=br0 | ${PERL} $srcdir/uuidfilt.pl],
1084   [0], [<0>
1085 ], [vsctl|WARN|applying "create" command to table Bridge without --id option will have no effect
1086 ], [OVS_VSCTL_CLEANUP])
1087 AT_CHECK(
1088   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --no-wait -vreconnect:emer --db=unix:socket \
1089      -- --id=@br0 create Bridge name=br0 | ${PERL} $srcdir/uuidfilt.pl],
1090   [0], [<0>
1091 ], [vsctl|WARN|row id "@br0" was created but no reference to it was inserted, so it will not actually appear in the database
1092 ], [OVS_VSCTL_CLEANUP])
1093 AT_CHECK(
1094   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --no-wait -vreconnect:emer --db=unix:socket \
1095      -- --id=@eth0_iface create Interface name=eth0 \
1096      -- --id=@eth0 create Port name=eth0 interfaces=@eth0_iface \
1097      -- --id=@m0 create Mirror name=m0 output_port=@eth0 \
1098      -- --id=@br0 create Bridge name=br0 mirrors=@m0 \
1099      -- set Open_vSwitch . bridges=@br0 | ${PERL} $srcdir/uuidfilt.pl],
1100   [0], [<0>
1101 <1>
1102 <2>
1103 <3>
1104 ], [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
1105 ], [OVS_VSCTL_CLEANUP])
1106 OVS_VSCTL_CLEANUP
1107 AT_CLEANUP
1108
1109 dnl This test really shows a bug -- "create" followed by "list" in
1110 dnl the same execution shows the wrong UUID on the "list" command.
1111 dnl The bug is documented in ovs-vsctl.8.
1112 AT_SETUP([created row UUID is wrong in same execution])
1113 AT_KEYWORDS([ovs-vsctl])
1114 OVS_VSCTL_SETUP
1115 AT_CHECK([RUN_OVS_VSCTL([--id=@br0 create Bridge name=br0 -- add Open_vSwitch . bridges @br0 -- list b])],
1116   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1117 AT_CHECK([${PERL} $srcdir/uuidfilt.pl stdout], [0], 
1118   [[<0>
1119 _uuid               : <1>
1120 controller          : []
1121 datapath_id         : []
1122 datapath_type       : ""
1123 external_ids        : {}
1124 fail_mode           : []
1125 flood_vlans         : []
1126 flow_tables         : {}
1127 ipfix               : []
1128 mirrors             : []
1129 name                : "br0"
1130 netflow             : []
1131 other_config        : {}
1132 ports               : []
1133 protocols           : []
1134 sflow               : []
1135 status              : {}
1136 stp_enable          : false
1137 ]], [ignore], [test ! -e pid || kill `cat pid`])
1138 OVS_VSCTL_CLEANUP
1139 AT_CLEANUP
1140
1141 dnl This test will create a linux-htb QoS record that
1142 dnl points to a few queues and use it on a1 and a2 port.
1143 dnl It also destroys all records from Qos and Queue table.
1144 AT_SETUP([--all option on destroy command])
1145 AT_KEYWORDS([ovs-vsctl])
1146 OVS_VSCTL_SETUP
1147 AT_CHECK([RUN_OVS_VSCTL(
1148    [add-br a],
1149    [add-port a a1],
1150    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
1151 CHECK_BRIDGES([a, a, 0])
1152 CHECK_PORTS([a], [a1], [a2])
1153 CHECK_IFACES([a], [a1], [a2])
1154 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
1155    [set Port a1 qos=@newqos],
1156    [set Port a2 qos=@newqos],
1157    [--id=@newqos create QoS type=linux-htb other-config:max-rate=1000000000 queues=0=@q0,1=@q1],
1158    [--id=@q0 create Queue other-config:min-rate=100000000 other-config:max-rate=100000000],
1159    [--id=@q1 create Queue other-config:min-rate=500000000])], [0], [ignore], [], [OVS_VSCTL_CLEANUP])
1160 AT_CHECK([RUN_OVS_VSCTL(
1161    [--columns=other_config,type list Qos])], [0],
1162 [other_config        : {max-rate="1000000000"}
1163 type                : linux-htb
1164 ], [], [OVS_VSCTL_CLEANUP])
1165 AT_CHECK([RUN_OVS_VSCTL(
1166    [--columns=other_config list Queue | sort | xargs echo])], [0],
1167 [other_config : {max-rate=100000000, min-rate=100000000} other_config : {min-rate=500000000}
1168 ], [], [OVS_VSCTL_CLEANUP])
1169 AT_CHECK([RUN_OVS_VSCTL(
1170    [clear Port a1 qos],
1171    [clear Port a2 qos])], [0], [], [], [OVS_VSCTL_CLEANUP])
1172 AT_CHECK([RUN_OVS_VSCTL(
1173    [--columns=qos list Port a1 a2])], [0],
1174 [[qos                 : []
1175
1176 qos                 : []
1177 ]], [], [OVS_VSCTL_CLEANUP])
1178 AT_CHECK([RUN_OVS_VSCTL(
1179    [--all destroy Qos])], [0], [], [], [OVS_VSCTL_CLEANUP])
1180 AT_CHECK([RUN_OVS_VSCTL(
1181    [-- list Qos])], [0], [], [], [OVS_VSCTL_CLEANUP])
1182 AT_CHECK([RUN_OVS_VSCTL(
1183    [--all destroy Queue])], [0], [], [], [OVS_VSCTL_CLEANUP])
1184 AT_CHECK([RUN_OVS_VSCTL(
1185    [-- list Queue])], [0], [], [], [OVS_VSCTL_CLEANUP])
1186 OVS_VSCTL_CLEANUP
1187 AT_CLEANUP