ovs-vsctl: Fix bugs.
[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 dnl ----------------------------------------------------------------------
275 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
276
277 m4_define([OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF],
278   [AT_CHECK(
279      [RUN_OVS_VSCTL(
280         [add-br xenbr0],
281         [add-port xenbr0 eth0],
282         [add-br xapi1 xenbr0 9],
283         [add-port xapi1 eth0.9])],
284      [0], [], [], [OVS_VSCTL_CLEANUP])])
285
286 AT_SETUP([simple fake bridge])
287 AT_KEYWORDS([ovs-vsctl fake-bridge])
288 OVS_VSCTL_SETUP
289 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
290 CHECK_BRIDGES([xapi1, xenbr0, 9], [xenbr0, xenbr0, 0])
291 CHECK_PORTS([xenbr0], [eth0])
292 CHECK_IFACES([xenbr0], [eth0])
293 CHECK_PORTS([xapi1], [eth0.9])
294 CHECK_IFACES([xapi1], [eth0.9])
295 OVS_VSCTL_CLEANUP
296 AT_CLEANUP
297
298 AT_SETUP([simple fake bridge + del-br fake bridge])
299 AT_KEYWORDS([ovs-vsctl fake-bridge])
300 OVS_VSCTL_SETUP
301 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
302 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])], [0], [], [], [OVS_VSCTL_CLEANUP])
303 CHECK_BRIDGES([xenbr0, xenbr0, 0])
304 CHECK_PORTS([xenbr0], [eth0])
305 CHECK_IFACES([xenbr0], [eth0])
306 OVS_VSCTL_CLEANUP
307 AT_CLEANUP
308
309 AT_SETUP([simple fake bridge + del-br real bridge])
310 AT_KEYWORDS([ovs-vsctl fake-bridge])
311 OVS_VSCTL_SETUP
312 OVS_VSCTL_SETUP_SIMPLE_FAKE_CONF
313 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])], [0], [], [], [OVS_VSCTL_CLEANUP])
314 CHECK_BRIDGES
315 OVS_VSCTL_CLEANUP
316 AT_CLEANUP
317
318 m4_define([OVS_VSCTL_SETUP_BOND_FAKE_CONF],
319   [AT_CHECK(
320      [RUN_OVS_VSCTL(
321         [add-br xapi1],
322         [add-bond xapi1 bond0 eth0 eth1],
323         [add-br xapi2 xapi1 11],
324         [add-port xapi2 bond0.11])],
325      [0], [], [], [OVS_VSCTL_CLEANUP])])
326
327 AT_SETUP([fake bridge on bond])
328 AT_KEYWORDS([ovs-vsctl fake-bridge])
329 OVS_VSCTL_SETUP
330 OVS_VSCTL_SETUP_BOND_FAKE_CONF
331 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
332 CHECK_PORTS([xapi1], [bond0])
333 CHECK_IFACES([xapi1], [eth0], [eth1])
334 CHECK_PORTS([xapi2], [bond0.11])
335 CHECK_IFACES([xapi2], [bond0.11])
336 OVS_VSCTL_CLEANUP
337 AT_CLEANUP
338
339 AT_SETUP([fake bridge on bond + del-br fake bridge])
340 AT_KEYWORDS([ovs-vsctl fake-bridge])
341 OVS_VSCTL_SETUP
342 OVS_VSCTL_SETUP_BOND_FAKE_CONF
343 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
344 ], [], [OVS_VSCTL_CLEANUP])
345 CHECK_BRIDGES([xapi1, xapi1, 0])
346 CHECK_PORTS([xapi1], [bond0])
347 CHECK_IFACES([xapi1], [eth0], [eth1])
348 OVS_VSCTL_CLEANUP
349 AT_CLEANUP
350
351 AT_SETUP([fake bridge on bond + del-br real bridge])
352 AT_KEYWORDS([ovs-vsctl fake-bridge])
353 OVS_VSCTL_SETUP
354 OVS_VSCTL_SETUP_BOND_FAKE_CONF
355 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
356 CHECK_BRIDGES
357 OVS_VSCTL_CLEANUP
358 AT_CLEANUP