vsctl: Start making it work with ovsdb.
[cascardo/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   [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    AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [],
135             [ovs-vsctl: no interface named $1
136 ],
137             [OVS_VSCTL_CLEANUP])
138    m4_foreach(
139      [iface], m4_cdr($@), 
140      [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
141 ],
142                [], [OVS_VSCTL_CLEANUP])])])
143
144 dnl ----------------------------------------------------------------------
145 AT_BANNER([ovs-vsctl unit tests -- real bridges])
146
147 AT_SETUP([add-br a])
148 AT_KEYWORDS([ovs-vsctl])
149 OVS_VSCTL_SETUP
150 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
151 CHECK_BRIDGES([a, a, 0])
152 CHECK_PORTS([a])
153 CHECK_IFACES([a])
154 OVS_VSCTL_CLEANUP
155 AT_CLEANUP
156
157 AT_SETUP([add-br a, add-br a])
158 AT_KEYWORDS([ovs-vsctl])
159 OVS_VSCTL_SETUP
160 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
161 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
162   [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
163 ], [OVS_VSCTL_CLEANUP])
164 OVS_VSCTL_CLEANUP
165 AT_CLEANUP
166
167 AT_SETUP([add-br a, add-br b])
168 AT_KEYWORDS([ovs-vsctl])
169 OVS_VSCTL_SETUP
170 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])], [0], [], [],
171          [OVS_VSCTL_CLEANUP])
172 CHECK_BRIDGES([a, a, 0], [b, b, 0])
173 CHECK_PORTS([a])
174 CHECK_IFACES([a])
175 CHECK_PORTS([b])
176 CHECK_IFACES([b])
177 OVS_VSCTL_CLEANUP
178 AT_CLEANUP
179
180 AT_SETUP([add-br a, add-br b, del-br a])
181 AT_KEYWORDS([ovs-vsctl])
182 OVS_VSCTL_SETUP
183 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])], [0], [], [],
184          [OVS_VSCTL_CLEANUP])
185 CHECK_BRIDGES([b, b, 0])
186 CHECK_PORTS([b])
187 CHECK_IFACES([b])
188 OVS_VSCTL_CLEANUP
189 AT_CLEANUP
190
191 AT_SETUP([add-br a, add-port a a1, add-port a a2])
192 AT_KEYWORDS([ovs-vsctl])
193 OVS_VSCTL_SETUP
194 AT_CHECK([RUN_OVS_VSCTL(
195    [add-br a], 
196    [add-port a a1],
197    [add-port a a2])], [0], [], [], [OVS_VSCTL_CLEANUP])
198 CHECK_BRIDGES([a, a, 0])
199 CHECK_PORTS([a], [a1], [a2])
200 CHECK_IFACES([a], [a1], [a2])
201 OVS_VSCTL_CLEANUP
202 AT_CLEANUP
203
204 AT_SETUP([add-br a, add-port a a1, add-port a a1])
205 AT_KEYWORDS([ovs-vsctl])
206 OVS_VSCTL_SETUP
207 AT_CHECK([RUN_OVS_VSCTL(
208    [add-br a], 
209    [add-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
210 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
211   [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
212 ], [OVS_VSCTL_CLEANUP])
213 OVS_VSCTL_CLEANUP
214 AT_CLEANUP
215
216 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
217 AT_KEYWORDS([ovs-vsctl])
218 OVS_VSCTL_SETUP
219 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
220    [add-br a], 
221    [add-br b], 
222    [add-port a a1],
223    [add-port b b1],
224    [del-br a])], [0], [], [], [OVS_VSCTL_CLEANUP])
225 CHECK_BRIDGES([b, b, 0])
226 CHECK_PORTS([b], [b1])
227 CHECK_IFACES([b], [b1])
228 OVS_VSCTL_CLEANUP
229 AT_CLEANUP
230
231 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
232 AT_KEYWORDS([ovs-vsctl])
233 OVS_VSCTL_SETUP
234 AT_CHECK([RUN_OVS_VSCTL(
235    [add-br a], 
236    [add-bond a bond0 a1 a2 a3])], [0], [], [], [OVS_VSCTL_CLEANUP])
237 CHECK_BRIDGES([a, a, 0])
238 CHECK_PORTS([a], [bond0])
239 CHECK_IFACES([a], [a1], [a2], [a3])
240 OVS_VSCTL_CLEANUP
241 AT_CLEANUP
242
243 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
244 AT_KEYWORDS([ovs-vsctl])
245 OVS_VSCTL_SETUP
246 AT_CHECK([RUN_OVS_VSCTL(
247   [add-br a], 
248   [add-br b], 
249   [add-port a a1],
250   [add-port b b1],
251   [del-port a a1])], [0], [], [], [OVS_VSCTL_CLEANUP])
252 CHECK_BRIDGES([a, a, 0], [b, b, 0])
253 CHECK_PORTS([a])
254 CHECK_IFACES([a])
255 CHECK_PORTS([b], [b1])
256 CHECK_IFACES([b], [b1])
257 OVS_VSCTL_CLEANUP
258 AT_CLEANUP
259
260 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
261 AT_KEYWORDS([ovs-vsctl])
262 OVS_VSCTL_SETUP
263 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
264   [add-br a], 
265   [add-bond a bond0 a1 a2 a3],
266   [del-port bond0])], [0], [], [], [OVS_VSCTL_CLEANUP])
267 CHECK_BRIDGES([a, a, 0])
268 CHECK_PORTS([a])
269 OVS_VSCTL_CLEANUP
270 AT_CLEANUP
271
272 m4_define([ovs_vsctl_disabled_tests], [
273 dnl ----------------------------------------------------------------------
274 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
275
276 m4_define([SIMPLE_FAKE_CONF], [dnl
277 bridge.xenbr0.port=eth0
278 bridge.xenbr0.port=eth0.9
279 bridge.xenbr0.port=xapi1
280 bridge.xenbr0.port=xenbr0
281 iface.xapi1.fake-bridge=true
282 iface.xapi1.internal=true
283 vlan.eth0.9.tag=9
284 vlan.xapi1.tag=9
285 ])
286
287 AT_SETUP([simple fake bridge])
288 AT_KEYWORDS([ovs-vsctl fake-bridge])
289 OVS_VSCTL_SETUP
290 AT_CHECK([RUN_OVS_VSCTL(
291   [add-br xenbr0],
292   [add-port xenbr0 eth0],
293   [add-br xapi1 xenbr0 9],
294   [add-port xapi1 eth0.9])])
295 AT_CHECK([cat conf], [0], [SIMPLE_FAKE_CONF])
296 CHECK_BRIDGES([xenbr0, xenbr0, 0], [xapi1, xenbr0, 9])
297 CHECK_PORTS([xenbr0], [eth0])
298 CHECK_IFACES([xenbr0], [eth0])
299 CHECK_PORTS([xapi1], [eth0.9])
300 CHECK_IFACES([xapi1], [eth0.9])
301 OVS_VSCTL_CLEANUP
302 AT_CLEANUP
303
304 AT_SETUP([simple fake bridge + del-br fake bridge])
305 AT_KEYWORDS([ovs-vsctl fake-bridge])
306 OVS_VSCTL_SETUP
307 AT_DATA([conf], [SIMPLE_FAKE_CONF])
308 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
309 AT_CHECK([cat conf], [0], [dnl
310 bridge.xenbr0.port=eth0
311 bridge.xenbr0.port=xenbr0
312 ])
313 CHECK_BRIDGES([xenbr0, xenbr0, 0])
314 CHECK_PORTS([xenbr0], [eth0])
315 CHECK_IFACES([xenbr0], [eth0])
316 OVS_VSCTL_CLEANUP
317 AT_CLEANUP
318
319 AT_SETUP([simple fake bridge + del-br real bridge])
320 AT_KEYWORDS([ovs-vsctl fake-bridge])
321 OVS_VSCTL_SETUP
322 AT_DATA([conf], [SIMPLE_FAKE_CONF])
323 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])])
324 AT_CHECK([cat conf], [0], [])
325 CHECK_BRIDGES
326 OVS_VSCTL_CLEANUP
327 AT_CLEANUP
328
329 m4_define([BOND_FAKE_CONF], [dnl
330 bonding.bond0.slave=eth0
331 bonding.bond0.slave=eth1
332 bridge.xapi1.port=bond0
333 bridge.xapi1.port=bond0.11
334 bridge.xapi1.port=xapi1
335 bridge.xapi1.port=xapi2
336 iface.xapi2.fake-bridge=true
337 iface.xapi2.internal=true
338 vlan.bond0.11.tag=11
339 vlan.xapi2.tag=11
340 ])
341
342 AT_SETUP([fake bridge on bond])
343 AT_KEYWORDS([ovs-vsctl fake-bridge])
344 OVS_VSCTL_SETUP
345 AT_CHECK([RUN_OVS_VSCTL(
346   [add-br xapi1],
347   [add-bond xapi1 bond0 eth0 eth1],
348   [add-br xapi2 xapi1 11],
349   [add-port xapi2 bond0.11])])
350 AT_CHECK([cat conf], [0], [BOND_FAKE_CONF])
351 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
352 CHECK_PORTS([xapi1], [bond0])
353 CHECK_IFACES([xapi1], [eth0], [eth1])
354 CHECK_PORTS([xapi2], [bond0.11])
355 CHECK_IFACES([xapi2], [bond0.11])
356 OVS_VSCTL_CLEANUP
357 AT_CLEANUP
358
359 AT_SETUP([fake bridge on bond + del-br fake bridge])
360 AT_KEYWORDS([ovs-vsctl fake-bridge])
361 OVS_VSCTL_SETUP
362 AT_DATA([conf], [BOND_FAKE_CONF])
363 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
364 ])
365 CHECK_BRIDGES([xapi1, xapi1, 0])
366 CHECK_PORTS([xapi1], [bond0])
367 CHECK_IFACES([xapi1], [eth0], [eth1])
368 OVS_VSCTL_CLEANUP
369 AT_CLEANUP
370
371 AT_SETUP([fake bridge on bond + del-br real bridge])
372 AT_KEYWORDS([ovs-vsctl fake-bridge])
373 AT_DATA([conf], [BOND_FAKE_CONF])
374 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
375 CHECK_BRIDGES
376 OVS_VSCTL_CLEANUP
377 AT_CLEANUP
378 ])