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],
7 AT_CHECK([ovsdb-server --detach --pidfile=$PWD/pid --remote=punix:socket --unixctl=$PWD/unixctl db >/dev/null 2>&1], [0], [ignore], [ignore])])
11 dnl Kills off the database server.
12 m4_define([OVS_VSCTL_CLEANUP], [OVSDB_SERVER_SHUTDOWN])
14 dnl RUN_OVS_VSCTL(COMMAND, ...)
16 dnl Executes each ovs-vsctl COMMAND.
17 m4_define([RUN_OVS_VSCTL],
18 [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket -- command
20 m4_define([RUN_OVS_VSCTL_ONELINE],
21 [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline -- command
24 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
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:ANY:emer --db=unix:socket --oneline dnl
29 m4_foreach([command], [$@], [ -- command])])
31 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
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])
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])
50 # Check multiple queries in a single run.
51 AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
54 ], [], [OVS_VSCTL_CLEANUP])])
55 m4_define([CHECK_BRIDGES],
56 [dnl Check that the bridges appear on list-br, without --oneline.
58 [RUN_OVS_VSCTL([list-br])],
60 [m4_foreach([brinfo], [$@], [m4_car(brinfo)
65 dnl Check that the bridges appear on list-br, with --oneline.
67 [RUN_OVS_VSCTL_ONELINE([list-br])],
69 [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
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], [], [],
82 dnl Check that each bridge has the expected parent and VLAN.
83 m4_map([_CHECK_BRIDGE], [$@])])
85 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
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
91 m4_define([CHECK_PORTS],
92 [dnl Check ports without --oneline.
94 [RUN_OVS_VSCTL([list-ports $1])],
96 [m4_foreach([port], m4_cdr($@), [port
101 dnl Check ports with --oneline.
103 [RUN_OVS_VSCTL_ONELINE([list-ports $1])],
105 [m4_join([\n], m4_shift($@))
109 AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
110 [ovs-vsctl: no port named $1
115 [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
116 ], [], [OVS_VSCTL_CLEANUP])])])
118 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
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
124 m4_define([CHECK_IFACES],
126 [RUN_OVS_VSCTL([list-ifaces $1])],
128 [m4_foreach([iface], m4_cdr($@), [iface
132 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
133 [ovs-vsctl: no interface named $1
138 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
140 [], [OVS_VSCTL_CLEANUP])])])
142 dnl ----------------------------------------------------------------------
143 AT_BANNER([ovs-vsctl unit tests -- real bridges])
146 AT_KEYWORDS([ovs-vsctl])
148 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
149 CHECK_BRIDGES([a, a, 0])
155 AT_SETUP([add-br a, add-br a])
156 AT_KEYWORDS([ovs-vsctl])
158 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
159 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
160 [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
161 ], [OVS_VSCTL_CLEANUP])
165 AT_SETUP([add-br a, add-br b])
166 AT_KEYWORDS([ovs-vsctl])
168 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
170 CHECK_BRIDGES([a, a, 0], [b, b, 0])
178 AT_SETUP([add-br a, add-br b, del-br a])
179 AT_KEYWORDS([ovs-vsctl])
181 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
183 CHECK_BRIDGES([b, b, 0])
189 AT_SETUP([add-br a, add-port a a1, add-port a a2])
190 AT_KEYWORDS([ovs-vsctl])
192 AT_CHECK([RUN_OVS_VSCTL(
194 [--if-exists del-br b],
196 [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
197 CHECK_BRIDGES([a, a, 0])
198 CHECK_PORTS([a], [a1], [a2])
199 CHECK_IFACES([a], [a1], [a2])
203 AT_SETUP([add-br a, add-port a a1, add-port a a1])
204 AT_KEYWORDS([ovs-vsctl])
206 AT_CHECK([RUN_OVS_VSCTL(
208 [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
209 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
210 [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
211 ], [OVS_VSCTL_CLEANUP])
215 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
216 AT_KEYWORDS([ovs-vsctl])
218 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
223 [--if-exists del-port b b2],
230 ], [], [OVS_VSCTL_CLEANUP])
231 CHECK_BRIDGES([b, b, 0])
232 CHECK_PORTS([b], [b1])
233 CHECK_IFACES([b], [b1])
237 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
238 AT_KEYWORDS([ovs-vsctl])
240 AT_CHECK([RUN_OVS_VSCTL(
242 [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
243 CHECK_BRIDGES([a, a, 0])
244 CHECK_PORTS([a], [bond0])
245 CHECK_IFACES([a], [a1], [a2], [a3])
249 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
250 AT_KEYWORDS([ovs-vsctl])
252 AT_CHECK([RUN_OVS_VSCTL(
257 [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
258 CHECK_BRIDGES([a, a, 0], [b, b, 0])
261 CHECK_PORTS([b], [b1])
262 CHECK_IFACES([b], [b1])
266 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
267 AT_KEYWORDS([ovs-vsctl])
269 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
271 [add-bond a bond0 a1 a2 a3],
272 [del-port bond0])], [0], [
275 ], [], [OVS_VSCTL_CLEANUP])
276 CHECK_BRIDGES([a, a, 0])
281 AT_SETUP([external IDs])
282 AT_KEYWORDS([ovs-vsctl])
284 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
287 [add-bond a bond0 a2 a3],
288 [br-set-external-id a key0 value0],
289 [set port a1 external-ids:key1=value1],
290 [set interface a2 external-ids:key2=value2],
291 [set interface a2 external-ids:key3=value3],
292 [set interface a3 external-ids:key4=value4],
293 [br-get-external-id a],
294 [br-get-external-id a key0],
295 [br-get-external-id a key1],
296 [br-set-external-id a key0 othervalue],
297 [br-get-external-id a],
298 [br-set-external-id a key0],
299 [br-get-external-id a],
300 [get port a1 external-ids],
301 [get interface a2 external-ids],
302 [get interface a3 external-ids])], [0], [
318 {"key2"="value2", "key3"="value3"}
320 ], [], [OVS_VSCTL_CLEANUP])
321 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
322 [br-get-external-id a],
323 [get port a1 external-ids],
324 [get interface a2 external-ids],
325 [get interface a3 external-ids])], [0],
328 {"key2"="value2", "key3"="value3"}
330 ], [], [OVS_VSCTL_CLEANUP])
331 CHECK_BRIDGES([a, a, 0])
332 CHECK_PORTS([a], [a1], [bond0])
333 CHECK_IFACES([a], [a1], [a2], [a3])
337 dnl ----------------------------------------------------------------------
338 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
340 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
344 [add-port xenbr0 eth0],
345 [add-br xapi1 xenbr0 9],
346 [add-port xapi1 eth0.9])],
347 [0], [], [], [OVS_VSCTL_CLEANUP])])
349 AT_SETUP([simple fake bridge])
350 AT_KEYWORDS([ovs-vsctl fake-bridge])
352 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
353 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
354 CHECK_PORTS([xenbr0], [eth0])
355 CHECK_IFACES([xenbr0], [eth0])
356 CHECK_PORTS([xapi1], [eth0.9])
357 CHECK_IFACES([xapi1], [eth0.9])
361 AT_SETUP([simple fake bridge + del-br fake bridge])
362 AT_KEYWORDS([ovs-vsctl fake-bridge])
364 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
365 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
366 CHECK_BRIDGES([xenbr0, xenbr0, 0])
367 CHECK_PORTS([xenbr0], [eth0])
368 CHECK_IFACES([xenbr0], [eth0])
372 AT_SETUP([simple fake bridge + del-br real bridge])
373 AT_KEYWORDS([ovs-vsctl fake-bridge])
375 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
376 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
381 AT_SETUP([simple fake bridge + external IDs])
382 AT_KEYWORDS([ovs-vsctl fake-bridge])
384 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
385 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
386 [br-set-external-id xenbr0 key0 value0],
387 [br-set-external-id xapi1 key1 value1],
388 [br-get-external-id xenbr0],
389 [br-get-external-id xenbr0 key0],
390 [br-get-external-id xapi1],
391 [br-get-external-id xapi1 key1])], [0], [
397 ], [], [OVS_VSCTL_CLEANUP])
398 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
399 CHECK_PORTS([xenbr0], [eth0])
400 CHECK_IFACES([xenbr0], [eth0])
401 CHECK_PORTS([xapi1], [eth0.9])
402 CHECK_IFACES([xapi1], [eth0.9])
406 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
410 [add-bond xapi1 bond0 eth0 eth1],
411 [add-br xapi2 xapi1 11],
412 [add-port xapi2 bond0.11])],
413 [0], [], [], [OVS_VSCTL_CLEANUP])])
415 AT_SETUP([fake bridge on bond])
416 AT_KEYWORDS([ovs-vsctl fake-bridge])
418 OVS_VSCTL_SETUP_BOND_FAKE_CONF
419 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
420 CHECK_PORTS([xapi1], [bond0])
421 CHECK_IFACES([xapi1], [eth0], [eth1])
422 CHECK_PORTS([xapi2], [bond0.11])
423 CHECK_IFACES([xapi2], [bond0.11])
427 AT_SETUP([fake bridge on bond + del-br fake bridge])
428 AT_KEYWORDS([ovs-vsctl fake-bridge])
430 OVS_VSCTL_SETUP_BOND_FAKE_CONF
431 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
432 ], [], [OVS_VSCTL_CLEANUP])
433 CHECK_BRIDGES([xapi1, xapi1, 0])
434 CHECK_PORTS([xapi1], [bond0])
435 CHECK_IFACES([xapi1], [eth0], [eth1])
439 AT_SETUP([fake bridge on bond + del-br real bridge])
440 AT_KEYWORDS([ovs-vsctl fake-bridge])
442 OVS_VSCTL_SETUP_BOND_FAKE_CONF
443 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
448 dnl ----------------------------------------------------------------------
449 AT_BANNER([ovs-vsctl unit tests -- database commands])
451 AT_SETUP([database commands -- positive checks])
452 AT_KEYWORDS([ovs-vsctl])
454 AT_CHECK([RUN_OVS_VSCTL([create b name=br0])],
455 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
457 AT_CHECK([RUN_OVS_VSCTL([list b])],
458 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
460 AT_CHECK([perl $srcdir/uuidfilt.pl out1 out2], [0],
474 ]], [ignore], [test ! -e pid || kill `cat pid`])
478 'other_config:datapath_id="0123456789ab"' \
479 'other_config:hwaddr="00:11:22:33:44:55"' \
480 'external-ids={"xs-network-uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
481 add bridge br0 external_ids '"xs-network-names"="local; remote; cloud"'])],
482 [0], [], [], [OVS_VSCTL_CLEANUP])
483 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])],
484 [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{xs-network-names="local; remote; cloud", xs-network-uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
485 ], [], [OVS_VSCTL_CLEANUP])
486 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])],
487 [0], ["00:11:22:33:44:55"
489 ], [], [OVS_VSCTL_CLEANUP])
490 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])],
491 [0], [{datapath_id="0123456789ab"}
492 ], [], [OVS_VSCTL_CLEANUP])
493 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])],
495 ], [], [OVS_VSCTL_CLEANUP])
496 AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])],
498 ], [], [OVS_VSCTL_CLEANUP])
499 AT_CHECK([RUN_OVS_VSCTL([destroy b br0])],
500 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
501 AT_CHECK([RUN_OVS_VSCTL([list b])],
502 [0], [], [], [OVS_VSCTL_CLEANUP])
506 AT_SETUP([database commands -- negative checks])
507 AT_KEYWORDS([ovs-vsctl])
509 AT_CHECK([RUN_OVS_VSCTL([create b name=br0])],
510 [0], [ignore], [], [OVS_VSCTL_CLEANUP])
511 AT_CHECK([RUN_OVS_VSCTL([add-br br1])],
512 [0], [ignore], [], [OVS_VSCTL_CLEANUP])
513 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])],
514 [0], [ignore], [], [OVS_VSCTL_CLEANUP])
515 AT_CHECK([RUN_OVS_VSCTL([create n targets='"1.2.3.4:567"'])],
516 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
517 cp stdout netflow-uuid
518 AT_CHECK([RUN_OVS_VSCTL([list n `cat netflow-uuid`])],
519 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
520 AT_CHECK([perl $srcdir/uuidfilt.pl netflow-uuid stdout], [0],
524 add_id_to_interface : false
527 targets : ["1.2.3.4:567"]
528 ]], [ignore], [test ! -e pid || kill `cat pid`])
529 AT_CHECK([RUN_OVS_VSCTL([list interx x])],
530 [1], [], [ovs-vsctl: unknown table "interx"
531 ], [OVS_VSCTL_CLEANUP])
532 AT_CHECK([RUN_OVS_VSCTL([list b x])],
533 [1], [], [ovs-vsctl: no row "x" in table Bridge
534 ], [OVS_VSCTL_CLEANUP])
535 AT_CHECK([RUN_OVS_VSCTL([list b br])],
536 [1], [], [ovs-vsctl: multiple rows in Bridge match "br"
537 ], [OVS_VSCTL_CLEANUP])
538 AT_CHECK([RUN_OVS_VSCTL([get b br0 d])],
539 [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
540 ], [OVS_VSCTL_CLEANUP])
541 AT_CHECK([RUN_OVS_VSCTL([get b br0 x])],
542 [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
543 ], [OVS_VSCTL_CLEANUP])
544 AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])],
545 [1], [], [ovs-vsctl: :y=z: missing column name
546 ], [OVS_VSCTL_CLEANUP])
547 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])],
548 [1], [], [ovs-vsctl: datapath_id:y=z: value not accepted here
549 ], [OVS_VSCTL_CLEANUP])
550 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])],
551 [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
552 ], [OVS_VSCTL_CLEANUP])
553 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])],
554 [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
555 ], [OVS_VSCTL_CLEANUP])
556 AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])],
557 [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
558 ], [OVS_VSCTL_CLEANUP])
559 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])],
560 [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
561 ], [OVS_VSCTL_CLEANUP])
562 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])],
563 [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
564 ], [OVS_VSCTL_CLEANUP])
565 AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])],
566 [1], [], [ovs-vsctl: constraint violation: "xyz" is not a either "in-band" or "out-of-band"
567 ], [OVS_VSCTL_CLEANUP])
568 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])],
569 [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
570 ], [OVS_VSCTL_CLEANUP])
571 AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])],
572 [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
573 ], [OVS_VSCTL_CLEANUP])
574 AT_CHECK([RUN_OVS_VSCTL([remove n `cat netflow-uuid` targets '"1.2.3.4:567"'])],
575 [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimun number is 1
576 ], [OVS_VSCTL_CLEANUP])
577 AT_CHECK([RUN_OVS_VSCTL([clear n `cat netflow-uuid` targets])],
578 [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
579 ], [OVS_VSCTL_CLEANUP])
580 AT_CHECK([RUN_OVS_VSCTL([destroy b br2])],
581 [1], [], [ovs-vsctl: no row "br2" in table Bridge
582 ], [OVS_VSCTL_CLEANUP])
586 dnl This test really shows a bug -- "create" followed by "list" in
587 dnl the same execution shows the wrong UUID on the "list" command.
588 dnl The bug is documented in ovs-vsctl.8.
589 AT_SETUP([created row UUID is wrong in same execution])
590 AT_KEYWORDS([ovs-vsctl])
592 AT_CHECK([RUN_OVS_VSCTL([create Bridge name=br0 -- list b])],
593 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
594 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0],
608 ]], [ignore], [test ! -e pid || kill `cat pid`])