ovs-vsctl: Add new "find" command.
[cascardo/ovs.git] / tests / ovs-vsctl.at
1 dnl OVS_VSCTL_SETUP
2 dnl
3 dnl Creates an empty database in the current directory and then starts
4 dnl an ovsdb-server on it for ovs-vsctl to connect to.
5 m4_define([OVS_VSCTL_SETUP],
6   [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, add-port a a1, add-port a a2])
194 AT_KEYWORDS([ovs-vsctl])
195 OVS_VSCTL_SETUP
196 AT_CHECK([RUN_OVS_VSCTL(
197    [add-br a],
198    [--if-exists del-br b],
199    [add-port a a1],
200    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
201 CHECK_BRIDGES([a, a, 0])
202 CHECK_PORTS([a], [a1], [a2])
203 CHECK_IFACES([a], [a1], [a2])
204 OVS_VSCTL_CLEANUP
205 AT_CLEANUP
206
207 AT_SETUP([add-br a, add-port a a1, add-port a a1])
208 AT_KEYWORDS([ovs-vsctl])
209 OVS_VSCTL_SETUP
210 AT_CHECK([RUN_OVS_VSCTL(
211    [add-br a], 
212    [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
213 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
214   [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
215 ], [OVS_VSCTL_CLEANUP])
216 OVS_VSCTL_CLEANUP
217 AT_CLEANUP
218
219 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
220 AT_KEYWORDS([ovs-vsctl])
221 OVS_VSCTL_SETUP
222 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
223    [add-br a], 
224    [add-br b], 
225    [add-port a a1],
226    [add-port b b1],
227    [--if-exists del-port b b2],
228    [del-br a])], [0], [
229
230
231
232
233
234 ], [], [OVS_VSCTL_CLEANUP])
235 CHECK_BRIDGES([b, b, 0])
236 CHECK_PORTS([b], [b1])
237 CHECK_IFACES([b], [b1])
238 OVS_VSCTL_CLEANUP
239 AT_CLEANUP
240
241 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
242 AT_KEYWORDS([ovs-vsctl])
243 OVS_VSCTL_SETUP
244 AT_CHECK([RUN_OVS_VSCTL(
245    [add-br a], 
246    [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
247 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a3 a1 a2])], [0], [], [],
248   [OVS_VSCTL_CLEANUP])
249 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a2 a1])], [1], [], 
250   [ovs-vsctl: "--may-exist add-bond a bond0 a2 a1" but bond0 actually has interface(s) a1, a2, a3
251 ],
252   [OVS_VSCTL_CLEANUP])
253 CHECK_BRIDGES([a, a, 0])
254 CHECK_PORTS([a], [bond0])
255 CHECK_IFACES([a], [a1], [a2], [a3])
256 OVS_VSCTL_CLEANUP
257 AT_CLEANUP
258
259 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
260 AT_KEYWORDS([ovs-vsctl])
261 OVS_VSCTL_SETUP
262 AT_CHECK([RUN_OVS_VSCTL(
263   [add-br a], 
264   [add-br b], 
265   [add-port a a1 tag=9],
266   [get port a1 tag],
267   [--may-exist add-port b b1],
268   [del-port a a1])], [0], [9
269 ], [], [OVS_VSCTL_CLEANUP])
270 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port b b1])], [0], [], [],
271   [OVS_VSCTL_CLEANUP])
272 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [], 
273   [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b
274 ],
275   [OVS_VSCTL_CLEANUP])
276 CHECK_BRIDGES([a, a, 0], [b, b, 0])
277 CHECK_PORTS([a])
278 CHECK_IFACES([a])
279 CHECK_PORTS([b], [b1])
280 CHECK_IFACES([b], [b1])
281 OVS_VSCTL_CLEANUP
282 AT_CLEANUP
283
284 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
285 AT_KEYWORDS([ovs-vsctl])
286 OVS_VSCTL_SETUP
287 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
288   [add-br a], 
289   [add-bond a bond0 a1 a2 a3 tag=9],
290   [get Port bond0 tag],
291   [del-port bond0])], [0], [
292
293 9
294
295 ], [], [OVS_VSCTL_CLEANUP])
296 CHECK_BRIDGES([a, a, 0])
297 CHECK_PORTS([a])
298 OVS_VSCTL_CLEANUP
299 AT_CLEANUP
300
301 AT_SETUP([external IDs])
302 AT_KEYWORDS([ovs-vsctl])
303 OVS_VSCTL_SETUP
304 AT_CHECK([RUN_OVS_VSCTL_ONELINE(
305   [add-br a], 
306   [add-port a a1],
307   [add-bond a bond0 a2 a3],
308   [br-set-external-id a key0 value0],
309   [set port a1 external-ids:key1=value1],
310   [set interface a2 external-ids:key2=value2],
311   [set interface a2 external-ids:key3=value3],
312   [set interface a3 external-ids:key4=value4],
313   [br-get-external-id a],
314   [br-get-external-id a key0],
315   [br-get-external-id a key1],
316   [br-set-external-id a key0 othervalue],
317   [br-get-external-id a],
318   [br-set-external-id a key0],
319   [br-get-external-id a],
320   [get port a1 external-ids],
321   [get interface a2 external-ids],
322   [get interface a3 external-ids])], [0], [
323
324
325
326
327
328
329
330 key0=value0
331 value0
332
333
334 key0=othervalue
335
336
337 {"key1"="value1"}
338 {"key2"="value2", "key3"="value3"}
339 {"key4"="value4"}
340 ], [], [OVS_VSCTL_CLEANUP])
341 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
342   [br-get-external-id a],
343   [get port a1 external-ids],
344   [get interface a2 external-ids],
345   [get interface a3 external-ids])], [0],
346 [
347 {"key1"="value1"}
348 {"key2"="value2", "key3"="value3"}
349 {"key4"="value4"}
350 ], [], [OVS_VSCTL_CLEANUP])
351 CHECK_BRIDGES([a, a, 0])
352 CHECK_PORTS([a], [a1], [bond0])
353 CHECK_IFACES([a], [a1], [a2], [a3])
354 OVS_VSCTL_CLEANUP
355 AT_CLEANUP
356
357 AT_SETUP([controllers])
358 AT_KEYWORDS([controller ovs-vsctl])
359 OVS_VSCTL_SETUP
360 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
361   [add-br br0], 
362
363   [get-controller br0],
364   [set-controller br0 tcp:4.5.6.7],
365   [get-controller br0],
366
367   [del-controller br0],
368   [get-controller br0],
369
370   [set-controller br0 tcp:8.9.10.11 tcp:5.4.3.2],
371   [get-controller br0])], [0], [
372
373
374 tcp:4.5.6.7
375
376
377
378 tcp:5.4.3.2\ntcp:8.9.10.11
379 ], [], [OVS_VSCTL_CLEANUP])
380 OVS_VSCTL_CLEANUP
381 AT_CLEANUP
382
383 dnl ----------------------------------------------------------------------
384 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
385
386 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
387   [AT_CHECK(
388      [RUN_OVS_VSCTL(
389         [add-br xenbr0],
390         [--may-exist add-br xenbr0],
391         [add-port xenbr0 eth0],
392         [--may-exist add-port xenbr0 eth0],
393         [add-br xapi1 xenbr0 9],
394         [--may-exist add-br xapi1 xenbr0 9],
395         [add-port xapi1 eth0.9])],
396      [0], [], [], [OVS_VSCTL_CLEANUP])])
397
398 AT_SETUP([simple fake bridge])
399 AT_KEYWORDS([ovs-vsctl fake-bridge])
400 OVS_VSCTL_SETUP
401 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
402 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
403   [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN 9
404 ], [OVS_VSCTL_CLEANUP])
405 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx 9])], [1], [],
406   [ovs-vsctl: "--may-exist add-br xapi1 xxx 9" but xapi1 has the wrong parent xenbr0
407 ], [OVS_VSCTL_CLEANUP])
408 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
409   [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN 9
410 ], [OVS_VSCTL_CLEANUP])
411 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
412 CHECK_PORTS([xenbr0], [eth0])
413 CHECK_IFACES([xenbr0], [eth0])
414 CHECK_PORTS([xapi1], [eth0.9])
415 CHECK_IFACES([xapi1], [eth0.9])
416 OVS_VSCTL_CLEANUP
417 AT_CLEANUP
418
419 AT_SETUP([simple fake bridge + del-br fake bridge])
420 AT_KEYWORDS([ovs-vsctl fake-bridge])
421 OVS_VSCTL_SETUP
422 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
423 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
424 CHECK_BRIDGES([xenbr0, xenbr0, 0])
425 CHECK_PORTS([xenbr0], [eth0])
426 CHECK_IFACES([xenbr0], [eth0])
427 OVS_VSCTL_CLEANUP
428 AT_CLEANUP
429
430 AT_SETUP([simple fake bridge + del-br real bridge])
431 AT_KEYWORDS([ovs-vsctl fake-bridge])
432 OVS_VSCTL_SETUP
433 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
434 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
435 CHECK_BRIDGES
436 OVS_VSCTL_CLEANUP
437 AT_CLEANUP
438
439 AT_SETUP([simple fake bridge + external IDs])
440 AT_KEYWORDS([ovs-vsctl fake-bridge])
441 OVS_VSCTL_SETUP
442 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
443 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
444   [br-set-external-id xenbr0 key0 value0],
445   [br-set-external-id xapi1 key1 value1],
446   [br-get-external-id xenbr0],
447   [br-get-external-id xenbr0 key0],
448   [br-get-external-id xapi1],
449   [br-get-external-id xapi1 key1])], [0], [
450
451 key0=value0
452 value0
453 key1=value1
454 value1
455 ], [], [OVS_VSCTL_CLEANUP])
456 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
457 CHECK_PORTS([xenbr0], [eth0])
458 CHECK_IFACES([xenbr0], [eth0])
459 CHECK_PORTS([xapi1], [eth0.9])
460 CHECK_IFACES([xapi1], [eth0.9])
461 OVS_VSCTL_CLEANUP
462 AT_CLEANUP
463
464 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
465   [AT_CHECK(
466      [RUN_OVS_VSCTL(
467         [add-br xapi1],
468         [add-bond xapi1 bond0 eth0 eth1],
469         [add-br xapi2 xapi1 11],
470         [add-port xapi2 bond0.11])],
471      [0], [], [], [OVS_VSCTL_CLEANUP])])
472
473 AT_SETUP([fake bridge on bond])
474 AT_KEYWORDS([ovs-vsctl fake-bridge])
475 OVS_VSCTL_SETUP
476 OVS_VSCTL_SETUP_BOND_FAKE_CONF
477 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
478 CHECK_PORTS([xapi1], [bond0])
479 CHECK_IFACES([xapi1], [eth0], [eth1])
480 CHECK_PORTS([xapi2], [bond0.11])
481 CHECK_IFACES([xapi2], [bond0.11])
482 OVS_VSCTL_CLEANUP
483 AT_CLEANUP
484
485 AT_SETUP([fake bridge on bond + del-br fake bridge])
486 AT_KEYWORDS([ovs-vsctl fake-bridge])
487 OVS_VSCTL_SETUP
488 OVS_VSCTL_SETUP_BOND_FAKE_CONF
489 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
490 ], [], [OVS_VSCTL_CLEANUP])
491 CHECK_BRIDGES([xapi1, xapi1, 0])
492 CHECK_PORTS([xapi1], [bond0])
493 CHECK_IFACES([xapi1], [eth0], [eth1])
494 OVS_VSCTL_CLEANUP
495 AT_CLEANUP
496
497 AT_SETUP([fake bridge on bond + del-br real bridge])
498 AT_KEYWORDS([ovs-vsctl fake-bridge])
499 OVS_VSCTL_SETUP
500 OVS_VSCTL_SETUP_BOND_FAKE_CONF
501 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
502 CHECK_BRIDGES
503 OVS_VSCTL_CLEANUP
504 AT_CLEANUP
505
506 dnl ----------------------------------------------------------------------
507 AT_BANNER([ovs-vsctl unit tests -- manager commands])
508
509 AT_SETUP([managers])
510 AT_KEYWORDS([manager ovs-vsctl])
511 OVS_VSCTL_SETUP
512 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
513   [del-manager],
514   [get-manager],
515   [set-manager tcp:4.5.6.7],
516   [get-manager],
517   [set-manager tcp:8.9.10.11 tcp:5.4.3.2],
518   [get-manager],
519   [del-manager],
520   [get-manager])], [0], [
521
522
523 tcp:4.5.6.7
524
525 tcp:5.4.3.2\ntcp:8.9.10.11
526
527
528 ], [], [OVS_VSCTL_CLEANUP])
529 OVS_VSCTL_CLEANUP
530 AT_CLEANUP
531
532 dnl ----------------------------------------------------------------------
533 AT_BANNER([ovs-vsctl unit tests -- database commands])
534
535 AT_SETUP([database commands -- positive checks])
536 AT_KEYWORDS([ovs-vsctl])
537 OVS_VSCTL_SETUP
538 AT_CHECK([RUN_OVS_VSCTL([create b name=br0])], 
539   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
540 cp stdout out1
541 AT_CHECK([RUN_OVS_VSCTL([list b], [get b br0 _uuid])], 
542   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
543 cp stdout out2
544 AT_CHECK([perl $srcdir/uuidfilt.pl out1 out2], [0], 
545   [[<0>
546 _uuid               : <0>
547 controller          : []
548 datapath_id         : []
549 datapath_type       : ""
550 external_ids        : {}
551 fail_mode           : []
552 flood_vlans         : []
553 mirrors             : []
554 name                : "br0"
555 netflow             : []
556 other_config        : {}
557 ports               : []
558 sflow               : []
559 <0>
560 ]], [ignore], [test ! -e pid || kill `cat pid`])
561 AT_CHECK(
562   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type list b])],
563   [0],
564   [[fail_mode           : []
565 name                : "br0"
566 datapath_type       : ""
567 ]], [ignore], [test ! -e pid || kill `cat pid`])
568 AT_CHECK(
569   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type find b])],
570   [0],
571   [[fail_mode           : []
572 name                : "br0"
573 datapath_type       : ""
574 ]], [ignore], [test ! -e pid || kill `cat pid`])
575 AT_CHECK([RUN_OVS_VSCTL([create b name=br1 datapath_type="foo"],
576                         [create b name=br2 external-ids:bar=quux])],
577   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
578 AT_CHECK(
579   [RUN_OVS_VSCTL([--columns=name find b datapath_type!=foo])], [0], [stdout],
580   [ignore], [test ! -e pid || kill `cat pid`])
581 AT_CHECK([sed -n '/./p' stdout | sort], [0],
582   [[name                : "br0"
583 name                : "br2"
584 ]])
585 AT_CHECK(
586   [RUN_OVS_VSCTL(
587     [set bridge br0 \
588       'other_config:datapath_id="0123456789ab"' \
589       'other_config:hwaddr="00:11:22:33:44:55"' \
590       'external-ids={"uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
591      add bridge br0 external_ids '"roles"="local; remote; cloud"'])], 
592   [0], [], [], [OVS_VSCTL_CLEANUP])
593 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])], 
594   [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{roles="local; remote; cloud", uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
595 ], [], [OVS_VSCTL_CLEANUP])
596 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])], 
597   [0], ["00:11:22:33:44:55"
598
599 ], [], [OVS_VSCTL_CLEANUP])
600 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])], 
601   [0], [{datapath_id="0123456789ab"}
602 ], [], [OVS_VSCTL_CLEANUP])
603 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])], 
604   [0], [{}
605 ], [], [OVS_VSCTL_CLEANUP])
606 AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])], 
607   [0], [{}
608 ], [], [OVS_VSCTL_CLEANUP])
609 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([destroy b br0],
610                                  [destroy b br1],
611                                  [destroy b br2])],
612   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
613 AT_CHECK([RUN_OVS_VSCTL([list b])], 
614   [0], [], [], [OVS_VSCTL_CLEANUP])
615 OVS_VSCTL_CLEANUP
616 AT_CLEANUP
617
618 AT_SETUP([database commands -- negative checks])
619 AT_KEYWORDS([ovs-vsctl])
620 OVS_VSCTL_SETUP
621 AT_CHECK([RUN_OVS_VSCTL([create b name=br0])], 
622   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
623 AT_CHECK([RUN_OVS_VSCTL([add-br br1])], 
624   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
625 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])], 
626   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
627 AT_CHECK([RUN_OVS_VSCTL([create n targets='"1.2.3.4:567"'])], 
628   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
629 cp stdout netflow-uuid
630 AT_CHECK([RUN_OVS_VSCTL([list n `cat netflow-uuid`])],
631   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
632 AT_CHECK([perl $srcdir/uuidfilt.pl netflow-uuid stdout], [0], 
633   [[<0>
634 _uuid               : <0>
635 active_timeout      : 0
636 add_id_to_interface : false
637 engine_id           : []
638 engine_type         : []
639 external_ids        : {}
640 targets             : ["1.2.3.4:567"]
641 ]], [ignore], [test ! -e pid || kill `cat pid`])
642 AT_CHECK([RUN_OVS_VSCTL([list interx x])], 
643   [1], [], [ovs-vsctl: unknown table "interx"
644 ], [OVS_VSCTL_CLEANUP])
645 AT_CHECK([RUN_OVS_VSCTL([list b x])], 
646   [1], [], [ovs-vsctl: no row "x" in table Bridge
647 ], [OVS_VSCTL_CLEANUP])
648 AT_CHECK([RUN_OVS_VSCTL([get b br0 d])], 
649   [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
650 ], [OVS_VSCTL_CLEANUP])
651 AT_CHECK([RUN_OVS_VSCTL([get b br0 x])], 
652   [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
653 ], [OVS_VSCTL_CLEANUP])
654 AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])], 
655   [1], [], [ovs-vsctl: :y=z: missing column name
656 ], [OVS_VSCTL_CLEANUP])
657 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])], 
658   [1], [], [ovs-vsctl: datapath_id:y=z: trailing garbage "=z" in argument
659 ], [OVS_VSCTL_CLEANUP])
660 AT_CHECK([RUN_OVS_VSCTL([set b br0 'datapath_id:y>=z'])], 
661   [1], [], [ovs-vsctl: datapath_id:y>=z: argument does not end in "=" followed by a value.
662 ], [OVS_VSCTL_CLEANUP])
663 AT_CHECK([RUN_OVS_VSCTL([wait-until b br0 datapath_id:y,z])], 
664   [1], [], [ovs-vsctl: datapath_id:y,z: argument does not end in "=", "!=", "<", ">", "<=", or ">=" followed by a value.
665 ], [OVS_VSCTL_CLEANUP])
666 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])], 
667   [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
668 ], [OVS_VSCTL_CLEANUP])
669 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])], 
670   [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
671 ], [OVS_VSCTL_CLEANUP])
672 AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])], 
673   [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
674 ], [OVS_VSCTL_CLEANUP])
675 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])], 
676   [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
677 ], [OVS_VSCTL_CLEANUP])
678 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])], 
679   [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
680 ], [OVS_VSCTL_CLEANUP])
681 AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])], 
682   [1], [], [[ovs-vsctl: constraint violation: xyz is not one of the allowed values ([in-band, out-of-band])
683 ]], [OVS_VSCTL_CLEANUP])
684 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])], 
685   [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
686 ], [OVS_VSCTL_CLEANUP])
687 AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])], 
688   [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
689 ], [OVS_VSCTL_CLEANUP])
690 AT_CHECK([RUN_OVS_VSCTL([remove n `cat netflow-uuid` targets '"1.2.3.4:567"'])], 
691   [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimum number is 1
692 ], [OVS_VSCTL_CLEANUP])
693 AT_CHECK([RUN_OVS_VSCTL([clear n `cat netflow-uuid` targets])], 
694   [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
695 ], [OVS_VSCTL_CLEANUP])
696 AT_CHECK([RUN_OVS_VSCTL([destroy b br2])], 
697   [1], [], [ovs-vsctl: no row "br2" in table Bridge
698 ], [OVS_VSCTL_CLEANUP])
699 OVS_VSCTL_CLEANUP
700 AT_CLEANUP
701
702 AT_SETUP([database commands -- wait-until immediately true])
703 AT_KEYWORDS([ovs-vsctl])
704 OVS_VSCTL_SETUP
705 AT_CHECK([RUN_OVS_VSCTL(
706     [add-br br0], 
707     [add-bond br0 bond0 eth0 eth1],
708     [set port bond0 bond_updelay=500 other-config:abc=def])],
709   [0], [], [], [OVS_VSCTL_CLEANUP])
710 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . managers=[]]])],
711   [0], [], [], [OVS_VSCTL_CLEANUP])
712 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . bridges!=[]]])],
713   [0], [], [], [OVS_VSCTL_CLEANUP])
714 AT_CHECK([RUN_OVS_VSCTL([[wait-until Port bond0 other-config:abc=def]])],
715   [0], [], [], [OVS_VSCTL_CLEANUP])
716 AT_CHECK([RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' 'other-config:abc>d' 'other-config:abc<e']])],
717   [0], [], [], [OVS_VSCTL_CLEANUP])
718 OVS_VSCTL_CLEANUP
719 AT_CLEANUP
720
721 AT_SETUP([database commands -- wait-until must wait])
722 AT_KEYWORDS([ovs-vsctl])
723
724 # Disable lcov for this test.  All the programs running in parallel
725 # race badly on access to profiling data.
726 DISABLE_LCOV=true
727 export DISABLE_LCOV
728
729 OVS_VSCTL_SETUP
730
731 # Start ovs-vsctls in background.
732 (RUN_OVS_VSCTL([[wait-until o . bridges!=[] -- get bridge br10 other-config:abc]])) > stdout1 &
733 (RUN_OVS_VSCTL([[wait-until bridge br1 -- get bridge br1 other-config:abc]])) > stdout2 &
734 (RUN_OVS_VSCTL([[wait-until b br1 other-config={abc=def} -- get bridge br1 other-config]])) > stdout3 &
735 (RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' -- get port bond0 bond-updelay]])) > stdout4 &
736
737 # Give the ovs-vsctls a chance to read the database
738 sleep 1
739
740 AT_CHECK([RUN_OVS_VSCTL([add-br br10 -- set bridge br10 other-config:abc=quux])
741 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])],
742   [0], [], [], [OVS_VSCTL_CLEANUP])
743
744 # Wait for the ovs-vsctls to finish.
745 wait
746
747 # Check output
748 AT_CHECK([cat stdout1], [0], [quux
749 ], [], [OVS_VSCTL_CLEANUP])
750 AT_CHECK([cat stdout2], [0], [def
751 ], [], [OVS_VSCTL_CLEANUP])
752 AT_CHECK([cat stdout3], [0], [{abc=def}
753 ], [], [OVS_VSCTL_CLEANUP])
754 AT_CHECK([cat stdout4], [0], [500
755 ], [], [OVS_VSCTL_CLEANUP])
756
757 OVS_VSCTL_CLEANUP
758 AT_CLEANUP
759
760 AT_SETUP([--id option on create, get commands])
761 AT_KEYWORDS([ovs-vsctl])
762 OVS_VSCTL_SETUP
763 AT_CHECK([RUN_OVS_VSCTL([add-br br0],
764                         [add-port br0 eth0],
765                         [add-port br0 eth1])])
766 AT_CHECK(
767   [RUN_OVS_VSCTL_TOGETHER(
768     [set bridge br0 mirrors=@m],
769     [--id=@eth0 get port eth0],
770     [--id=@eth1 get port eth1],
771     [--id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1])],
772   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
773 AT_CHECK(
774   [perl $srcdir/uuidfilt.pl stdout], [0], [dnl
775
776
777
778 <0>
779 ],
780   [], [OVS_VSCTL_CLEANUP])
781 AT_CHECK(
782   [RUN_OVS_VSCTL(
783     [list port eth0 eth1],
784     [list mirror],
785     [list bridge br0])],
786   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
787 AT_CHECK(
788   [sed -n -e '/uuid/p' -e '/name/p' -e '/mirrors/p' -e '/select/p' -e '/output/p' < stdout | $srcdir/uuidfilt.pl], [0], [dnl
789 [_uuid               : <0>
790 name                : "eth0"
791 _uuid               : <1>
792 name                : "eth1"
793 _uuid               : <2>
794 name                : mymirror
795 output_port         : <1>
796 output_vlan         : []
797 select_all          : false
798 select_dst_port     : [<0>]
799 select_src_port     : [<0>]
800 select_vlan         : []
801 _uuid               : <3>
802 mirrors             : [<2>]
803 name                : "br0"
804 ]],
805   [], [OVS_VSCTL_CLEANUP])
806 OVS_VSCTL_CLEANUP
807 AT_CLEANUP
808
809 dnl This test really shows a bug -- "create" followed by "list" in
810 dnl the same execution shows the wrong UUID on the "list" command.
811 dnl The bug is documented in ovs-vsctl.8.
812 AT_SETUP([created row UUID is wrong in same execution])
813 AT_KEYWORDS([ovs-vsctl])
814 OVS_VSCTL_SETUP
815 AT_CHECK([RUN_OVS_VSCTL([create Bridge name=br0 -- list b])], 
816   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
817 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], 
818   [[<0>
819 _uuid               : <1>
820 controller          : []
821 datapath_id         : []
822 datapath_type       : ""
823 external_ids        : {}
824 fail_mode           : []
825 flood_vlans         : []
826 mirrors             : []
827 name                : "br0"
828 netflow             : []
829 other_config        : {}
830 ports               : []
831 sflow               : []
832 ]], [ignore], [test ! -e pid || kill `cat pid`])
833 OVS_VSCTL_CLEANUP
834 AT_CLEANUP