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