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