]> git.proxmox.com Git - ovs.git/blame - tests/ovs-vsctl.at
ovsdb: Don't count self-references in ovsdb_row's n_refs member.
[ovs.git] / tests / ovs-vsctl.at
CommitLineData
c75d1511
BP
1dnl OVS_VSCTL_SETUP
2dnl
3dnl Creates an empty database in the current directory and then starts
4dnl an ovsdb-server on it for ovs-vsctl to connect to.
5m4_define([OVS_VSCTL_SETUP],
24c8ae53 6 [OVSDB_INIT([db])
0b1fae1b 7 AT_CHECK([ovsdb-server --detach --pidfile=$PWD/pid --remote=punix:socket --unixctl=$PWD/unixctl db >/dev/null 2>&1], [0], [ignore], [ignore])])
c75d1511
BP
8
9dnl OVS_VSCTL_CLEANUP
10dnl
11dnl Kills off the database server.
028cbd99 12m4_define([OVS_VSCTL_CLEANUP], [OVSDB_SERVER_SHUTDOWN])
c75d1511 13
3b135da3
BP
14dnl RUN_OVS_VSCTL(COMMAND, ...)
15dnl
c75d1511 16dnl Executes each ovs-vsctl COMMAND.
3b135da3 17m4_define([RUN_OVS_VSCTL],
b524945e 18 [m4_foreach([command], [$@], [ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket -- command
460aad80
BP
19])])
20m4_define([RUN_OVS_VSCTL_ONELINE],
b524945e 21 [m4_foreach([command], [$@], [ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline -- command
3b135da3
BP
22])])
23
4d14e30f
BP
24dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
25dnl
c75d1511 26dnl Executes each ovs-vsctl COMMAND in a single run of ovs-vsctl.
4d14e30f 27m4_define([RUN_OVS_VSCTL_TOGETHER],
b524945e 28 [ovs-vsctl --timeout=5 --no-wait -vreconnect:ANY:emer --db=unix:socket --oneline dnl
460aad80 29m4_foreach([command], [$@], [ -- command])])
4d14e30f 30
8e58fa9a 31dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
3b135da3
BP
32dnl
33dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
8e58fa9a
BP
34dnl which must be in alphabetical order. Also checks that each BRIDGE has the
35dnl specified PARENT and is on the given VLAN.
36m4_define([_CHECK_BRIDGE],
37 [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
c75d1511 38], [], [OVS_VSCTL_CLEANUP])
2792c2ad
BP
39
40 # Check br-to-vlan, without --oneline.
8e58fa9a 41 AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
c75d1511 42], [], [OVS_VSCTL_CLEANUP])
2792c2ad
BP
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.)
460aad80 47 AT_CHECK([RUN_OVS_VSCTL_ONELINE([br-to-vlan $1])], [0], [$3
c75d1511 48], [], [OVS_VSCTL_CLEANUP])
4d14e30f
BP
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
c75d1511 54], [], [OVS_VSCTL_CLEANUP])])
3b135da3 55m4_define([CHECK_BRIDGES],
2792c2ad 56 [dnl Check that the bridges appear on list-br, without --oneline.
8e58fa9a 57 AT_CHECK(
3b135da3
BP
58 [RUN_OVS_VSCTL([list-br])],
59 [0],
8e58fa9a 60 [m4_foreach([brinfo], [$@], [m4_car(brinfo)
c75d1511
BP
61])],
62 [],
63 [OVS_VSCTL_CLEANUP])
8e58fa9a 64
2792c2ad
BP
65 dnl Check that the bridges appear on list-br, with --oneline.
66 AT_CHECK(
460aad80 67 [RUN_OVS_VSCTL_ONELINE([list-br])],
2792c2ad
BP
68 [0],
69 [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
c75d1511
BP
70],
71 [],
72 [OVS_VSCTL_CLEANUP])
2792c2ad 73
8e58fa9a
BP
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], [$@],
c75d1511
BP
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])
8e58fa9a
BP
81
82 dnl Check that each bridge has the expected parent and VLAN.
83 m4_map([_CHECK_BRIDGE], [$@])])
3b135da3
BP
84
85dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
86dnl
87dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
88dnl list of ports, which must be in alphabetical order. Also checks
89dnl that "ovs-vsctl port-to-br" reports that each port is
90dnl in BRIDGE.
91m4_define([CHECK_PORTS],
2792c2ad
BP
92 [dnl Check ports without --oneline.
93 AT_CHECK(
3b135da3
BP
94 [RUN_OVS_VSCTL([list-ports $1])],
95 [0],
96 [m4_foreach([port], m4_cdr($@), [port
c75d1511
BP
97])],
98 [],
99 [OVS_VSCTL_CLEANUP])
2792c2ad
BP
100
101 dnl Check ports with --oneline.
102 AT_CHECK(
460aad80 103 [RUN_OVS_VSCTL_ONELINE([list-ports $1])],
2792c2ad
BP
104 [0],
105 [m4_join([\n], m4_shift($@))
c75d1511
BP
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])
3b135da3
BP
113 m4_foreach(
114 [port], m4_cdr($@),
115 [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
c75d1511 116], [], [OVS_VSCTL_CLEANUP])])])
3b135da3
BP
117
118dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
119dnl
120dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
121dnl list of ifaces, which must be in alphabetical order. Also checks
122dnl that "ovs-vsctl iface-to-br" reports that each interface is
123dnl in BRIDGE.
124m4_define([CHECK_IFACES],
125 [AT_CHECK(
126 [RUN_OVS_VSCTL([list-ifaces $1])],
127 [0],
128 [m4_foreach([iface], m4_cdr($@), [iface
dfbe07ba
BP
129])],
130 [],
131 [OVS_VSCTL_CLEANUP])
c75d1511
BP
132 AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
133 [ovs-vsctl: no interface named $1
134],
135 [OVS_VSCTL_CLEANUP])
3b135da3
BP
136 m4_foreach(
137 [iface], m4_cdr($@),
138 [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
c75d1511
BP
139],
140 [], [OVS_VSCTL_CLEANUP])])])
3b135da3 141
8e58fa9a
BP
142dnl ----------------------------------------------------------------------
143AT_BANNER([ovs-vsctl unit tests -- real bridges])
144
3b135da3
BP
145AT_SETUP([add-br a])
146AT_KEYWORDS([ovs-vsctl])
c75d1511
BP
147OVS_VSCTL_SETUP
148AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
8e58fa9a 149CHECK_BRIDGES([a, a, 0])
3b135da3
BP
150CHECK_PORTS([a])
151CHECK_IFACES([a])
c75d1511 152OVS_VSCTL_CLEANUP
3b135da3
BP
153AT_CLEANUP
154
1125a1b9
BP
155AT_SETUP([add-br a, add-br a])
156AT_KEYWORDS([ovs-vsctl])
c75d1511
BP
157OVS_VSCTL_SETUP
158AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
1125a1b9
BP
159AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
160 [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
c75d1511
BP
161], [OVS_VSCTL_CLEANUP])
162OVS_VSCTL_CLEANUP
1125a1b9
BP
163AT_CLEANUP
164
3b135da3
BP
165AT_SETUP([add-br a, add-br b])
166AT_KEYWORDS([ovs-vsctl])
c75d1511
BP
167OVS_VSCTL_SETUP
168AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
169 [OVS_VSCTL_CLEANUP])
aeee85aa
BP
170AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br a b 9])], [1], [],
171 [ovs-vsctl: "--may-exist add-br a b 9" but a is not a VLAN bridge
172],
173 [OVS_VSCTL_CLEANUP])
8e58fa9a 174CHECK_BRIDGES([a, a, 0], [b, b, 0])
3b135da3
BP
175CHECK_PORTS([a])
176CHECK_IFACES([a])
177CHECK_PORTS([b])
178CHECK_IFACES([b])
c75d1511 179OVS_VSCTL_CLEANUP
3b135da3
BP
180AT_CLEANUP
181
182AT_SETUP([add-br a, add-br b, del-br a])
183AT_KEYWORDS([ovs-vsctl])
c75d1511
BP
184OVS_VSCTL_SETUP
185AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
186 [OVS_VSCTL_CLEANUP])
8e58fa9a 187CHECK_BRIDGES([b, b, 0])
3b135da3
BP
188CHECK_PORTS([b])
189CHECK_IFACES([b])
c75d1511 190OVS_VSCTL_CLEANUP
3b135da3
BP
191AT_CLEANUP
192
2792c2ad
BP
193AT_SETUP([add-br a, add-port a a1, add-port a a2])
194AT_KEYWORDS([ovs-vsctl])
c75d1511 195OVS_VSCTL_SETUP
2792c2ad 196AT_CHECK([RUN_OVS_VSCTL(
dfbe07ba 197 [add-br a],
460aad80 198 [--if-exists del-br b],
2792c2ad 199 [add-port a a1],
c75d1511 200 [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
2792c2ad
BP
201CHECK_BRIDGES([a, a, 0])
202CHECK_PORTS([a], [a1], [a2])
203CHECK_IFACES([a], [a1], [a2])
c75d1511 204OVS_VSCTL_CLEANUP
2792c2ad
BP
205AT_CLEANUP
206
1125a1b9
BP
207AT_SETUP([add-br a, add-port a a1, add-port a a1])
208AT_KEYWORDS([ovs-vsctl])
c75d1511 209OVS_VSCTL_SETUP
1125a1b9
BP
210AT_CHECK([RUN_OVS_VSCTL(
211 [add-br a],
c75d1511 212 [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
1125a1b9
BP
213AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
214 [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
c75d1511
BP
215], [OVS_VSCTL_CLEANUP])
216OVS_VSCTL_CLEANUP
1125a1b9
BP
217AT_CLEANUP
218
3b135da3
BP
219AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
220AT_KEYWORDS([ovs-vsctl])
c75d1511 221OVS_VSCTL_SETUP
4d14e30f 222AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
3b135da3
BP
223 [add-br a],
224 [add-br b],
225 [add-port a a1],
226 [add-port b b1],
460aad80
BP
227 [--if-exists del-port b b2],
228 [del-br a])], [0], [
229
230
231
232
233
234], [], [OVS_VSCTL_CLEANUP])
8e58fa9a 235CHECK_BRIDGES([b, b, 0])
3b135da3
BP
236CHECK_PORTS([b], [b1])
237CHECK_IFACES([b], [b1])
c75d1511 238OVS_VSCTL_CLEANUP
3b135da3
BP
239AT_CLEANUP
240
241AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
242AT_KEYWORDS([ovs-vsctl])
c75d1511 243OVS_VSCTL_SETUP
3b135da3
BP
244AT_CHECK([RUN_OVS_VSCTL(
245 [add-br a],
c75d1511 246 [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
bb1c67c8
BP
247AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a3 a1 a2])], [0], [], [],
248 [OVS_VSCTL_CLEANUP])
249AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a2 a1])], [1], [],
250 [ovs-vsctl: "--may-exist add-bond a bond0 a2 a1" but bond0 actually has interface(s) a1, a2, a3
251],
252 [OVS_VSCTL_CLEANUP])
8e58fa9a 253CHECK_BRIDGES([a, a, 0])
3b135da3
BP
254CHECK_PORTS([a], [bond0])
255CHECK_IFACES([a], [a1], [a2], [a3])
c75d1511 256OVS_VSCTL_CLEANUP
3b135da3
BP
257AT_CLEANUP
258
259AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
260AT_KEYWORDS([ovs-vsctl])
c75d1511 261OVS_VSCTL_SETUP
3b135da3
BP
262AT_CHECK([RUN_OVS_VSCTL(
263 [add-br a],
264 [add-br b],
18b239f5
BP
265 [add-port a a1 tag=9],
266 [get port a1 tag],
bb1c67c8 267 [--may-exist add-port b b1],
18b239f5
BP
268 [del-port a a1])], [0], [9
269], [], [OVS_VSCTL_CLEANUP])
bb1c67c8
BP
270AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port b b1])], [0], [], [],
271 [OVS_VSCTL_CLEANUP])
272AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [],
273 [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b
274],
275 [OVS_VSCTL_CLEANUP])
8e58fa9a 276CHECK_BRIDGES([a, a, 0], [b, b, 0])
3b135da3
BP
277CHECK_PORTS([a])
278CHECK_IFACES([a])
279CHECK_PORTS([b], [b1])
280CHECK_IFACES([b], [b1])
c75d1511 281OVS_VSCTL_CLEANUP
3b135da3
BP
282AT_CLEANUP
283
3d1b9636 284AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
3b135da3 285AT_KEYWORDS([ovs-vsctl])
c75d1511 286OVS_VSCTL_SETUP
4d14e30f 287AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
3b135da3 288 [add-br a],
18b239f5
BP
289 [add-bond a bond0 a1 a2 a3 tag=9],
290 [get Port bond0 tag],
460aad80
BP
291 [del-port bond0])], [0], [
292
18b239f5 2939
460aad80
BP
294
295], [], [OVS_VSCTL_CLEANUP])
8e58fa9a 296CHECK_BRIDGES([a, a, 0])
3b135da3 297CHECK_PORTS([a])
c75d1511 298OVS_VSCTL_CLEANUP
3b135da3
BP
299AT_CLEANUP
300
457e1eb0
BP
301AT_SETUP([external IDs])
302AT_KEYWORDS([ovs-vsctl])
303OVS_VSCTL_SETUP
fbd8715e 304AT_CHECK([RUN_OVS_VSCTL_ONELINE(
460aad80 305 [add-br a],
457e1eb0
BP
306 [add-port a a1],
307 [add-bond a bond0 a2 a3],
308 [br-set-external-id a key0 value0],
e328faad
BP
309 [set port a1 external-ids:key1=value1],
310 [set interface a2 external-ids:key2=value2],
311 [set interface a2 external-ids:key3=value3],
312 [set interface a3 external-ids:key4=value4],
457e1eb0
BP
313 [br-get-external-id a],
314 [br-get-external-id a key0],
315 [br-get-external-id a key1],
316 [br-set-external-id a key0 othervalue],
317 [br-get-external-id a],
318 [br-set-external-id a key0],
319 [br-get-external-id a],
e328faad
BP
320 [get port a1 external-ids],
321 [get interface a2 external-ids],
322 [get interface a3 external-ids])], [0], [
457e1eb0
BP
323
324
325
326
327
328
329
330key0=value0
331value0
332
333
334key0=othervalue
335
336
e328faad
BP
337{"key1"="value1"}
338{"key2"="value2", "key3"="value3"}
339{"key4"="value4"}
457e1eb0
BP
340], [], [OVS_VSCTL_CLEANUP])
341AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
460aad80 342 [br-get-external-id a],
e328faad
BP
343 [get port a1 external-ids],
344 [get interface a2 external-ids],
345 [get interface a3 external-ids])], [0],
457e1eb0 346[
e328faad
BP
347{"key1"="value1"}
348{"key2"="value2", "key3"="value3"}
349{"key4"="value4"}
457e1eb0
BP
350], [], [OVS_VSCTL_CLEANUP])
351CHECK_BRIDGES([a, a, 0])
352CHECK_PORTS([a], [a1], [bond0])
353CHECK_IFACES([a], [a1], [a2], [a3])
354OVS_VSCTL_CLEANUP
355AT_CLEANUP
356
76ce9432
BP
357AT_SETUP([controllers])
358AT_KEYWORDS([controller ovs-vsctl])
359OVS_VSCTL_SETUP
360AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
361 [add-br br0],
362
76ce9432 363 [get-controller br0],
76ce9432 364 [set-controller br0 tcp:4.5.6.7],
76ce9432
BP
365 [get-controller br0],
366
367 [del-controller br0],
76ce9432
BP
368 [get-controller br0],
369
370 [set-controller br0 tcp:8.9.10.11 tcp:5.4.3.2],
76ce9432
BP
371 [get-controller br0])], [0], [
372
76ce9432 373
76ce9432
BP
374tcp:4.5.6.7
375
376
377
76ce9432
BP
378tcp:5.4.3.2\ntcp:8.9.10.11
379], [], [OVS_VSCTL_CLEANUP])
380OVS_VSCTL_CLEANUP
381AT_CLEANUP
382
8e58fa9a 383dnl ----------------------------------------------------------------------
3b135da3
BP
384AT_BANNER([ovs-vsctl unit tests -- fake bridges])
385
dfbe07ba
BP
386m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
387 [AT_CHECK(
388 [RUN_OVS_VSCTL(
389 [add-br xenbr0],
aeee85aa 390 [--may-exist add-br xenbr0],
dfbe07ba 391 [add-port xenbr0 eth0],
bb1c67c8 392 [--may-exist add-port xenbr0 eth0],
dfbe07ba 393 [add-br xapi1 xenbr0 9],
aeee85aa 394 [--may-exist add-br xapi1 xenbr0 9],
dfbe07ba
BP
395 [add-port xapi1 eth0.9])],
396 [0], [], [], [OVS_VSCTL_CLEANUP])])
3b135da3
BP
397
398AT_SETUP([simple fake bridge])
399AT_KEYWORDS([ovs-vsctl fake-bridge])
c75d1511 400OVS_VSCTL_SETUP
dfbe07ba 401OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
aeee85aa
BP
402AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
403 [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN 9
404], [OVS_VSCTL_CLEANUP])
405AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx 9])], [1], [],
406 [ovs-vsctl: "--may-exist add-br xapi1 xxx 9" but xapi1 has the wrong parent xenbr0
407], [OVS_VSCTL_CLEANUP])
408AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
409 [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN 9
410], [OVS_VSCTL_CLEANUP])
dfbe07ba 411CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
3b135da3
BP
412CHECK_PORTS([xenbr0], [eth0])
413CHECK_IFACES([xenbr0], [eth0])
414CHECK_PORTS([xapi1], [eth0.9])
415CHECK_IFACES([xapi1], [eth0.9])
c75d1511 416OVS_VSCTL_CLEANUP
3b135da3
BP
417AT_CLEANUP
418
419AT_SETUP([simple fake bridge + del-br fake bridge])
420AT_KEYWORDS([ovs-vsctl fake-bridge])
c75d1511 421OVS_VSCTL_SETUP
dfbe07ba
BP
422OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
423AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
8e58fa9a 424CHECK_BRIDGES([xenbr0, xenbr0, 0])
3b135da3
BP
425CHECK_PORTS([xenbr0], [eth0])
426CHECK_IFACES([xenbr0], [eth0])
c75d1511 427OVS_VSCTL_CLEANUP
3b135da3
BP
428AT_CLEANUP
429
430AT_SETUP([simple fake bridge + del-br real bridge])
431AT_KEYWORDS([ovs-vsctl fake-bridge])
c75d1511 432OVS_VSCTL_SETUP
dfbe07ba
BP
433OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
434AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
3b135da3 435CHECK_BRIDGES
c75d1511 436OVS_VSCTL_CLEANUP
3b135da3
BP
437AT_CLEANUP
438
457e1eb0
BP
439AT_SETUP([simple fake bridge + external IDs])
440AT_KEYWORDS([ovs-vsctl fake-bridge])
441OVS_VSCTL_SETUP
442OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
443AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
460aad80 444 [br-set-external-id xenbr0 key0 value0],
457e1eb0
BP
445 [br-set-external-id xapi1 key1 value1],
446 [br-get-external-id xenbr0],
447 [br-get-external-id xenbr0 key0],
448 [br-get-external-id xapi1],
449 [br-get-external-id xapi1 key1])], [0], [
450
451key0=value0
452value0
453key1=value1
454value1
455], [], [OVS_VSCTL_CLEANUP])
456CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
457CHECK_PORTS([xenbr0], [eth0])
458CHECK_IFACES([xenbr0], [eth0])
459CHECK_PORTS([xapi1], [eth0.9])
460CHECK_IFACES([xapi1], [eth0.9])
461OVS_VSCTL_CLEANUP
462AT_CLEANUP
463
dfbe07ba
BP
464m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
465 [AT_CHECK(
466 [RUN_OVS_VSCTL(
467 [add-br xapi1],
468 [add-bond xapi1 bond0 eth0 eth1],
469 [add-br xapi2 xapi1 11],
470 [add-port xapi2 bond0.11])],
471 [0], [], [], [OVS_VSCTL_CLEANUP])])
3b135da3
BP
472
473AT_SETUP([fake bridge on bond])
474AT_KEYWORDS([ovs-vsctl fake-bridge])
c75d1511 475OVS_VSCTL_SETUP
dfbe07ba 476OVS_VSCTL_SETUP_BOND_FAKE_CONF
8e58fa9a 477CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
3b135da3
BP
478CHECK_PORTS([xapi1], [bond0])
479CHECK_IFACES([xapi1], [eth0], [eth1])
480CHECK_PORTS([xapi2], [bond0.11])
481CHECK_IFACES([xapi2], [bond0.11])
c75d1511 482OVS_VSCTL_CLEANUP
3b135da3
BP
483AT_CLEANUP
484
485AT_SETUP([fake bridge on bond + del-br fake bridge])
486AT_KEYWORDS([ovs-vsctl fake-bridge])
c75d1511 487OVS_VSCTL_SETUP
dfbe07ba 488OVS_VSCTL_SETUP_BOND_FAKE_CONF
460aad80 489AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
dfbe07ba 490], [], [OVS_VSCTL_CLEANUP])
8e58fa9a 491CHECK_BRIDGES([xapi1, xapi1, 0])
3b135da3
BP
492CHECK_PORTS([xapi1], [bond0])
493CHECK_IFACES([xapi1], [eth0], [eth1])
c75d1511 494OVS_VSCTL_CLEANUP
3b135da3
BP
495AT_CLEANUP
496
497AT_SETUP([fake bridge on bond + del-br real bridge])
498AT_KEYWORDS([ovs-vsctl fake-bridge])
dfbe07ba
BP
499OVS_VSCTL_SETUP
500OVS_VSCTL_SETUP_BOND_FAKE_CONF
3b135da3
BP
501AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
502CHECK_BRIDGES
c75d1511 503OVS_VSCTL_CLEANUP
3b135da3 504AT_CLEANUP
5c414a2e 505
24b8b259
AE
506dnl ----------------------------------------------------------------------
507AT_BANNER([ovs-vsctl unit tests -- manager commands])
508
509AT_SETUP([managers])
510AT_KEYWORDS([manager ovs-vsctl])
511OVS_VSCTL_SETUP
512AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
513 [del-manager],
514 [get-manager],
515 [set-manager tcp:4.5.6.7],
516 [get-manager],
517 [set-manager tcp:8.9.10.11 tcp:5.4.3.2],
518 [get-manager],
519 [del-manager],
520 [get-manager])], [0], [
521
522
523tcp:4.5.6.7
524
525tcp:5.4.3.2\ntcp:8.9.10.11
526
527
528], [], [OVS_VSCTL_CLEANUP])
529OVS_VSCTL_CLEANUP
530AT_CLEANUP
531
5c414a2e
BP
532dnl ----------------------------------------------------------------------
533AT_BANNER([ovs-vsctl unit tests -- database commands])
534
535AT_SETUP([database commands -- positive checks])
536AT_KEYWORDS([ovs-vsctl])
537OVS_VSCTL_SETUP
0d0f05b9 538AT_CHECK([RUN_OVS_VSCTL([create b name=br0])],
5c414a2e
BP
539 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
540cp stdout out1
f40a9b61 541AT_CHECK([RUN_OVS_VSCTL([list b], [get b br0 _uuid])],
5c414a2e
BP
542 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
543cp stdout out2
544AT_CHECK([perl $srcdir/uuidfilt.pl out1 out2], [0],
545 [[<0>
bd76d25d
BP
546_uuid : <0>
547controller : []
548datapath_id : []
549datapath_type : ""
550external_ids : {}
31681a5d 551fail_mode : []
bd76d25d
BP
552flood_vlans : []
553mirrors : []
554name : "br0"
555netflow : []
556other_config : {}
557ports : []
558sflow : []
f40a9b61 559<0>
5c414a2e 560]], [ignore], [test ! -e pid || kill `cat pid`])
9591fefe
BP
561AT_CHECK(
562 [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type list b])],
563 [0],
564 [[fail_mode : []
565name : "br0"
566datapath_type : ""
567]], [ignore], [test ! -e pid || kill `cat pid`])
0a140468
BP
568AT_CHECK(
569 [RUN_OVS_VSCTL([--columns=fail_mode,name,datapath_type find b])],
570 [0],
571 [[fail_mode : []
572name : "br0"
573datapath_type : ""
574]], [ignore], [test ! -e pid || kill `cat pid`])
575AT_CHECK([RUN_OVS_VSCTL([create b name=br1 datapath_type="foo"],
576 [create b name=br2 external-ids:bar=quux])],
577 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
578AT_CHECK(
579 [RUN_OVS_VSCTL([--columns=name find b datapath_type!=foo])], [0], [stdout],
580 [ignore], [test ! -e pid || kill `cat pid`])
581AT_CHECK([sed -n '/./p' stdout | sort], [0],
582 [[name : "br0"
583name : "br2"
584]])
5c414a2e
BP
585AT_CHECK(
586 [RUN_OVS_VSCTL(
587 [set bridge br0 \
588 'other_config:datapath_id="0123456789ab"' \
589 'other_config:hwaddr="00:11:22:33:44:55"' \
d3f82921
BP
590 'external-ids={"uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
591 add bridge br0 external_ids '"roles"="local; remote; cloud"'])],
5c414a2e
BP
592 [0], [], [], [OVS_VSCTL_CLEANUP])
593AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])],
d3f82921 594 [0], [{datapath_id="0123456789ab", hwaddr="00:11:22:33:44:55"}\n{roles="local; remote; cloud", uuids="9c45f225-a7cf-439d-976d-83db6271fda1"}
5c414a2e
BP
595], [], [OVS_VSCTL_CLEANUP])
596AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])],
597 [0], ["00:11:22:33:44:55"
598
599], [], [OVS_VSCTL_CLEANUP])
600AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])],
601 [0], [{datapath_id="0123456789ab"}
602], [], [OVS_VSCTL_CLEANUP])
603AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])],
604 [0], [{}
605], [], [OVS_VSCTL_CLEANUP])
606AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])],
607 [0], [{}
608], [], [OVS_VSCTL_CLEANUP])
0a140468
BP
609AT_CHECK([RUN_OVS_VSCTL_TOGETHER([destroy b br0],
610 [destroy b br1],
611 [destroy b br2])],
5c414a2e
BP
612 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
613AT_CHECK([RUN_OVS_VSCTL([list b])],
614 [0], [], [], [OVS_VSCTL_CLEANUP])
615OVS_VSCTL_CLEANUP
616AT_CLEANUP
617
618AT_SETUP([database commands -- negative checks])
619AT_KEYWORDS([ovs-vsctl])
620OVS_VSCTL_SETUP
0d0f05b9 621AT_CHECK([RUN_OVS_VSCTL([create b name=br0])],
5c414a2e
BP
622 [0], [ignore], [], [OVS_VSCTL_CLEANUP])
623AT_CHECK([RUN_OVS_VSCTL([add-br br1])],
624 [0], [ignore], [], [OVS_VSCTL_CLEANUP])
625AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])],
626 [0], [ignore], [], [OVS_VSCTL_CLEANUP])
0d0f05b9 627AT_CHECK([RUN_OVS_VSCTL([create n targets='"1.2.3.4:567"'])],
5c414a2e
BP
628 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
629cp stdout netflow-uuid
630AT_CHECK([RUN_OVS_VSCTL([list n `cat netflow-uuid`])],
631 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
632AT_CHECK([perl $srcdir/uuidfilt.pl netflow-uuid stdout], [0],
633 [[<0>
bd76d25d
BP
634_uuid : <0>
635active_timeout : 0
636add_id_to_interface : false
637engine_id : []
638engine_type : []
13008eb3 639external_ids : {}
bd76d25d 640targets : ["1.2.3.4:567"]
5c414a2e
BP
641]], [ignore], [test ! -e pid || kill `cat pid`])
642AT_CHECK([RUN_OVS_VSCTL([list interx x])],
643 [1], [], [ovs-vsctl: unknown table "interx"
644], [OVS_VSCTL_CLEANUP])
645AT_CHECK([RUN_OVS_VSCTL([list b x])],
646 [1], [], [ovs-vsctl: no row "x" in table Bridge
647], [OVS_VSCTL_CLEANUP])
5c414a2e
BP
648AT_CHECK([RUN_OVS_VSCTL([get b br0 d])],
649 [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
650], [OVS_VSCTL_CLEANUP])
651AT_CHECK([RUN_OVS_VSCTL([get b br0 x])],
652 [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
653], [OVS_VSCTL_CLEANUP])
654AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])],
655 [1], [], [ovs-vsctl: :y=z: missing column name
656], [OVS_VSCTL_CLEANUP])
657AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])],
e89e5374 658 [1], [], [ovs-vsctl: datapath_id:y=z: trailing garbage "=z" in argument
5c414a2e 659], [OVS_VSCTL_CLEANUP])
7db03f7c
BP
660AT_CHECK([RUN_OVS_VSCTL([set b br0 'datapath_id:y>=z'])],
661 [1], [], [ovs-vsctl: datapath_id:y>=z: argument does not end in "=" followed by a value.
662], [OVS_VSCTL_CLEANUP])
663AT_CHECK([RUN_OVS_VSCTL([wait-until b br0 datapath_id:y,z])],
664 [1], [], [ovs-vsctl: datapath_id:y,z: argument does not end in "=", "!=", "<", ">", "<=", or ">=" followed by a value.
665], [OVS_VSCTL_CLEANUP])
5c414a2e
BP
666AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])],
667 [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
668], [OVS_VSCTL_CLEANUP])
669AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])],
670 [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
671], [OVS_VSCTL_CLEANUP])
672AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])],
673 [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
674], [OVS_VSCTL_CLEANUP])
675AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])],
bd76d25d 676 [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
5c414a2e
BP
677], [OVS_VSCTL_CLEANUP])
678AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])],
bd76d25d 679 [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
5c414a2e 680], [OVS_VSCTL_CLEANUP])
bfc96d9b
BP
681AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])],
682 [1], [], [[ovs-vsctl: constraint violation: xyz is not one of the allowed values ([in-band, out-of-band])
683]], [OVS_VSCTL_CLEANUP])
5c414a2e
BP
684AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])],
685 [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
686], [OVS_VSCTL_CLEANUP])
bd76d25d 687AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])],
5c414a2e
BP
688 [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
689], [OVS_VSCTL_CLEANUP])
5c414a2e 690AT_CHECK([RUN_OVS_VSCTL([remove n `cat netflow-uuid` targets '"1.2.3.4:567"'])],
f19f25a4 691 [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimum number is 1
5c414a2e 692], [OVS_VSCTL_CLEANUP])
5c414a2e
BP
693AT_CHECK([RUN_OVS_VSCTL([clear n `cat netflow-uuid` targets])],
694 [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
695], [OVS_VSCTL_CLEANUP])
0d0f05b9 696AT_CHECK([RUN_OVS_VSCTL([destroy b br2])],
5c414a2e
BP
697 [1], [], [ovs-vsctl: no row "br2" in table Bridge
698], [OVS_VSCTL_CLEANUP])
699OVS_VSCTL_CLEANUP
700AT_CLEANUP
701
7db03f7c
BP
702AT_SETUP([database commands -- wait-until immediately true])
703AT_KEYWORDS([ovs-vsctl])
704OVS_VSCTL_SETUP
705AT_CHECK([RUN_OVS_VSCTL(
706 [add-br br0],
707 [add-bond br0 bond0 eth0 eth1],
708 [set port bond0 bond_updelay=500 other-config:abc=def])],
709 [0], [], [], [OVS_VSCTL_CLEANUP])
289df16d 710AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . manager_options=[]]])],
7db03f7c
BP
711 [0], [], [], [OVS_VSCTL_CLEANUP])
712AT_CHECK([RUN_OVS_VSCTL([[wait-until Open_vSwitch . bridges!=[]]])],
713 [0], [], [], [OVS_VSCTL_CLEANUP])
714AT_CHECK([RUN_OVS_VSCTL([[wait-until Port bond0 other-config:abc=def]])],
715 [0], [], [], [OVS_VSCTL_CLEANUP])
716AT_CHECK([RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' 'other-config:abc>d' 'other-config:abc<e']])],
717 [0], [], [], [OVS_VSCTL_CLEANUP])
718OVS_VSCTL_CLEANUP
719AT_CLEANUP
720
721AT_SETUP([database commands -- wait-until must wait])
722AT_KEYWORDS([ovs-vsctl])
7454ec7a
BP
723
724# Disable lcov for this test. All the programs running in parallel
725# race badly on access to profiling data.
726DISABLE_LCOV=true
727export DISABLE_LCOV
728
7db03f7c
BP
729OVS_VSCTL_SETUP
730
731# Start ovs-vsctls in background.
732(RUN_OVS_VSCTL([[wait-until o . bridges!=[] -- get bridge br10 other-config:abc]])) > stdout1 &
733(RUN_OVS_VSCTL([[wait-until bridge br1 -- get bridge br1 other-config:abc]])) > stdout2 &
734(RUN_OVS_VSCTL([[wait-until b br1 other-config={abc=def} -- get bridge br1 other-config]])) > stdout3 &
735(RUN_OVS_VSCTL([[wait-until port bond0 'bond_updelay>50' -- get port bond0 bond-updelay]])) > stdout4 &
736
737# Give the ovs-vsctls a chance to read the database
738sleep 1
739
e111e681 740AT_CHECK([RUN_OVS_VSCTL([add-br br10 -- set bridge br10 other-config:abc=quux])
7db03f7c
BP
741RUN_OVS_VSCTL([add-br br1 -- set bridge br1 other-config:abc=def -- add-bond br1 bond0 eth0 eth1 -- set port bond0 bond_updelay=500])],
742 [0], [], [], [OVS_VSCTL_CLEANUP])
743
744# Wait for the ovs-vsctls to finish.
745wait
746
747# Check output
748AT_CHECK([cat stdout1], [0], [quux
749], [], [OVS_VSCTL_CLEANUP])
750AT_CHECK([cat stdout2], [0], [def
751], [], [OVS_VSCTL_CLEANUP])
752AT_CHECK([cat stdout3], [0], [{abc=def}
753], [], [OVS_VSCTL_CLEANUP])
754AT_CHECK([cat stdout4], [0], [500
755], [], [OVS_VSCTL_CLEANUP])
756
757OVS_VSCTL_CLEANUP
758AT_CLEANUP
759
aed133bf
BP
760AT_SETUP([--id option on create, get commands])
761AT_KEYWORDS([ovs-vsctl])
762OVS_VSCTL_SETUP
763AT_CHECK([RUN_OVS_VSCTL([add-br br0],
764 [add-port br0 eth0],
765 [add-port br0 eth1])])
766AT_CHECK(
767 [RUN_OVS_VSCTL_TOGETHER(
768 [set bridge br0 mirrors=@m],
769 [--id=@eth0 get port eth0],
770 [--id=@eth1 get port eth1],
771 [--id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1])],
772 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
773AT_CHECK(
774 [perl $srcdir/uuidfilt.pl stdout], [0], [dnl
775
776
777
778<0>
779],
780 [], [OVS_VSCTL_CLEANUP])
781AT_CHECK(
782 [RUN_OVS_VSCTL(
783 [list port eth0 eth1],
784 [list mirror],
785 [list bridge br0])],
786 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
787AT_CHECK(
788 [sed -n -e '/uuid/p' -e '/name/p' -e '/mirrors/p' -e '/select/p' -e '/output/p' < stdout | $srcdir/uuidfilt.pl], [0], [dnl
789[_uuid : <0>
790name : "eth0"
791_uuid : <1>
792name : "eth1"
793_uuid : <2>
794name : mymirror
795output_port : <1>
796output_vlan : []
797select_all : false
798select_dst_port : [<0>]
799select_src_port : [<0>]
800select_vlan : []
801_uuid : <3>
802mirrors : [<2>]
803name : "br0"
804]],
805 [], [OVS_VSCTL_CLEANUP])
806OVS_VSCTL_CLEANUP
807AT_CLEANUP
808
5c414a2e
BP
809dnl This test really shows a bug -- "create" followed by "list" in
810dnl the same execution shows the wrong UUID on the "list" command.
811dnl The bug is documented in ovs-vsctl.8.
812AT_SETUP([created row UUID is wrong in same execution])
813AT_KEYWORDS([ovs-vsctl])
814OVS_VSCTL_SETUP
0d0f05b9 815AT_CHECK([RUN_OVS_VSCTL([create Bridge name=br0 -- list b])],
5c414a2e
BP
816 [0], [stdout], [], [OVS_VSCTL_CLEANUP])
817AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0],
818 [[<0>
bd76d25d
BP
819_uuid : <1>
820controller : []
821datapath_id : []
822datapath_type : ""
823external_ids : {}
31681a5d 824fail_mode : []
bd76d25d
BP
825flood_vlans : []
826mirrors : []
827name : "br0"
828netflow : []
829other_config : {}
830ports : []
831sflow : []
5c414a2e
BP
832]], [ignore], [test ! -e pid || kill `cat pid`])
833OVS_VSCTL_CLEANUP
834AT_CLEANUP