ovs-vsctl.at: Fix intermittent failure.
[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 --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([del-port a])], [1], [],
327   [ovs-vsctl: cannot delete port a because it is the local port for bridge a (deleting this port requires deleting the entire bridge)
328 ],
329   [OVS_VSCTL_CLEANUP])
330 AT_CHECK([RUN_OVS_VSCTL([--if-exists del-port a])], [0], [], [],
331   [OVS_VSCTL_CLEANUP])
332 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [],
333   [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b
334 ],
335   [OVS_VSCTL_CLEANUP])
336 CHECK_BRIDGES([a, a, 0], [b, b, 0])
337 CHECK_PORTS([a])
338 CHECK_IFACES([a])
339 CHECK_PORTS([b], [b1])
340 CHECK_IFACES([b], [b1])
341 OVS_VSCTL_CLEANUP
342 AT_CLEANUP
343
344 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
345 AT_KEYWORDS([ovs-vsctl])
346 OVS_VSCTL_SETUP
347 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
348   [add-br a],
349   [add-bond a bond0 a1 a2 a3 tag=9],
350   [get Port bond0 tag],
351   [del-port bond0])], [0], [
352
353 9
354
355 ], [], [OVS_VSCTL_CLEANUP])
356 CHECK_BRIDGES([a, a, 0])
357 CHECK_PORTS([a])
358 OVS_VSCTL_CLEANUP
359 AT_CLEANUP
360
361 AT_SETUP([external IDs])
362 AT_KEYWORDS([ovs-vsctl])
363 OVS_VSCTL_SETUP
364 AT_CHECK([RUN_OVS_VSCTL_ONELINE(
365   [add-br a],
366   [add-port a a1],
367   [add-bond a bond0 a2 a3],
368   [br-set-external-id a key0 value0],
369   [set port a1 external-ids:key1=value1],
370   [set interface a2 external-ids:key2=value2],
371   [set interface a2 external-ids:key3=value3],
372   [set interface a3 external-ids:key4=value4],
373   [br-get-external-id a],
374   [br-get-external-id a key0],
375   [br-get-external-id a key1],
376   [br-set-external-id a key0 othervalue],
377   [br-get-external-id a],
378   [br-set-external-id a key0],
379   [br-get-external-id a],
380   [get port a1 external-ids],
381   [get interface a2 external-ids],
382   [get interface a3 external-ids])], [0], [
383
384
385
386
387
388
389
390 key0=value0
391 value0
392
393
394 key0=othervalue
395
396
397 {"key1"="value1"}
398 {"key2"="value2", "key3"="value3"}
399 {"key4"="value4"}
400 ], [], [OVS_VSCTL_CLEANUP])
401 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
402   [br-get-external-id a],
403   [get port a1 external-ids],
404   [get interface a2 external-ids],
405   [get interface a3 external-ids])], [0],
406 [
407 {"key1"="value1"}
408 {"key2"="value2", "key3"="value3"}
409 {"key4"="value4"}
410 ], [], [OVS_VSCTL_CLEANUP])
411 CHECK_BRIDGES([a, a, 0])
412 CHECK_PORTS([a], [a1], [bond0])
413 CHECK_IFACES([a], [a1], [a2], [a3])
414 OVS_VSCTL_CLEANUP
415 AT_CLEANUP
416
417 AT_SETUP([controllers])
418 AT_KEYWORDS([controller ovs-vsctl])
419 OVS_VSCTL_SETUP
420 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
421   [add-br br0],
422
423   [get-controller br0],
424   [set-controller br0 tcp:4.5.6.7],
425   [get-controller br0],
426
427   [del-controller br0],
428   [get-controller br0],
429
430   [set-controller br0 tcp:8.9.10.11 tcp:5.4.3.2],
431   [get-controller br0])], [0], [
432
433
434 tcp:4.5.6.7
435
436
437
438 tcp:5.4.3.2\ntcp:8.9.10.11
439 ], [], [OVS_VSCTL_CLEANUP])
440 OVS_VSCTL_CLEANUP
441 AT_CLEANUP
442
443 dnl ----------------------------------------------------------------------
444 dnl OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([VLAN])
445 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
446   [AT_CHECK(
447      [RUN_OVS_VSCTL(
448         [add-br xenbr0],
449         [--may-exist add-br xenbr0],
450         [add-port xenbr0 eth0],
451         [--may-exist add-port xenbr0 eth0],
452         [add-br xapi1 xenbr0 $1],
453         [--may-exist add-br xapi1 xenbr0 $1],
454         [add-port xapi1 eth0.$1])],
455      [0], [], [], [OVS_VSCTL_CLEANUP])])
456
457 dnl OVS_VSCTL_FAKE_BRIDGE_TESTS([VLAN])
458 m4_define([OVS_VSCTL_FAKE_BRIDGE_TESTS], [
459 AT_BANNER([ovs-vsctl unit tests -- fake bridges (VLAN $1)])
460
461 AT_SETUP([simple fake bridge (VLAN $1)])
462 AT_KEYWORDS([ovs-vsctl fake-bridge])
463 OVS_VSCTL_SETUP
464 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
465 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
466   [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN $1
467 ], [OVS_VSCTL_CLEANUP])
468 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx $1])], [1], [],
469   [ovs-vsctl: "--may-exist add-br xapi1 xxx $1" but xapi1 has the wrong parent xenbr0
470 ], [OVS_VSCTL_CLEANUP])
471 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
472   [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN $1
473 ], [OVS_VSCTL_CLEANUP])
474 CHECK_BRIDGES([xapi1, xenbr0, $1], [xenbr0, xenbr0, 0])
475 CHECK_PORTS([xenbr0], [eth0])
476 CHECK_IFACES([xenbr0], [eth0])
477 CHECK_PORTS([xapi1], [eth0.$1])
478 CHECK_IFACES([xapi1], [eth0.$1])
479 OVS_VSCTL_CLEANUP
480 AT_CLEANUP
481
482 AT_SETUP([list bridges -- real and fake (VLAN $1)])
483 AT_KEYWORDS([ovs-vsctl fake-bridge])
484 OVS_VSCTL_SETUP
485 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
486 AT_CHECK([RUN_OVS_VSCTL_ONELINE([-- list-br])], [0],
487   [xapi1\nxenbr0
488 ], [], [OVS_VSCTL_CLEANUP])
489 AT_CHECK([RUN_OVS_VSCTL_ONELINE([-- --real list-br])], [0],
490   [xenbr0
491 ], [], [OVS_VSCTL_CLEANUP])
492 AT_CHECK([RUN_OVS_VSCTL_ONELINE([-- --fake list-br])], [0],
493   [xapi1
494 ], [], [OVS_VSCTL_CLEANUP])
495 OVS_VSCTL_CLEANUP
496 AT_CLEANUP
497
498 AT_SETUP([simple fake bridge + del-br fake bridge (VLAN $1)])
499 AT_KEYWORDS([ovs-vsctl fake-bridge])
500 OVS_VSCTL_SETUP
501 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
502 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
503 CHECK_BRIDGES([xenbr0, xenbr0, 0])
504 CHECK_PORTS([xenbr0], [eth0])
505 CHECK_IFACES([xenbr0], [eth0])
506 OVS_VSCTL_CLEANUP
507 AT_CLEANUP
508
509 AT_SETUP([simple fake bridge + del-br real bridge (VLAN $1)])
510 AT_KEYWORDS([ovs-vsctl fake-bridge])
511 OVS_VSCTL_SETUP
512 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
513 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
514 CHECK_BRIDGES
515 OVS_VSCTL_CLEANUP
516 AT_CLEANUP
517
518 AT_SETUP([simple fake bridge + external IDs (VLAN $1)])
519 AT_KEYWORDS([ovs-vsctl fake-bridge])
520 OVS_VSCTL_SETUP
521 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF([$1])
522 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
523   [br-set-external-id xenbr0 key0 value0],
524   [br-set-external-id xapi1 key1 value1],
525   [br-get-external-id xenbr0],
526   [br-get-external-id xenbr0 key0],
527   [br-get-external-id xapi1],
528   [br-get-external-id xapi1 key1])], [0], [
529
530 key0=value0
531 value0
532 key1=value1
533 value1
534 ], [], [OVS_VSCTL_CLEANUP])
535 CHECK_BRIDGES([xapi1, xenbr0, $1], [xenbr0, xenbr0, 0])
536 CHECK_PORTS([xenbr0], [eth0])
537 CHECK_IFACES([xenbr0], [eth0])
538 CHECK_PORTS([xapi1], [eth0.$1])
539 CHECK_IFACES([xapi1], [eth0.$1])
540 OVS_VSCTL_CLEANUP
541 AT_CLEANUP
542 ]) # OVS_VSCTL_FAKE_BRIDGE_TESTS
543
544 OVS_VSCTL_FAKE_BRIDGE_TESTS([9])
545 OVS_VSCTL_FAKE_BRIDGE_TESTS([0])
546
547 dnl OVS_VSCTL_SETUP_BOND_FAKE_CONF([VLAN])
548 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
549   [AT_CHECK(
550      [RUN_OVS_VSCTL(
551         [add-br xapi1],
552         [add-bond xapi1 bond0 eth0 eth1],
553         [add-br xapi2 xapi1 $1],
554         [add-port xapi2 bond0.$1])],
555      [0], [], [], [OVS_VSCTL_CLEANUP])])
556
557 AT_SETUP([fake bridge on bond])
558 AT_KEYWORDS([ovs-vsctl fake-bridge])
559 OVS_VSCTL_SETUP
560 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
561 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
562 CHECK_PORTS([xapi1], [bond0])
563 CHECK_IFACES([xapi1], [eth0], [eth1])
564 CHECK_PORTS([xapi2], [bond0.11])
565 CHECK_IFACES([xapi2], [bond0.11])
566 OVS_VSCTL_CLEANUP
567 AT_CLEANUP
568
569 AT_SETUP([fake bridge on bond + del-br fake bridge])
570 AT_KEYWORDS([ovs-vsctl fake-bridge])
571 OVS_VSCTL_SETUP
572 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
573 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
574 ], [], [OVS_VSCTL_CLEANUP])
575 CHECK_BRIDGES([xapi1, xapi1, 0])
576 CHECK_PORTS([xapi1], [bond0])
577 CHECK_IFACES([xapi1], [eth0], [eth1])
578 OVS_VSCTL_CLEANUP
579 AT_CLEANUP
580
581 AT_SETUP([fake bridge on bond + del-br real bridge])
582 AT_KEYWORDS([ovs-vsctl fake-bridge])
583 OVS_VSCTL_SETUP
584 OVS_VSCTL_SETUP_BOND_FAKE_CONF([11])
585 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
586 CHECK_BRIDGES
587 OVS_VSCTL_CLEANUP
588 AT_CLEANUP
589
590 dnl ----------------------------------------------------------------------
591 AT_BANNER([ovs-vsctl unit tests -- manager commands])
592
593 AT_SETUP([managers])
594 AT_KEYWORDS([manager ovs-vsctl])
595 OVS_VSCTL_SETUP
596 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
597   [del-manager],
598   [get-manager],
599   [set-manager tcp:4.5.6.7],
600   [get-manager],
601   [set-manager tcp:8.9.10.11 tcp:5.4.3.2],
602   [get-manager],
603   [del-manager],
604   [get-manager])], [0], [
605
606
607 tcp:4.5.6.7
608
609 tcp:5.4.3.2\ntcp:8.9.10.11
610
611
612 ], [], [OVS_VSCTL_CLEANUP])
613 OVS_VSCTL_CLEANUP
614 AT_CLEANUP
615
616 dnl ----------------------------------------------------------------------
617 AT_BANNER([ovs-vsctl unit tests -- database commands])
618
619 AT_SETUP([database commands -- positive checks])
620 AT_KEYWORDS([ovs-vsctl])
621 OVS_VSCTL_SETUP
622 AT_CHECK(
623   [RUN_OVS_VSCTL_TOGETHER([--id=@br0 create bridge name=br0],
624                           [set o . bridges=@br0])],
625   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
626 cp stdout out1
627 AT_CHECK([RUN_OVS_VSCTL([list bridge], [get bridge br0 _uuid])],
628   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
629 cp stdout out2
630 AT_CHECK([${PERL} $srcdir/uuidfilt.pl out1 out2], [0],
631   [[<0>
632
633 _uuid               : <0>
634 controller          : []
635 datapath_id         : []
636 datapath_type       : ""
637 external_ids        : {}
638 fail_mode           : []
639 flood_vlans         : []
640 flow_tables         : {}
641 ipfix               : []
642 mirrors             : []
643 name                : "br0"
644 netflow             : []
645 other_config        : {}
646 ports               : []
647 protocols           : []
648 sflow               : []
649 status              : {}
650 stp_enable          : false
651 <0>
652 ]], [ignore], [test ! -e pid || kill `cat pid`])
653 AT_CHECK(
654   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type list bridge])],
655   [0],
656   [[fail_mode           : []
657 name                : "br0"
658 datapath_type       : ""
659 ]], [ignore], [test ! -e pid || kill `cat pid`])
660 AT_CHECK(
661   [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type find bridge])],
662   [0],
663   [[fail_mode           : []
664 name                : "br0"
665 datapath_type       : ""
666 ]], [ignore], [test ! -e pid || kill `cat pid`])
667 AT_CHECK([
668   RUN_OVS_VSCTL_TOGETHER([--id=@br1 create bridge name=br1 datapath_type="foo"],
669                          [--id=@br2 create bridge name=br2 external-ids:bar=quux],
670                          [add o . bridges @br1 @br2])],
671   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
672 AT_CHECK(
673   [RUN_OVS_VSCTL([--columns=name find bridge datapath_type!=foo])], [0], [stdout],
674   [ignore], [test ! -e pid || kill `cat pid`])
675 AT_CHECK([sed -n '/./p' stdout | sort], [0],
676   [[name                : "br0"
677 name                : "br2"
678 ]])
679 AT_CHECK(
680   [RUN_OVS_VSCTL(
681     [set bridge br0 \
682       'other_config:datapath_id="0123456789ab"' \
683       'other_config:hwaddr="00:11:22:33:44:55"' \
684       'external-ids={"uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
685      add bridge br0 external_ids '"roles"="local; remote; cloud"'])],
686   [0], [], [], [OVS_VSCTL_CLEANUP])
687 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])],
688   [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{roles="local; remote; cloud", uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
689 ], [], [OVS_VSCTL_CLEANUP])
690 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])],
691   [0], ["00:11:22:33:44:55"
692
693 ], [], [OVS_VSCTL_CLEANUP])
694 AT_CHECK([RUN_OVS_VSCTL([remove bridge br0 other_config hwaddr 'datapath_id=""' -- get bridge br0 other_config])],
695   [0], [{datapath_id="0123456789ab"}
696 ], [], [OVS_VSCTL_CLEANUP])
697 AT_CHECK([RUN_OVS_VSCTL([remove bridge br0 other_config 'datapath_id="0123456789ab"' -- get bridge br0 other_config])],
698   [0], [{}
699 ], [], [OVS_VSCTL_CLEANUP])
700 AT_CHECK([RUN_OVS_VSCTL([clear bridge br0 external-ids -- get bridge br0 external_ids])],
701   [0], [{}
702 ], [], [OVS_VSCTL_CLEANUP])
703 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([destroy bridge br0],
704                                  [destroy bridge br1],
705                                  [destroy bridge br2],
706                                  [clear o . bridges])],
707   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
708 AT_CHECK([RUN_OVS_VSCTL([list bridge])],
709   [0], [], [], [OVS_VSCTL_CLEANUP])
710 AT_CHECK([RUN_OVS_VSCTL([--if-exists get bridge x datapath_id])],
711   [0], [], [], [OVS_VSCTL_CLEANUP])
712 AT_CHECK([RUN_OVS_VSCTL([--if-exists list bridge x])],
713   [0], [], [], [OVS_VSCTL_CLEANUP])
714 AT_CHECK([RUN_OVS_VSCTL([--if-exists set controller x connection_mode=standalone])],
715   [0], [], [], [OVS_VSCTL_CLEANUP])
716 AT_CHECK(
717   [RUN_OVS_VSCTL([--if-exists remove netflow x targets '"1.2.3.4:567"'])],
718   [0], [], [], [OVS_VSCTL_CLEANUP])
719 AT_CHECK(
720   [RUN_OVS_VSCTL([--if-exists clear netflow x targets])],
721   [0], [], [], [OVS_VSCTL_CLEANUP])
722 OVS_VSCTL_CLEANUP
723 AT_CLEANUP
724
725 AT_SETUP([database commands -- negative checks])
726 AT_KEYWORDS([ovs-vsctl])
727 OVS_VSCTL_SETUP
728
729 AT_CHECK([ovs-vsctl --may-exist],
730   [1], [ignore], [ovs-vsctl: missing command name (use --help for help)
731 ], [OVS_VSCTL_CLEANUP])
732 AT_CHECK([ovs-vsctl --may-exist --],
733   [1], [ignore], [ovs-vsctl: missing command name (use --help for help)
734 ], [OVS_VSCTL_CLEANUP])
735 AT_CHECK([ovs-vsctl -- --may-exist],
736   [1], [ignore], [ovs-vsctl: missing command name (use --help for help)
737 ], [OVS_VSCTL_CLEANUP])
738
739 AT_CHECK([RUN_OVS_VSCTL([add-br br0])],
740   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
741 AT_CHECK([RUN_OVS_VSCTL([add-br br1])],
742   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
743 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])],
744   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
745 AT_CHECK([
746     RUN_OVS_VSCTL_TOGETHER([--id=@n create netflow targets='"1.2.3.4:567"'],
747                            [set bridge br0 netflow=@n])],
748   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
749 cp stdout netflow-uuid
750 AT_CHECK([RUN_OVS_VSCTL([list netflow `cat netflow-uuid`])],
751   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
752 AT_CHECK([${PERL} $srcdir/uuidfilt.pl netflow-uuid stdout], [0],
753   [[<0>
754
755 _uuid               : <0>
756 active_timeout      : 0
757 add_id_to_interface : false
758 engine_id           : []
759 engine_type         : []
760 external_ids        : {}
761 targets             : ["1.2.3.4:567"]
762 ]], [ignore], [test ! -e pid || kill `cat pid`])
763 AT_CHECK([RUN_OVS_VSCTL([list interx x])],
764   [1], [], [ovs-vsctl: unknown table "interx"
765 ], [OVS_VSCTL_CLEANUP])
766 AT_CHECK([RUN_OVS_VSCTL([list bridge x])],
767   [1], [], [ovs-vsctl: no row "x" in table Bridge
768 ], [OVS_VSCTL_CLEANUP])
769 AT_CHECK([RUN_OVS_VSCTL([get bridge x datapath_id])],
770   [1], [], [ovs-vsctl: no row "x" in table Bridge
771 ], [OVS_VSCTL_CLEANUP])
772 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 d])],
773   [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
774 ], [OVS_VSCTL_CLEANUP])
775 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 x])],
776   [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
777 ], [OVS_VSCTL_CLEANUP])
778 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 :y=z])],
779   [1], [], [ovs-vsctl: :y=z: missing column name
780 ], [OVS_VSCTL_CLEANUP])
781 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 datapath_id:y=z])],
782   [1], [], [ovs-vsctl: datapath_id:y=z: trailing garbage "=z" in argument
783 ], [OVS_VSCTL_CLEANUP])
784 AT_CHECK([RUN_OVS_VSCTL([set bridge br0 'datapath_id:y>=z'])],
785   [1], [], [ovs-vsctl: datapath_id:y>=z: argument does not end in "=" followed by a value.
786 ], [OVS_VSCTL_CLEANUP])
787 AT_CHECK([RUN_OVS_VSCTL([set controller x connection_mode=standalone])],
788   [1], [], [ovs-vsctl: no row "x" in table Controller
789 ], [OVS_VSCTL_CLEANUP])
790 AT_CHECK([RUN_OVS_VSCTL([wait-until bridge br0 datapath_id:y,z])],
791   [1], [], [ovs-vsctl: datapath_id:y,z: argument does not end in "=", "!=", "<", ">", "<=", ">=", "{=}", "{!=}", "{<}", "{>}", "{<=}", or "{>=}" followed by a value.
792 ], [OVS_VSCTL_CLEANUP])
793 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 datapath_id::])],
794   [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
795 ], [OVS_VSCTL_CLEANUP])
796 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 datapath_id:x])],
797   [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
798 ], [OVS_VSCTL_CLEANUP])
799 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 external_ids:x])],
800   [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
801 ], [OVS_VSCTL_CLEANUP])
802 AT_CHECK([RUN_OVS_VSCTL([set bridge br0 flood_vlans=-1])],
803   [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
804 ], [OVS_VSCTL_CLEANUP])
805 AT_CHECK([RUN_OVS_VSCTL([set bridge br0 flood_vlans=4096])],
806   [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
807 ], [OVS_VSCTL_CLEANUP])
808 AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])],
809   [1], [], [[ovs-vsctl: constraint violation: xyz is not one of the allowed values ([in-band, out-of-band])
810 ]], [OVS_VSCTL_CLEANUP])
811 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])],
812   [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
813 ], [OVS_VSCTL_CLEANUP])
814 AT_CHECK([RUN_OVS_VSCTL([add bridge br1 datapath_id x y])],
815   [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
816 ], [OVS_VSCTL_CLEANUP])
817 AT_CHECK([RUN_OVS_VSCTL([remove netflow `cat netflow-uuid` targets '"1.2.3.4:567"'])],
818   [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimum number is 1
819 ], [OVS_VSCTL_CLEANUP])
820 AT_CHECK([RUN_OVS_VSCTL([remove netflow x targets '"1.2.3.4:567"'])],
821   [1], [], [ovs-vsctl: no row "x" in table NetFlow
822 ], [OVS_VSCTL_CLEANUP])
823 AT_CHECK([RUN_OVS_VSCTL([clear netflow x targets])],
824   [1], [], [ovs-vsctl: no row "x" in table NetFlow
825 ], [OVS_VSCTL_CLEANUP])
826 AT_CHECK([RUN_OVS_VSCTL([clear netflow `cat netflow-uuid` targets])],
827   [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
828 ], [OVS_VSCTL_CLEANUP])
829 AT_CHECK([RUN_OVS_VSCTL([destroy bridge br2])],
830   [1], [], [ovs-vsctl: no row "br2" in table Bridge
831 ], [OVS_VSCTL_CLEANUP])
832 AT_CHECK([RUN_OVS_VSCTL([add in br1 name x])],
833   [1], [], [ovs-vsctl: cannot modify read-only column name in table Interface
834 ], [OVS_VSCTL_CLEANUP])
835 AT_CHECK([RUN_OVS_VSCTL([set port br1 name br2])],
836   [1], [], [ovs-vsctl: cannot modify read-only column name in table Port
837 ], [OVS_VSCTL_CLEANUP])
838 AT_CHECK([RUN_OVS_VSCTL([remove bridge br1 name br1])],
839   [1], [], [ovs-vsctl: cannot modify read-only column name in table Bridge
840 ], [OVS_VSCTL_CLEANUP])
841 AT_CHECK([RUN_OVS_VSCTL([remove bridge br1 flood-vlans true])],
842   [1], [], [ovs-vsctl: "true" is not a valid integer
843 ], [OVS_VSCTL_CLEANUP])
844 AT_CHECK([RUN_OVS_VSCTL([clear bridge br1 name])],
845   [1], [], [ovs-vsctl: cannot modify read-only column name in table Bridge
846 ], [OVS_VSCTL_CLEANUP])
847 OVS_VSCTL_CLEANUP
848 AT_CLEANUP
849
850 AT_SETUP([database commands -- conditions])
851 AT_KEYWORDS([ovs-vsctl])
852 ON_EXIT([kill `cat pid`])
853 OVS_VSCTL_SETUP
854 AT_CHECK(
855   [RUN_OVS_VSCTL_TOGETHER(
856      [add-br br0],
857      [add-br br1], [set bridge br1 flood_vlans=0 other-config:x='""'],
858      [add-br br2], [set bridge br2 flood_vlans=1 other-config:x=y],
859      [add-br br3], [set bridge br3 flood_vlans=0,1 other-config:x=z],
860      [add-br br4], [set bridge br4 flood_vlans=2],
861      [add-br br5], [set bridge br5 flood_vlans=0,2],
862      [add-br br6], [set bridge br6 flood_vlans=1,2],
863      [add-br br7], [set bridge br7 flood_vlans=0,1,2])], [0], [
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878 ])
879 m4_define([VSCTL_CHECK_FIND],
880   [AT_CHECK([echo `ovs-vsctl --bare --no-wait -vreconnect:emer --db=unix:socket -- --columns=name find bridge '$1' | sort`], [0], [$2
881 ])])
882
883 # Arithmetic relational operators without keys.
884 VSCTL_CHECK_FIND([flood_vlans=0], [br1])
885 VSCTL_CHECK_FIND([flood_vlans=1], [br2])
886 VSCTL_CHECK_FIND([flood_vlans=0,2], [br5])
887 VSCTL_CHECK_FIND([flood_vlans=0,1,2], [br7])
888 VSCTL_CHECK_FIND([flood_vlans=3], [])
889
890 VSCTL_CHECK_FIND([flood_vlans!=0], [br0 br2 br3 br4 br5 br6 br7])
891 VSCTL_CHECK_FIND([flood_vlans!=1], [br0 br1 br3 br4 br5 br6 br7])
892 VSCTL_CHECK_FIND([flood_vlans!=0,2], [br0 br1 br2 br3 br4 br6 br7])
893 VSCTL_CHECK_FIND([flood_vlans!=0,1,2], [br0 br1 br2 br3 br4 br5 br6])
894 VSCTL_CHECK_FIND([flood_vlans!=3], [br0 br1 br2 br3 br4 br5 br6 br7])
895
896 VSCTL_CHECK_FIND([flood_vlans<2], [br0 br1 br2])
897 VSCTL_CHECK_FIND([flood_vlans<0,2], [br0 br1 br2 br3 br4])
898 VSCTL_CHECK_FIND([flood_vlans>1], [br3 br4 br5 br6 br7])
899 VSCTL_CHECK_FIND([flood_vlans>0,1], [br5 br6 br7])
900 VSCTL_CHECK_FIND([flood_vlans<=2], [br0 br1 br2 br4])
901 VSCTL_CHECK_FIND([flood_vlans<=0,2], [br0 br1 br2 br3 br4 br5])
902 VSCTL_CHECK_FIND([flood_vlans>=1], [br2 br3 br4 br5 br6 br7])
903 VSCTL_CHECK_FIND([flood_vlans>=0,1], [br3 br5 br6 br7])
904
905 # Set relational operators without keys.
906 VSCTL_CHECK_FIND([flood_vlans{=}0], [br1])
907 VSCTL_CHECK_FIND([flood_vlans{=}1], [br2])
908 VSCTL_CHECK_FIND([flood_vlans{=}0,2], [br5])
909 VSCTL_CHECK_FIND([flood_vlans{=}0,1,2], [br7])
910 VSCTL_CHECK_FIND([flood_vlans{=}3], [])
911
912 VSCTL_CHECK_FIND([flood_vlans{!=}0], [br0 br2 br3 br4 br5 br6 br7])
913 VSCTL_CHECK_FIND([flood_vlans{!=}1], [br0 br1 br3 br4 br5 br6 br7])
914 VSCTL_CHECK_FIND([flood_vlans{!=}0,2], [br0 br1 br2 br3 br4 br6 br7])
915 VSCTL_CHECK_FIND([flood_vlans{!=}0,1,2], [br0 br1 br2 br3 br4 br5 br6])
916 VSCTL_CHECK_FIND([flood_vlans{!=}3], [br0 br1 br2 br3 br4 br5 br6 br7])
917
918 VSCTL_CHECK_FIND([flood_vlans{<}[[]]], [])
919 VSCTL_CHECK_FIND([flood_vlans{<=}[[]]], [br0])
920 VSCTL_CHECK_FIND([flood_vlans{<}0], [br0])
921 VSCTL_CHECK_FIND([flood_vlans{<=}0], [br0 br1])
922 VSCTL_CHECK_FIND([flood_vlans{<}1,2], [br0 br2 br4])
923 VSCTL_CHECK_FIND([flood_vlans{<=}1,2], [br0 br2 br4 br6])
924
925 VSCTL_CHECK_FIND([flood_vlans{>}[[]]], [br1 br2 br3 br4 br5 br6 br7])
926 VSCTL_CHECK_FIND([flood_vlans{>=}[[]]], [br0 br1 br2 br3 br4 br5 br6 br7])
927 VSCTL_CHECK_FIND([flood_vlans{>}0], [br3 br5 br7])
928 VSCTL_CHECK_FIND([flood_vlans{>=}0], [br1 br3 br5 br7])
929 VSCTL_CHECK_FIND([flood_vlans{>}0,2], [br7])
930 VSCTL_CHECK_FIND([flood_vlans{>=}1,2], [br6 br7])
931 VSCTL_CHECK_FIND([flood_vlans{>=}0,2], [br5 br7])
932
933 # Arithmetic relational operators with keys.
934 VSCTL_CHECK_FIND([other-config:x=""], [br1])
935 VSCTL_CHECK_FIND([other-config:x=y], [br2])
936 VSCTL_CHECK_FIND([other-config:x=z], [br3])
937
938 VSCTL_CHECK_FIND([other-config:x!=""], [br2 br3])
939 VSCTL_CHECK_FIND([other-config:x!=y], [br1 br3])
940 VSCTL_CHECK_FIND([other-config:x!=z], [br1 br2])
941
942 VSCTL_CHECK_FIND([other-config:x>y], [br3])
943 VSCTL_CHECK_FIND([other-config:x>=y], [br2 br3])
944 VSCTL_CHECK_FIND([other-config:x<y], [br1])
945 VSCTL_CHECK_FIND([other-config:x<=y], [br1 br2])
946
947 # Set relational operators with keys.
948 VSCTL_CHECK_FIND([other-config:x{=}[[]]], [br0 br4 br5 br6 br7])
949 VSCTL_CHECK_FIND([other-config:x{=}""], [br1])
950 VSCTL_CHECK_FIND([other-config:x{=}y], [br2])
951 VSCTL_CHECK_FIND([other-config:x{=}z], [br3])
952
953 VSCTL_CHECK_FIND([other-config:x{!=}[[]]], [br1 br2 br3])
954 VSCTL_CHECK_FIND([other-config:x{!=}""], [br0 br2 br3 br4 br5 br6 br7])
955 VSCTL_CHECK_FIND([other-config:x{!=}y], [br0 br1 br3 br4 br5 br6 br7])
956 VSCTL_CHECK_FIND([other-config:x{!=}z], [br0 br1 br2 br4 br5 br6 br7])
957
958 VSCTL_CHECK_FIND([other-config:x{<=}[[]]], [br0 br4 br5 br6 br7])
959 VSCTL_CHECK_FIND([other-config:x{<=}x], [br0 br4 br5 br6 br7])
960 VSCTL_CHECK_FIND([other-config:x{<=}""], [br0 br1 br4 br5 br6 br7])
961 VSCTL_CHECK_FIND([other-config:x{<=}y], [br0 br2 br4 br5 br6 br7])
962 VSCTL_CHECK_FIND([other-config:x{<=}z], [br0 br3 br4 br5 br6 br7])
963 VSCTL_CHECK_FIND([other-config:x{<=}x,y,z], [br0 br2 br3 br4 br5 br6 br7])
964
965 VSCTL_CHECK_FIND([other-config:x{<}[[]]], [])
966 VSCTL_CHECK_FIND([other-config:x{<}x], [br0 br4 br5 br6 br7])
967 VSCTL_CHECK_FIND([other-config:x{<}""], [br0 br4 br5 br6 br7])
968 VSCTL_CHECK_FIND([other-config:x{<}y], [br0 br4 br5 br6 br7])
969 VSCTL_CHECK_FIND([other-config:x{<}z], [br0 br4 br5 br6 br7])
970
971 VSCTL_CHECK_FIND([other-config:x{>=}[[]]], [br0 br1 br2 br3 br4 br5 br6 br7])
972 VSCTL_CHECK_FIND([other-config:x{>=}x], [])
973 VSCTL_CHECK_FIND([other-config:x{>=}""], [br1])
974 VSCTL_CHECK_FIND([other-config:x{>=}y], [br2])
975 VSCTL_CHECK_FIND([other-config:x{>=}z], [br3])
976
977 VSCTL_CHECK_FIND([other-config:x{>}[[]]], [br1 br2 br3])
978 VSCTL_CHECK_FIND([other-config:x{>}x], [])
979 VSCTL_CHECK_FIND([other-config:x{>}""], [])
980 VSCTL_CHECK_FIND([other-config:x{>}y], [])
981 VSCTL_CHECK_FIND([other-config:x{>}z], [])
982 OVS_VSCTL_CLEANUP
983 AT_CLEANUP
984
985 AT_SETUP([database commands -- wait-until immediately true])
986 AT_KEYWORDS([ovs-vsctl])
987 OVS_VSCTL_SETUP
988 AT_CHECK([RUN_OVS_VSCTL(
989     [add-br br0],
990     [add-bond br0 bond0 eth0 eth1],
991     [set port bond0 bond_updelay=500 other-config:abc=def])],
992   [0], [], [], [OVS_VSCTL_CLEANUP])
993 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . manager_options=[]]])],
994   [0], [], [], [OVS_VSCTL_CLEANUP])
995 AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . bridges!=[]]])],
996   [0], [], [], [OVS_VSCTL_CLEANUP])
997 AT_CHECK([RUN_OVS_VSCTL([[wait-until Port bond0 other-config:abc=def]])],
998   [0], [], [], [OVS_VSCTL_CLEANUP])
999 AT_CHECK([RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' 'other-config:abc>d' 'other-config:abc<e']])],
1000   [0], [], [], [OVS_VSCTL_CLEANUP])
1001 OVS_VSCTL_CLEANUP
1002 AT_CLEANUP
1003
1004 AT_SETUP([database commands -- wait-until must wait])
1005 AT_KEYWORDS([ovs-vsctl])
1006
1007 OVS_VSCTL_SETUP
1008
1009 # Start ovs-vsctls in background.
1010 (RUN_OVS_VSCTL([[wait-until o . bridges!=[] -- get bridge br10 other-config:abc]])) > stdout1 &
1011 (RUN_OVS_VSCTL([[wait-until bridge br1 -- get bridge br1 other-config:abc]])) > stdout2 &
1012 (RUN_OVS_VSCTL([[wait-until bridge br1 other-config={abc=def} -- get bridge br1 other-config]])) > stdout3 &
1013 (RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' -- get port bond0 bond-updelay]])) > stdout4 &
1014
1015 # Give the ovs-vsctls a chance to read the database
1016 sleep 1
1017
1018 AT_CHECK([RUN_OVS_VSCTL([add-br br10 -- set bridge br10 other-config:abc=quux])
1019 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])],
1020   [0], [], [], [OVS_VSCTL_CLEANUP])
1021
1022 # Wait for the ovs-vsctls to finish.
1023 wait
1024
1025 # Check output
1026 AT_CHECK([cat stdout1], [0], [quux
1027 ], [], [OVS_VSCTL_CLEANUP])
1028 AT_CHECK([cat stdout2], [0], [def
1029 ], [], [OVS_VSCTL_CLEANUP])
1030 AT_CHECK([cat stdout3], [0], [{abc=def}
1031 ], [], [OVS_VSCTL_CLEANUP])
1032 AT_CHECK([cat stdout4], [0], [500
1033 ], [], [OVS_VSCTL_CLEANUP])
1034
1035 OVS_VSCTL_CLEANUP
1036 AT_CLEANUP
1037
1038 AT_SETUP([--id option on create, get commands])
1039 AT_KEYWORDS([ovs-vsctl])
1040 OVS_VSCTL_SETUP
1041 AT_CHECK([RUN_OVS_VSCTL([add-br br0],
1042                         [add-port br0 eth0],
1043                         [add-port br0 eth1])])
1044 AT_CHECK(
1045   [RUN_OVS_VSCTL_TOGETHER(
1046     [set bridge br0 mirrors=@m],
1047     [--id=@eth0 get port eth0],
1048     [--id=@eth1 get port eth1],
1049     [--id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1])],
1050   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1051 AT_CHECK(
1052   [${PERL} $srcdir/uuidfilt.pl stdout], [0], [dnl
1053
1054
1055
1056 <0>
1057 ],
1058   [], [OVS_VSCTL_CLEANUP])
1059 AT_CHECK(
1060   [RUN_OVS_VSCTL(
1061     [list port eth0 eth1],
1062     [list mirror],
1063     [list bridge br0])],
1064   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1065 AT_CHECK(
1066   [sed -n -e '/uuid/p' -e '/name/p' -e '/mirrors/p' -e '/select/p' -e '/output/p' < stdout | ${PERL} $srcdir/uuidfilt.pl], [0], [dnl
1067 [_uuid               : <0>
1068 name                : "eth0"
1069 _uuid               : <1>
1070 name                : "eth1"
1071 _uuid               : <2>
1072 name                : mymirror
1073 output_port         : <1>
1074 output_vlan         : []
1075 select_all          : false
1076 select_dst_port     : [<0>]
1077 select_src_port     : [<0>]
1078 select_vlan         : []
1079 _uuid               : <3>
1080 mirrors             : [<2>]
1081 name                : "br0"
1082 ]],
1083   [], [OVS_VSCTL_CLEANUP])
1084 OVS_VSCTL_CLEANUP
1085 AT_CLEANUP
1086
1087 AT_SETUP([unreferenced record warnings])
1088 AT_KEYWORDS([ovs-vsctl])
1089 OVS_VSCTL_SETUP
1090 AT_CHECK(
1091   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --no-wait -vreconnect:emer --db=unix:socket \
1092      -- create Bridge name=br0 | ${PERL} $srcdir/uuidfilt.pl],
1093   [0], [<0>
1094 ], [vsctl|WARN|applying "create" command to table Bridge without --id option will have no effect
1095 ], [OVS_VSCTL_CLEANUP])
1096 AT_CHECK(
1097   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --no-wait -vreconnect:emer --db=unix:socket \
1098      -- --id=@br0 create Bridge name=br0 | ${PERL} $srcdir/uuidfilt.pl],
1099   [0], [<0>
1100 ], [vsctl|WARN|row id "@br0" was created but no reference to it was inserted, so it will not actually appear in the database
1101 ], [OVS_VSCTL_CLEANUP])
1102 AT_CHECK(
1103   [ovs-vsctl -vPATTERN:console:'%c|%p|%m' --no-wait -vreconnect:emer --db=unix:socket \
1104      -- --id=@eth0_iface create Interface name=eth0 \
1105      -- --id=@eth0 create Port name=eth0 interfaces=@eth0_iface \
1106      -- --id=@m0 create Mirror name=m0 output_port=@eth0 \
1107      -- --id=@br0 create Bridge name=br0 mirrors=@m0 \
1108      -- set Open_vSwitch . bridges=@br0 | ${PERL} $srcdir/uuidfilt.pl],
1109   [0], [<0>
1110 <1>
1111 <2>
1112 <3>
1113 ], [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
1114 ], [OVS_VSCTL_CLEANUP])
1115 OVS_VSCTL_CLEANUP
1116 AT_CLEANUP
1117
1118 dnl This test really shows a bug -- "create" followed by "list" in
1119 dnl the same execution shows the wrong UUID on the "list" command.
1120 dnl The bug is documented in ovs-vsctl.8.
1121 AT_SETUP([created row UUID is wrong in same execution])
1122 AT_KEYWORDS([ovs-vsctl])
1123 OVS_VSCTL_SETUP
1124 AT_CHECK([RUN_OVS_VSCTL([--id=@br0 create Bridge name=br0 -- add Open_vSwitch . bridges @br0 -- list bridge])],
1125   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
1126 AT_CHECK([${PERL} $srcdir/uuidfilt.pl stdout], [0],
1127   [[<0>
1128 _uuid               : <1>
1129 controller          : []
1130 datapath_id         : []
1131 datapath_type       : ""
1132 external_ids        : {}
1133 fail_mode           : []
1134 flood_vlans         : []
1135 flow_tables         : {}
1136 ipfix               : []
1137 mirrors             : []
1138 name                : "br0"
1139 netflow             : []
1140 other_config        : {}
1141 ports               : []
1142 protocols           : []
1143 sflow               : []
1144 status              : {}
1145 stp_enable          : false
1146 ]], [ignore], [test ! -e pid || kill `cat pid`])
1147 OVS_VSCTL_CLEANUP
1148 AT_CLEANUP
1149
1150 dnl This test will create a linux-htb QoS record that
1151 dnl points to a few queues and use it on a1 and a2 port.
1152 dnl It also destroys all records from Qos and Queue table.
1153 AT_SETUP([--all option on destroy command])
1154 AT_KEYWORDS([ovs-vsctl])
1155 OVS_VSCTL_SETUP
1156 AT_CHECK([RUN_OVS_VSCTL(
1157    [add-br a],
1158    [add-port a a1],
1159    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
1160 CHECK_BRIDGES([a, a, 0])
1161 CHECK_PORTS([a], [a1], [a2])
1162 CHECK_IFACES([a], [a1], [a2])
1163 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
1164    [set Port a1 qos=@newqos],
1165    [set Port a2 qos=@newqos],
1166    [--id=@newqos create QoS type=linux-htb other-config:max-rate=1000000000 queues=0=@q0,1=@q1],
1167    [--id=@q0 create Queue other-config:min-rate=100000000 other-config:max-rate=100000000],
1168    [--id=@q1 create Queue other-config:min-rate=500000000])], [0], [ignore], [], [OVS_VSCTL_CLEANUP])
1169 AT_CHECK([RUN_OVS_VSCTL(
1170    [--columns=other_config,type list Qos])], [0],
1171 [other_config        : {max-rate="1000000000"}
1172 type                : linux-htb
1173 ], [], [OVS_VSCTL_CLEANUP])
1174 AT_CHECK([RUN_OVS_VSCTL(
1175    [--columns=other_config list Queue | sort | xargs echo])], [0],
1176 [other_config : {max-rate=100000000, min-rate=100000000} other_config : {min-rate=500000000}
1177 ], [], [OVS_VSCTL_CLEANUP])
1178 AT_CHECK([RUN_OVS_VSCTL(
1179    [clear Port a1 qos],
1180    [clear Port a2 qos])], [0], [], [], [OVS_VSCTL_CLEANUP])
1181 AT_CHECK([RUN_OVS_VSCTL(
1182    [--columns=qos list Port a1 a2])], [0],
1183 [[qos                 : []
1184
1185 qos                 : []
1186 ]], [], [OVS_VSCTL_CLEANUP])
1187 AT_CHECK([RUN_OVS_VSCTL(
1188    [--all destroy Qos])], [0], [], [], [OVS_VSCTL_CLEANUP])
1189 AT_CHECK([RUN_OVS_VSCTL(
1190    [-- list Qos])], [0], [], [], [OVS_VSCTL_CLEANUP])
1191 AT_CHECK([RUN_OVS_VSCTL(
1192    [--all destroy Queue])], [0], [], [], [OVS_VSCTL_CLEANUP])
1193 AT_CHECK([RUN_OVS_VSCTL(
1194    [-- list Queue])], [0], [], [], [OVS_VSCTL_CLEANUP])
1195 OVS_VSCTL_CLEANUP
1196 AT_CLEANUP
1197
1198 dnl ----------------------------------------------------------------------
1199 AT_BANNER([ovs-vsctl add-port -- reserved port names])
1200
1201 AT_SETUP([add-port -- reserved names 1])
1202 OVS_VSWITCHD_START
1203
1204 # Test creating all reserved port names
1205 m4_foreach(
1206 [reserved_name],
1207 [[ovs-netdev],
1208 [ovs-dummy],
1209 [gre_system],
1210 [gre64_system],
1211 [lisp_system],
1212 [vxlan_system]],
1213 [
1214 # Try creating the port
1215 AT_CHECK([ovs-vsctl add-port br0 reserved_name], [0], [], [dnl
1216 ovs-vsctl: Error detected while setting up 'reserved_name'.  See ovs-vswitchd log for details.
1217 ])
1218 # Prevent race.
1219 OVS_WAIT_UNTIL([test `grep -- "|WARN|" ovs-vswitchd.log | wc -l` -ge 1])
1220 # Detect the warning log message
1221 AT_CHECK([sed -n "s/^.*\(|bridge|WARN|.*\)$/\1/p" ovs-vswitchd.log], [0], [dnl
1222 |bridge|WARN|could not create interface reserved_name, name is reserved
1223 ])
1224 # Delete the warning log message
1225 AT_CHECK([sed "/|bridge|WARN|/d" ovs-vswitchd.log > ovs-vswitchd.log], [0], [], [])
1226 # Delete the port
1227 AT_CHECK([ovs-vsctl del-port br0 reserved_name], [0], [], [])])
1228 OVS_VSWITCHD_STOP
1229 AT_CLEANUP
1230
1231 AT_SETUP([add-port -- reserved names 2])
1232 # Creates all type of tunnel ports
1233 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \
1234                     options:remote_ip=1.1.1.1 ofport_request=1\
1235                     -- add-port br0 p2 -- set Interface p2 type=gre64 \
1236                     options:local_ip=2.2.2.2 options:remote_ip=1.1.1.1 \
1237                     ofport_request=2 \
1238                     -- add-port br0 p3 -- set Interface p3 type=lisp \
1239                     options:remote_ip=2.2.2.2 ofport_request=3 \
1240                     -- add-port br0 p4 -- set Interface p4 type=vxlan \
1241                     options:remote_ip=2.2.2.2 ofport_request=4])
1242
1243 # Test creating all reserved tunnel port names
1244 m4_foreach(
1245 [reserved_name],
1246 [[gre_system],
1247 [gre64_system],
1248 [lisp_system],
1249 [vxlan_system]],
1250 [
1251 # Try creating the port
1252 AT_CHECK([ovs-vsctl add-port br0 reserved_name], [0], [], [dnl
1253 ovs-vsctl: Error detected while setting up 'reserved_name'.  See ovs-vswitchd log for details.
1254 ])
1255 # Prevent race.
1256 OVS_WAIT_UNTIL([test `grep -- "|WARN|" ovs-vswitchd.log | wc -l` -ge 1])
1257 # Detect the warning log message
1258 AT_CHECK([sed -n "s/^.*\(|bridge|WARN|.*\)$/\1/p" ovs-vswitchd.log], [0], [dnl
1259 |bridge|WARN|could not create interface reserved_name, name is reserved
1260 ])
1261 # Delete the warning log message
1262 AT_CHECK([sed "/|bridge|WARN|/d" ovs-vswitchd.log > ovs-vswitchd.log], [0], [], [])
1263 # Delete the port
1264 AT_CHECK([ovs-vsctl del-port br0 reserved_name], [0], [], [])])
1265 OVS_VSWITCHD_STOP
1266 AT_CLEANUP