ovs-vsctl: New commands for working with external IDs.
[sliver-openvswitch.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   [OVS_CHECK_LCOV(
7      [ovsdb-tool create db $abs_builddir/../vswitchd/vswitch-idl.ovsschema], 
8      [0], [stdout], [ignore])
9    OVS_CHECK_LCOV(
10      [[ovsdb-tool transact db \
11         '[{"op": "insert",
12            "table": "Open_vSwitch",
13            "row": {}}]']],
14      [0], [ignore], [ignore])
15    AT_CHECK([ovsdb-server --detach --pidfile=$PWD/pid --listen=punix:socket --unixctl=$PWD/unixctl db >/dev/null 2>&1], [0], [ignore], [ignore])])
16
17 dnl OVS_VSCTL_CLEANUP
18 dnl
19 dnl Kills off the database server.
20 m4_define([OVS_VSCTL_CLEANUP], [test ! -e pid || kill `cat pid`])
21
22 dnl RUN_OVS_VSCTL(COMMAND, ...)
23 dnl
24 dnl Executes each ovs-vsctl COMMAND.
25 m4_define([RUN_OVS_VSCTL],
26   [m4_foreach([command], [$@], [ovs-vsctl -vreconnect:ANY:emer --db=unix:socket command
27 ])])
28
29 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
30 dnl
31 dnl Executes each ovs-vsctl COMMAND in a single run of ovs-vsctl.
32 m4_define([RUN_OVS_VSCTL_TOGETHER],
33   [ovs-vsctl -vreconnect:ANY:emer --db=unix:socket m4_join([ -- ], $@)])
34
35 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
36 dnl
37 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
38 dnl which must be in alphabetical order.  Also checks that each BRIDGE has the
39 dnl specified PARENT and is on the given VLAN.
40 m4_define([_CHECK_BRIDGE],
41   [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
42 ], [], [OVS_VSCTL_CLEANUP])
43
44    # Check br-to-vlan, without --oneline.
45    AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
46 ], [], [OVS_VSCTL_CLEANUP])
47    # Check br-to-vlan, with --oneline.
48    # (This particular test is interesting with --oneline because it returns
49    # an integer instead of a string and that can cause type mismatches inside
50    # python if not done carefully.)
51    AT_CHECK([RUN_OVS_VSCTL([--oneline br-to-vlan $1])], [0], [$3
52 ], [], [OVS_VSCTL_CLEANUP])
53
54    # Check multiple queries in a single run.
55    AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
56 [$2
57 $3
58 ], [], [OVS_VSCTL_CLEANUP])])
59 m4_define([CHECK_BRIDGES],
60   [dnl Check that the bridges appear on list-br, without --oneline.
61    AT_CHECK(
62      [RUN_OVS_VSCTL([list-br])],
63      [0],
64      [m4_foreach([brinfo], [$@], [m4_car(brinfo)
65 ])],
66      [],
67      [OVS_VSCTL_CLEANUP])
68
69    dnl Check that the bridges appear on list-br, with --oneline.
70    AT_CHECK(
71      [RUN_OVS_VSCTL([--oneline list-br])],
72      [0],
73      [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
74 ],
75      [],
76      [OVS_VSCTL_CLEANUP])
77
78    dnl Check that each bridge exists according to br-exists and that
79    dnl a bridge that should not exist does not.
80    m4_foreach([brinfo], [$@], 
81               [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])], [0], [],
82                         [], [OVS_VSCTL_CLEANUP])])
83    AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2], [], [],
84             [OVS_VSCTL_CLEANUP])
85
86    dnl Check that each bridge has the expected parent and VLAN.
87    m4_map([_CHECK_BRIDGE], [$@])])
88
89 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
90 dnl
91 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
92 dnl list of ports, which must be in alphabetical order.  Also checks
93 dnl that "ovs-vsctl port-to-br" reports that each port is
94 dnl in BRIDGE.
95 m4_define([CHECK_PORTS],
96   [dnl Check ports without --oneline.
97    AT_CHECK(
98      [RUN_OVS_VSCTL([list-ports $1])],
99      [0],
100      [m4_foreach([port], m4_cdr($@), [port
101 ])],
102      [],
103      [OVS_VSCTL_CLEANUP])
104
105    dnl Check ports with --oneline.
106    AT_CHECK(
107      [RUN_OVS_VSCTL([--oneline list-ports $1])],
108      [0],
109      [m4_join([\n], m4_shift($@))
110 ],
111      [],
112      [OVS_VSCTL_CLEANUP])
113    AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [],
114             [ovs-vsctl: no port named $1
115 ],
116             [OVS_VSCTL_CLEANUP])
117    m4_foreach(
118      [port], m4_cdr($@), 
119      [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
120 ], [], [OVS_VSCTL_CLEANUP])])])
121
122 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
123 dnl
124 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
125 dnl list of ifaces, which must be in alphabetical order.  Also checks
126 dnl that "ovs-vsctl iface-to-br" reports that each interface is
127 dnl in BRIDGE.
128 m4_define([CHECK_IFACES],
129   [AT_CHECK(
130      [RUN_OVS_VSCTL([list-ifaces $1])],
131      [0],
132      [m4_foreach([iface], m4_cdr($@), [iface
133 ])],
134      [],
135      [OVS_VSCTL_CLEANUP])
136    AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
137             [ovs-vsctl: no interface named $1
138 ],
139             [OVS_VSCTL_CLEANUP])
140    m4_foreach(
141      [iface], m4_cdr($@), 
142      [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
143 ],
144                [], [OVS_VSCTL_CLEANUP])])])
145
146 dnl ----------------------------------------------------------------------
147 AT_BANNER([ovs-vsctl unit tests -- real bridges])
148
149 AT_SETUP([add-br a])
150 AT_KEYWORDS([ovs-vsctl])
151 OVS_VSCTL_SETUP
152 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
153 CHECK_BRIDGES([a, a, 0])
154 CHECK_PORTS([a])
155 CHECK_IFACES([a])
156 OVS_VSCTL_CLEANUP
157 AT_CLEANUP
158
159 AT_SETUP([add-br a, add-br a])
160 AT_KEYWORDS([ovs-vsctl])
161 OVS_VSCTL_SETUP
162 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
163 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
164   [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
165 ], [OVS_VSCTL_CLEANUP])
166 OVS_VSCTL_CLEANUP
167 AT_CLEANUP
168
169 AT_SETUP([add-br a, add-br b])
170 AT_KEYWORDS([ovs-vsctl])
171 OVS_VSCTL_SETUP
172 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
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    [add-port a a1],
199    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
200 CHECK_BRIDGES([a, a, 0])
201 CHECK_PORTS([a], [a1], [a2])
202 CHECK_IFACES([a], [a1], [a2])
203 OVS_VSCTL_CLEANUP
204 AT_CLEANUP
205
206 AT_SETUP([add-br a, add-port a a1, add-port a a1])
207 AT_KEYWORDS([ovs-vsctl])
208 OVS_VSCTL_SETUP
209 AT_CHECK([RUN_OVS_VSCTL(
210    [add-br a], 
211    [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
212 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
213   [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
214 ], [OVS_VSCTL_CLEANUP])
215 OVS_VSCTL_CLEANUP
216 AT_CLEANUP
217
218 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
219 AT_KEYWORDS([ovs-vsctl])
220 OVS_VSCTL_SETUP
221 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
222    [add-br a], 
223    [add-br b], 
224    [add-port a a1],
225    [add-port b b1],
226    [del-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
227 CHECK_BRIDGES([b, b, 0])
228 CHECK_PORTS([b], [b1])
229 CHECK_IFACES([b], [b1])
230 OVS_VSCTL_CLEANUP
231 AT_CLEANUP
232
233 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
234 AT_KEYWORDS([ovs-vsctl])
235 OVS_VSCTL_SETUP
236 AT_CHECK([RUN_OVS_VSCTL(
237    [add-br a], 
238    [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
239 CHECK_BRIDGES([a, a, 0])
240 CHECK_PORTS([a], [bond0])
241 CHECK_IFACES([a], [a1], [a2], [a3])
242 OVS_VSCTL_CLEANUP
243 AT_CLEANUP
244
245 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
246 AT_KEYWORDS([ovs-vsctl])
247 OVS_VSCTL_SETUP
248 AT_CHECK([RUN_OVS_VSCTL(
249   [add-br a], 
250   [add-br b], 
251   [add-port a a1],
252   [add-port b b1],
253   [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
254 CHECK_BRIDGES([a, a, 0], [b, b, 0])
255 CHECK_PORTS([a])
256 CHECK_IFACES([a])
257 CHECK_PORTS([b], [b1])
258 CHECK_IFACES([b], [b1])
259 OVS_VSCTL_CLEANUP
260 AT_CLEANUP
261
262 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
263 AT_KEYWORDS([ovs-vsctl])
264 OVS_VSCTL_SETUP
265 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
266   [add-br a], 
267   [add-bond a bond0 a1 a2 a3],
268   [del-port bond0])], [0], [], [], [OVS_VSCTL_CLEANUP])
269 CHECK_BRIDGES([a, a, 0])
270 CHECK_PORTS([a])
271 OVS_VSCTL_CLEANUP
272 AT_CLEANUP
273
274 AT_SETUP([external IDs])
275 AT_KEYWORDS([ovs-vsctl])
276 OVS_VSCTL_SETUP
277 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
278   [--oneline add-br a], 
279   [add-port a a1],
280   [add-bond a bond0 a2 a3],
281   [br-set-external-id a key0 value0],
282   [port-set-external-id a1 key1 value1],
283   [iface-set-external-id a2 key2 value2],
284   [iface-set-external-id a2 key3 value3],
285   [iface-set-external-id a3 key4 value4],
286   [br-get-external-id a],
287   [br-get-external-id a key0],
288   [br-get-external-id a key1],
289   [br-set-external-id a key0 othervalue],
290   [br-get-external-id a],
291   [br-set-external-id a key0],
292   [br-get-external-id a],
293   [port-get-external-id a1],
294   [iface-get-external-id a2],
295   [iface-get-external-id a3])], [0], [
296
297
298
299
300
301
302
303 key0=value0
304 value0
305
306
307 key0=othervalue
308
309
310 key1=value1
311 key2=value2\nkey3=value3
312 key4=value4
313 ], [], [OVS_VSCTL_CLEANUP])
314 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
315   [--oneline br-get-external-id a],
316   [port-get-external-id a1],
317   [iface-get-external-id a2],
318   [iface-get-external-id a3])], [0],
319 [
320 key1=value1
321 key2=value2\nkey3=value3
322 key4=value4
323 ], [], [OVS_VSCTL_CLEANUP])
324 CHECK_BRIDGES([a, a, 0])
325 CHECK_PORTS([a], [a1], [bond0])
326 CHECK_IFACES([a], [a1], [a2], [a3])
327 OVS_VSCTL_CLEANUP
328 AT_CLEANUP
329
330 dnl ----------------------------------------------------------------------
331 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
332
333 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
334   [AT_CHECK(
335      [RUN_OVS_VSCTL(
336         [add-br xenbr0],
337         [add-port xenbr0 eth0],
338         [add-br xapi1 xenbr0 9],
339         [add-port xapi1 eth0.9])],
340      [0], [], [], [OVS_VSCTL_CLEANUP])])
341
342 AT_SETUP([simple fake bridge])
343 AT_KEYWORDS([ovs-vsctl fake-bridge])
344 OVS_VSCTL_SETUP
345 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
346 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
347 CHECK_PORTS([xenbr0], [eth0])
348 CHECK_IFACES([xenbr0], [eth0])
349 CHECK_PORTS([xapi1], [eth0.9])
350 CHECK_IFACES([xapi1], [eth0.9])
351 OVS_VSCTL_CLEANUP
352 AT_CLEANUP
353
354 AT_SETUP([simple fake bridge + del-br fake bridge])
355 AT_KEYWORDS([ovs-vsctl fake-bridge])
356 OVS_VSCTL_SETUP
357 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
358 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
359 CHECK_BRIDGES([xenbr0, xenbr0, 0])
360 CHECK_PORTS([xenbr0], [eth0])
361 CHECK_IFACES([xenbr0], [eth0])
362 OVS_VSCTL_CLEANUP
363 AT_CLEANUP
364
365 AT_SETUP([simple fake bridge + del-br real bridge])
366 AT_KEYWORDS([ovs-vsctl fake-bridge])
367 OVS_VSCTL_SETUP
368 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
369 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
370 CHECK_BRIDGES
371 OVS_VSCTL_CLEANUP
372 AT_CLEANUP
373
374 AT_SETUP([simple fake bridge + external IDs])
375 AT_KEYWORDS([ovs-vsctl fake-bridge])
376 OVS_VSCTL_SETUP
377 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
378 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
379   [--oneline br-set-external-id xenbr0 key0 value0],
380   [br-set-external-id xapi1 key1 value1],
381   [br-get-external-id xenbr0],
382   [br-get-external-id xenbr0 key0],
383   [br-get-external-id xapi1],
384   [br-get-external-id xapi1 key1])], [0], [
385
386 key0=value0
387 value0
388 key1=value1
389 value1
390 ], [], [OVS_VSCTL_CLEANUP])
391 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
392 CHECK_PORTS([xenbr0], [eth0])
393 CHECK_IFACES([xenbr0], [eth0])
394 CHECK_PORTS([xapi1], [eth0.9])
395 CHECK_IFACES([xapi1], [eth0.9])
396 OVS_VSCTL_CLEANUP
397 AT_CLEANUP
398
399 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
400   [AT_CHECK(
401      [RUN_OVS_VSCTL(
402         [add-br xapi1],
403         [add-bond xapi1 bond0 eth0 eth1],
404         [add-br xapi2 xapi1 11],
405         [add-port xapi2 bond0.11])],
406      [0], [], [], [OVS_VSCTL_CLEANUP])])
407
408 AT_SETUP([fake bridge on bond])
409 AT_KEYWORDS([ovs-vsctl fake-bridge])
410 OVS_VSCTL_SETUP
411 OVS_VSCTL_SETUP_BOND_FAKE_CONF
412 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
413 CHECK_PORTS([xapi1], [bond0])
414 CHECK_IFACES([xapi1], [eth0], [eth1])
415 CHECK_PORTS([xapi2], [bond0.11])
416 CHECK_IFACES([xapi2], [bond0.11])
417 OVS_VSCTL_CLEANUP
418 AT_CLEANUP
419
420 AT_SETUP([fake bridge on bond + del-br fake bridge])
421 AT_KEYWORDS([ovs-vsctl fake-bridge])
422 OVS_VSCTL_SETUP
423 OVS_VSCTL_SETUP_BOND_FAKE_CONF
424 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
425 ], [], [OVS_VSCTL_CLEANUP])
426 CHECK_BRIDGES([xapi1, xapi1, 0])
427 CHECK_PORTS([xapi1], [bond0])
428 CHECK_IFACES([xapi1], [eth0], [eth1])
429 OVS_VSCTL_CLEANUP
430 AT_CLEANUP
431
432 AT_SETUP([fake bridge on bond + del-br real bridge])
433 AT_KEYWORDS([ovs-vsctl fake-bridge])
434 OVS_VSCTL_SETUP
435 OVS_VSCTL_SETUP_BOND_FAKE_CONF
436 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
437 CHECK_BRIDGES
438 OVS_VSCTL_CLEANUP
439 AT_CLEANUP