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