Merge "master" into "next".
[openvswitch] / 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 --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:ANY:emer --db=unix:socket -- command
19 ])])
20 m4_define([RUN_OVS_VSCTL_ONELINE],
21   [m4_foreach([command], [$@], [ovs-vsctl --no-wait -vreconnect:ANY: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:ANY: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 -- real bridges])
144
145 AT_SETUP([add-br a])
146 AT_KEYWORDS([ovs-vsctl])
147 OVS_VSCTL_SETUP
148 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
149 CHECK_BRIDGES([a, a, 0])
150 CHECK_PORTS([a])
151 CHECK_IFACES([a])
152 OVS_VSCTL_CLEANUP
153 AT_CLEANUP
154
155 AT_SETUP([add-br a, add-br a])
156 AT_KEYWORDS([ovs-vsctl])
157 OVS_VSCTL_SETUP
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])
162 OVS_VSCTL_CLEANUP
163 AT_CLEANUP
164
165 AT_SETUP([add-br a, add-br b])
166 AT_KEYWORDS([ovs-vsctl])
167 OVS_VSCTL_SETUP
168 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
169          [OVS_VSCTL_CLEANUP])
170 AT_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])
174 CHECK_BRIDGES([a, a, 0], [b, b, 0])
175 CHECK_PORTS([a])
176 CHECK_IFACES([a])
177 CHECK_PORTS([b])
178 CHECK_IFACES([b])
179 OVS_VSCTL_CLEANUP
180 AT_CLEANUP
181
182 AT_SETUP([add-br a, add-br b, del-br a])
183 AT_KEYWORDS([ovs-vsctl])
184 OVS_VSCTL_SETUP
185 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
186          [OVS_VSCTL_CLEANUP])
187 CHECK_BRIDGES([b, b, 0])
188 CHECK_PORTS([b])
189 CHECK_IFACES([b])
190 OVS_VSCTL_CLEANUP
191 AT_CLEANUP
192
193 AT_SETUP([add-br a, add-port a a1, add-port a a2])
194 AT_KEYWORDS([ovs-vsctl])
195 OVS_VSCTL_SETUP
196 AT_CHECK([RUN_OVS_VSCTL(
197    [add-br a],
198    [--if-exists del-br b],
199    [add-port a a1],
200    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
201 CHECK_BRIDGES([a, a, 0])
202 CHECK_PORTS([a], [a1], [a2])
203 CHECK_IFACES([a], [a1], [a2])
204 OVS_VSCTL_CLEANUP
205 AT_CLEANUP
206
207 AT_SETUP([add-br a, add-port a a1, add-port a a1])
208 AT_KEYWORDS([ovs-vsctl])
209 OVS_VSCTL_SETUP
210 AT_CHECK([RUN_OVS_VSCTL(
211    [add-br a], 
212    [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
213 AT_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
215 ], [OVS_VSCTL_CLEANUP])
216 OVS_VSCTL_CLEANUP
217 AT_CLEANUP
218
219 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
220 AT_KEYWORDS([ovs-vsctl])
221 OVS_VSCTL_SETUP
222 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
223    [add-br a], 
224    [add-br b], 
225    [add-port a a1],
226    [add-port b b1],
227    [--if-exists del-port b b2],
228    [del-br a])], [0], [
229
230
231
232
233
234 ], [], [OVS_VSCTL_CLEANUP])
235 CHECK_BRIDGES([b, b, 0])
236 CHECK_PORTS([b], [b1])
237 CHECK_IFACES([b], [b1])
238 OVS_VSCTL_CLEANUP
239 AT_CLEANUP
240
241 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
242 AT_KEYWORDS([ovs-vsctl])
243 OVS_VSCTL_SETUP
244 AT_CHECK([RUN_OVS_VSCTL(
245    [add-br a], 
246    [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
247 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-bond a bond0 a3 a1 a2])], [0], [], [],
248   [OVS_VSCTL_CLEANUP])
249 AT_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])
253 CHECK_BRIDGES([a, a, 0])
254 CHECK_PORTS([a], [bond0])
255 CHECK_IFACES([a], [a1], [a2], [a3])
256 OVS_VSCTL_CLEANUP
257 AT_CLEANUP
258
259 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
260 AT_KEYWORDS([ovs-vsctl])
261 OVS_VSCTL_SETUP
262 AT_CHECK([RUN_OVS_VSCTL(
263   [add-br a], 
264   [add-br b], 
265   [add-port a a1],
266   [--may-exist add-port b b1],
267   [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
268 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port b b1])], [0], [], [],
269   [OVS_VSCTL_CLEANUP])
270 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-port a b1])], [1], [], 
271   [ovs-vsctl: "--may-exist add-port a b1" but b1 is actually attached to bridge b
272 ],
273   [OVS_VSCTL_CLEANUP])
274 CHECK_BRIDGES([a, a, 0], [b, b, 0])
275 CHECK_PORTS([a])
276 CHECK_IFACES([a])
277 CHECK_PORTS([b], [b1])
278 CHECK_IFACES([b], [b1])
279 OVS_VSCTL_CLEANUP
280 AT_CLEANUP
281
282 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
283 AT_KEYWORDS([ovs-vsctl])
284 OVS_VSCTL_SETUP
285 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
286   [add-br a], 
287   [add-bond a bond0 a1 a2 a3],
288   [del-port bond0])], [0], [
289
290
291 ], [], [OVS_VSCTL_CLEANUP])
292 CHECK_BRIDGES([a, a, 0])
293 CHECK_PORTS([a])
294 OVS_VSCTL_CLEANUP
295 AT_CLEANUP
296
297 AT_SETUP([external IDs])
298 AT_KEYWORDS([ovs-vsctl])
299 OVS_VSCTL_SETUP
300 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
301   [add-br a], 
302   [add-port a a1],
303   [add-bond a bond0 a2 a3],
304   [br-set-external-id a key0 value0],
305   [set port a1 external-ids:key1=value1],
306   [set interface a2 external-ids:key2=value2],
307   [set interface a2 external-ids:key3=value3],
308   [set interface a3 external-ids:key4=value4],
309   [br-get-external-id a],
310   [br-get-external-id a key0],
311   [br-get-external-id a key1],
312   [br-set-external-id a key0 othervalue],
313   [br-get-external-id a],
314   [br-set-external-id a key0],
315   [br-get-external-id a],
316   [get port a1 external-ids],
317   [get interface a2 external-ids],
318   [get interface a3 external-ids])], [0], [
319
320
321
322
323
324
325
326 key0=value0
327 value0
328
329
330 key0=othervalue
331
332
333 {"key1"="value1"}
334 {"key2"="value2", "key3"="value3"}
335 {"key4"="value4"}
336 ], [], [OVS_VSCTL_CLEANUP])
337 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
338   [br-get-external-id a],
339   [get port a1 external-ids],
340   [get interface a2 external-ids],
341   [get interface a3 external-ids])], [0],
342 [
343 {"key1"="value1"}
344 {"key2"="value2", "key3"="value3"}
345 {"key4"="value4"}
346 ], [], [OVS_VSCTL_CLEANUP])
347 CHECK_BRIDGES([a, a, 0])
348 CHECK_PORTS([a], [a1], [bond0])
349 CHECK_IFACES([a], [a1], [a2], [a3])
350 OVS_VSCTL_CLEANUP
351 AT_CLEANUP
352
353 dnl ----------------------------------------------------------------------
354 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
355
356 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
357   [AT_CHECK(
358      [RUN_OVS_VSCTL(
359         [add-br xenbr0],
360         [--may-exist add-br xenbr0],
361         [add-port xenbr0 eth0],
362         [--may-exist add-port xenbr0 eth0],
363         [add-br xapi1 xenbr0 9],
364         [--may-exist add-br xapi1 xenbr0 9],
365         [add-port xapi1 eth0.9])],
366      [0], [], [], [OVS_VSCTL_CLEANUP])])
367
368 AT_SETUP([simple fake bridge])
369 AT_KEYWORDS([ovs-vsctl fake-bridge])
370 OVS_VSCTL_SETUP
371 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
372 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1])], [1], [],
373   [ovs-vsctl: "--may-exist add-br xapi1" but xapi1 is a VLAN bridge for VLAN 9
374 ], [OVS_VSCTL_CLEANUP])
375 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xxx 9])], [1], [],
376   [ovs-vsctl: "--may-exist add-br xapi1 xxx 9" but xapi1 has the wrong parent xenbr0
377 ], [OVS_VSCTL_CLEANUP])
378 AT_CHECK([RUN_OVS_VSCTL([--may-exist add-br xapi1 xenbr0 10])], [1], [],
379   [ovs-vsctl: "--may-exist add-br xapi1 xenbr0 10" but xapi1 is a VLAN bridge for the wrong VLAN 9
380 ], [OVS_VSCTL_CLEANUP])
381 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
382 CHECK_PORTS([xenbr0], [eth0])
383 CHECK_IFACES([xenbr0], [eth0])
384 CHECK_PORTS([xapi1], [eth0.9])
385 CHECK_IFACES([xapi1], [eth0.9])
386 OVS_VSCTL_CLEANUP
387 AT_CLEANUP
388
389 AT_SETUP([simple fake bridge + del-br fake bridge])
390 AT_KEYWORDS([ovs-vsctl fake-bridge])
391 OVS_VSCTL_SETUP
392 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
393 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
394 CHECK_BRIDGES([xenbr0, xenbr0, 0])
395 CHECK_PORTS([xenbr0], [eth0])
396 CHECK_IFACES([xenbr0], [eth0])
397 OVS_VSCTL_CLEANUP
398 AT_CLEANUP
399
400 AT_SETUP([simple fake bridge + del-br real bridge])
401 AT_KEYWORDS([ovs-vsctl fake-bridge])
402 OVS_VSCTL_SETUP
403 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
404 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
405 CHECK_BRIDGES
406 OVS_VSCTL_CLEANUP
407 AT_CLEANUP
408
409 AT_SETUP([simple fake bridge + external IDs])
410 AT_KEYWORDS([ovs-vsctl fake-bridge])
411 OVS_VSCTL_SETUP
412 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
413 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
414   [br-set-external-id xenbr0 key0 value0],
415   [br-set-external-id xapi1 key1 value1],
416   [br-get-external-id xenbr0],
417   [br-get-external-id xenbr0 key0],
418   [br-get-external-id xapi1],
419   [br-get-external-id xapi1 key1])], [0], [
420
421 key0=value0
422 value0
423 key1=value1
424 value1
425 ], [], [OVS_VSCTL_CLEANUP])
426 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
427 CHECK_PORTS([xenbr0], [eth0])
428 CHECK_IFACES([xenbr0], [eth0])
429 CHECK_PORTS([xapi1], [eth0.9])
430 CHECK_IFACES([xapi1], [eth0.9])
431 OVS_VSCTL_CLEANUP
432 AT_CLEANUP
433
434 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
435   [AT_CHECK(
436      [RUN_OVS_VSCTL(
437         [add-br xapi1],
438         [add-bond xapi1 bond0 eth0 eth1],
439         [add-br xapi2 xapi1 11],
440         [add-port xapi2 bond0.11])],
441      [0], [], [], [OVS_VSCTL_CLEANUP])])
442
443 AT_SETUP([fake bridge on bond])
444 AT_KEYWORDS([ovs-vsctl fake-bridge])
445 OVS_VSCTL_SETUP
446 OVS_VSCTL_SETUP_BOND_FAKE_CONF
447 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
448 CHECK_PORTS([xapi1], [bond0])
449 CHECK_IFACES([xapi1], [eth0], [eth1])
450 CHECK_PORTS([xapi2], [bond0.11])
451 CHECK_IFACES([xapi2], [bond0.11])
452 OVS_VSCTL_CLEANUP
453 AT_CLEANUP
454
455 AT_SETUP([fake bridge on bond + del-br fake bridge])
456 AT_KEYWORDS([ovs-vsctl fake-bridge])
457 OVS_VSCTL_SETUP
458 OVS_VSCTL_SETUP_BOND_FAKE_CONF
459 AT_CHECK([RUN_OVS_VSCTL_ONELINE([del-br xapi2])], [0], [
460 ], [], [OVS_VSCTL_CLEANUP])
461 CHECK_BRIDGES([xapi1, xapi1, 0])
462 CHECK_PORTS([xapi1], [bond0])
463 CHECK_IFACES([xapi1], [eth0], [eth1])
464 OVS_VSCTL_CLEANUP
465 AT_CLEANUP
466
467 AT_SETUP([fake bridge on bond + del-br real bridge])
468 AT_KEYWORDS([ovs-vsctl fake-bridge])
469 OVS_VSCTL_SETUP
470 OVS_VSCTL_SETUP_BOND_FAKE_CONF
471 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
472 CHECK_BRIDGES
473 OVS_VSCTL_CLEANUP
474 AT_CLEANUP
475
476 dnl ----------------------------------------------------------------------
477 AT_BANNER([ovs-vsctl unit tests -- database commands])
478
479 AT_SETUP([database commands -- positive checks])
480 AT_KEYWORDS([ovs-vsctl])
481 OVS_VSCTL_SETUP
482 AT_CHECK([RUN_OVS_VSCTL([create b name=br0])], 
483   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
484 cp stdout out1
485 AT_CHECK([RUN_OVS_VSCTL([list b])], 
486   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
487 cp stdout out2
488 AT_CHECK([perl $srcdir/uuidfilt.pl out1 out2], [0], 
489   [[<0>
490 _uuid               : <0>
491 controller          : []
492 datapath_id         : []
493 datapath_type       : ""
494 external_ids        : {}
495 flood_vlans         : []
496 mirrors             : []
497 name                : "br0"
498 netflow             : []
499 other_config        : {}
500 ports               : []
501 sflow               : []
502 ]], [ignore], [test ! -e pid || kill `cat pid`])
503 AT_CHECK(
504   [RUN_OVS_VSCTL(
505     [set bridge br0 \
506       'other_config:datapath_id="0123456789ab"' \
507       'other_config:hwaddr="00:11:22:33:44:55"' \
508       'external-ids={"xs-network-uuids"="9c45f225-a7cf-439d-976d-83db6271fda1"}' -- \
509      add bridge br0 external_ids '"xs-network-names"="local; remote; cloud"'])], 
510   [0], [], [], [OVS_VSCTL_CLEANUP])
511 AT_CHECK([RUN_OVS_VSCTL_ONELINE([get bridge br0 other_config external-ids])], 
512   [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"}
513 ], [], [OVS_VSCTL_CLEANUP])
514 AT_CHECK([RUN_OVS_VSCTL([get bridge br0 other_config:hwaddr -- --if-exists get bridge br0 other-config:nonexistent])], 
515   [0], ["00:11:22:33:44:55"
516
517 ], [], [OVS_VSCTL_CLEANUP])
518 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config hwaddr 'datapath_id=""' -- get br br0 other_config])], 
519   [0], [{datapath_id="0123456789ab"}
520 ], [], [OVS_VSCTL_CLEANUP])
521 AT_CHECK([RUN_OVS_VSCTL([remove br br0 other_config 'datapath_id="0123456789ab"' -- get br br0 other_config])], 
522   [0], [{}
523 ], [], [OVS_VSCTL_CLEANUP])
524 AT_CHECK([RUN_OVS_VSCTL([clear br br0 external-ids -- get br br0 external_ids])], 
525   [0], [{}
526 ], [], [OVS_VSCTL_CLEANUP])
527 AT_CHECK([RUN_OVS_VSCTL([destroy b br0])], 
528   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
529 AT_CHECK([RUN_OVS_VSCTL([list b])], 
530   [0], [], [], [OVS_VSCTL_CLEANUP])
531 OVS_VSCTL_CLEANUP
532 AT_CLEANUP
533
534 AT_SETUP([database commands -- negative checks])
535 AT_KEYWORDS([ovs-vsctl])
536 OVS_VSCTL_SETUP
537 AT_CHECK([RUN_OVS_VSCTL([create b name=br0])], 
538   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
539 AT_CHECK([RUN_OVS_VSCTL([add-br br1])], 
540   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
541 AT_CHECK([RUN_OVS_VSCTL([set-controller br1 tcp:127.0.0.1])], 
542   [0], [ignore], [], [OVS_VSCTL_CLEANUP])
543 AT_CHECK([RUN_OVS_VSCTL([create n targets='"1.2.3.4:567"'])], 
544   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
545 cp stdout netflow-uuid
546 AT_CHECK([RUN_OVS_VSCTL([list n `cat netflow-uuid`])],
547   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
548 AT_CHECK([perl $srcdir/uuidfilt.pl netflow-uuid stdout], [0], 
549   [[<0>
550 _uuid               : <0>
551 active_timeout      : 0
552 add_id_to_interface : false
553 engine_id           : []
554 engine_type         : []
555 targets             : ["1.2.3.4:567"]
556 ]], [ignore], [test ! -e pid || kill `cat pid`])
557 AT_CHECK([RUN_OVS_VSCTL([list interx x])], 
558   [1], [], [ovs-vsctl: unknown table "interx"
559 ], [OVS_VSCTL_CLEANUP])
560 AT_CHECK([RUN_OVS_VSCTL([list b x])], 
561   [1], [], [ovs-vsctl: no row "x" in table Bridge
562 ], [OVS_VSCTL_CLEANUP])
563 AT_CHECK([RUN_OVS_VSCTL([list b br])], 
564   [1], [], [ovs-vsctl: multiple rows in Bridge match "br"
565 ], [OVS_VSCTL_CLEANUP])
566 AT_CHECK([RUN_OVS_VSCTL([get b br0 d])], 
567   [1], [], [ovs-vsctl: Bridge contains more than one column whose name matches "d"
568 ], [OVS_VSCTL_CLEANUP])
569 AT_CHECK([RUN_OVS_VSCTL([get b br0 x])], 
570   [1], [], [ovs-vsctl: Bridge does not contain a column whose name matches "x"
571 ], [OVS_VSCTL_CLEANUP])
572 AT_CHECK([RUN_OVS_VSCTL([get b br0 :y=z])], 
573   [1], [], [ovs-vsctl: :y=z: missing column name
574 ], [OVS_VSCTL_CLEANUP])
575 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:y=z])], 
576   [1], [], [ovs-vsctl: datapath_id:y=z: value not accepted here
577 ], [OVS_VSCTL_CLEANUP])
578 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id::])], 
579   [1], [], [ovs-vsctl: datapath_id::: trailing garbage ":" in argument
580 ], [OVS_VSCTL_CLEANUP])
581 AT_CHECK([RUN_OVS_VSCTL([get b br0 datapath_id:x])], 
582   [1], [], [ovs-vsctl: cannot specify key to get for non-map column datapath_id
583 ], [OVS_VSCTL_CLEANUP])
584 AT_CHECK([RUN_OVS_VSCTL([get b br0 external_ids:x])], 
585   [1], [], [ovs-vsctl: no key "x" in Bridge record "br0" column external_ids
586 ], [OVS_VSCTL_CLEANUP])
587 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=-1])], 
588   [1], [], [ovs-vsctl: constraint violation: -1 is not in the valid range 0 to 4095 (inclusive)
589 ], [OVS_VSCTL_CLEANUP])
590 AT_CHECK([RUN_OVS_VSCTL([set b br0 flood_vlans=4096])], 
591   [1], [], [ovs-vsctl: constraint violation: 4096 is not in the valid range 0 to 4095 (inclusive)
592 ], [OVS_VSCTL_CLEANUP])
593 if test "$HAVE_PCRE" = yes; then
594     AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])], 
595       [1], [], [ovs-vsctl: constraint violation: "xyz" is not a either "in-band" or "out-of-band"
596 ], [OVS_VSCTL_CLEANUP])
597 else
598     AT_CHECK([RUN_OVS_VSCTL([set c br1 'connection-mode=xyz'])], 
599       [0], [], [], [OVS_VSCTL_CLEANUP])
600 fi
601 AT_CHECK([RUN_OVS_VSCTL([set c br1 connection-mode:x=y])], 
602   [1], [], [ovs-vsctl: cannot specify key to set for non-map column connection_mode
603 ], [OVS_VSCTL_CLEANUP])
604 AT_CHECK([RUN_OVS_VSCTL([add b br1 datapath_id x y])], 
605   [1], [], [ovs-vsctl: "add" operation would put 2 values in column datapath_id of table Bridge but the maximum number is 1
606 ], [OVS_VSCTL_CLEANUP])
607 AT_CHECK([RUN_OVS_VSCTL([remove n `cat netflow-uuid` targets '"1.2.3.4:567"'])], 
608   [1], [], [ovs-vsctl: "remove" operation would put 0 values in column targets of table NetFlow but the minimun number is 1
609 ], [OVS_VSCTL_CLEANUP])
610 AT_CHECK([RUN_OVS_VSCTL([clear n `cat netflow-uuid` targets])], 
611   [1], [], [ovs-vsctl: "clear" operation cannot be applied to column targets of table NetFlow, which is not allowed to be empty
612 ], [OVS_VSCTL_CLEANUP])
613 AT_CHECK([RUN_OVS_VSCTL([destroy b br2])], 
614   [1], [], [ovs-vsctl: no row "br2" in table Bridge
615 ], [OVS_VSCTL_CLEANUP])
616 OVS_VSCTL_CLEANUP
617 AT_CLEANUP
618
619 dnl This test really shows a bug -- "create" followed by "list" in
620 dnl the same execution shows the wrong UUID on the "list" command.
621 dnl The bug is documented in ovs-vsctl.8.
622 AT_SETUP([created row UUID is wrong in same execution])
623 AT_KEYWORDS([ovs-vsctl])
624 OVS_VSCTL_SETUP
625 AT_CHECK([RUN_OVS_VSCTL([create Bridge name=br0 -- list b])], 
626   [0], [stdout], [], [OVS_VSCTL_CLEANUP])
627 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], 
628   [[<0>
629 _uuid               : <1>
630 controller          : []
631 datapath_id         : []
632 datapath_type       : ""
633 external_ids        : {}
634 flood_vlans         : []
635 mirrors             : []
636 name                : "br0"
637 netflow             : []
638 other_config        : {}
639 ports               : []
640 sflow               : []
641 ]], [ignore], [test ! -e pid || kill `cat pid`])
642 OVS_VSCTL_CLEANUP
643 AT_CLEANUP