ovs-vsctl: Add tests that adding duplicate bridges or ports fails.
[sliver-openvswitch.git] / tests / ovs-vsctl.at
1 dnl RUN_OVS_VSCTL(COMMAND, ...)
2 dnl
3 dnl Executes each ovs-vsctl COMMAND on a file named "conf" in the
4 dnl current directory.  Creates "conf" if it does not already exist.
5 m4_define([RUN_OVS_VSCTL],
6   [: >> conf
7 m4_foreach([command], [$@], [ovs-vsctl --no-reload --config=conf command
8 ])])
9
10 dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
11 dnl
12 dnl Executes each ovs-vsctl COMMAND on a file named "conf" in the
13 dnl current directory, in a single run of ovs-vsctl.  Creates "conf" if it
14 dnl does not already exist.
15 m4_define([RUN_OVS_VSCTL_TOGETHER],
16   [: >> conf
17    ovs-vsctl --no-reload --config=conf m4_join([ -- ], $@)])
18
19 dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
20 dnl
21 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
22 dnl which must be in alphabetical order.  Also checks that each BRIDGE has the
23 dnl specified PARENT and is on the given VLAN.
24 m4_define([_CHECK_BRIDGE],
25   [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
26 ])
27
28    # Check br-to-vlan, without --oneline.
29    AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
30 ])
31    # Check br-to-vlan, with --oneline.
32    # (This particular test is interesting with --oneline because it returns
33    # an integer instead of a string and that can cause type mismatches inside
34    # python if not done carefully.)
35    AT_CHECK([RUN_OVS_VSCTL([--oneline br-to-vlan $1])], [0], [$3
36 ])
37
38    # Check multiple queries in a single run.
39    AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
40 [$2
41 $3
42 ])])
43 m4_define([CHECK_BRIDGES],
44   [dnl Check that the bridges appear on list-br, without --oneline.
45    AT_CHECK(
46      [RUN_OVS_VSCTL([list-br])],
47      [0],
48      [m4_foreach([brinfo], [$@], [m4_car(brinfo)
49 ])])
50
51    dnl Check that the bridges appear on list-br, with --oneline.
52    AT_CHECK(
53      [RUN_OVS_VSCTL([--oneline list-br])],
54      [0],
55      [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
56 ])
57
58    dnl Check that each bridge exists according to br-exists and that
59    dnl a bridge that should not exist does not.
60    m4_foreach([brinfo], [$@], 
61               [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])])])
62    AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2])
63
64    dnl Check that each bridge has the expected parent and VLAN.
65    m4_map([_CHECK_BRIDGE], [$@])])
66
67 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
68 dnl
69 dnl Verifies that "ovs-vsctl list-ports BRIDGE" prints the specified
70 dnl list of ports, which must be in alphabetical order.  Also checks
71 dnl that "ovs-vsctl port-to-br" reports that each port is
72 dnl in BRIDGE.
73 m4_define([CHECK_PORTS],
74   [dnl Check ports without --oneline.
75    AT_CHECK(
76      [RUN_OVS_VSCTL([list-ports $1])],
77      [0],
78      [m4_foreach([port], m4_cdr($@), [port
79 ])])
80
81    dnl Check ports with --oneline.
82    AT_CHECK(
83      [RUN_OVS_VSCTL([--oneline list-ports $1])],
84      [0],
85      [m4_join([\n], m4_shift($@))
86 ])
87    AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [], [ovs-vsctl: no port named $1
88 ])
89    m4_foreach(
90      [port], m4_cdr($@), 
91      [AT_CHECK([RUN_OVS_VSCTL([[port-to-br] port])], [0], [$1
92 ])])])
93
94 dnl CHECK_IFACES(BRIDGE, IFACE[, IFACE...])
95 dnl
96 dnl Verifies that "ovs-vsctl list-ifaces BRIDGE" prints the specified
97 dnl list of ifaces, which must be in alphabetical order.  Also checks
98 dnl that "ovs-vsctl iface-to-br" reports that each interface is
99 dnl in BRIDGE.
100 m4_define([CHECK_IFACES],
101   [AT_CHECK(
102      [RUN_OVS_VSCTL([list-ifaces $1])],
103      [0],
104      [m4_foreach([iface], m4_cdr($@), [iface
105 ])])
106    AT_CHECK([RUN_OVS_VSCTL([iface-to-br $1])], [1], [], [ovs-vsctl: no interface named $1
107 ])
108    m4_foreach(
109      [iface], m4_cdr($@), 
110      [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
111 ])])])
112
113 dnl ----------------------------------------------------------------------
114 AT_BANNER([ovs-vsctl unit tests -- real bridges])
115
116 AT_SETUP([add-br a])
117 AT_KEYWORDS([ovs-vsctl])
118 AT_CHECK([RUN_OVS_VSCTL([add-br a])])
119 AT_CHECK([cat conf], [0], [dnl
120 bridge.a.port=a
121 ])
122 CHECK_BRIDGES([a, a, 0])
123 CHECK_PORTS([a])
124 CHECK_IFACES([a])
125 AT_CLEANUP
126
127 AT_SETUP([add-br a, add-br a])
128 AT_KEYWORDS([ovs-vsctl])
129 AT_CHECK([RUN_OVS_VSCTL([add-br a])])
130 AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
131   [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
132 ])
133 AT_CLEANUP
134
135 AT_SETUP([add-br a, add-br b])
136 AT_KEYWORDS([ovs-vsctl])
137 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])])
138 AT_CHECK([cat conf], [0], [dnl
139 bridge.a.port=a
140 bridge.b.port=b
141 ])
142 CHECK_BRIDGES([a, a, 0], [b, b, 0])
143 CHECK_PORTS([a])
144 CHECK_IFACES([a])
145 CHECK_PORTS([b])
146 CHECK_IFACES([b])
147 AT_CLEANUP
148
149 AT_SETUP([add-br a, add-br b, del-br a])
150 AT_KEYWORDS([ovs-vsctl])
151 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])])
152 AT_CHECK([cat conf], [0], [dnl
153 bridge.b.port=b
154 ])
155 CHECK_BRIDGES([b, b, 0])
156 CHECK_PORTS([b])
157 CHECK_IFACES([b])
158 AT_CLEANUP
159
160 AT_SETUP([add-br a, add-port a a1, add-port a a2])
161 AT_KEYWORDS([ovs-vsctl])
162 AT_CHECK([RUN_OVS_VSCTL(
163    [add-br a], 
164    [add-port a a1],
165    [add-port a a2])])
166 AT_CHECK([cat conf], [0],
167   [bridge.a.port=a
168 bridge.a.port=a1
169 bridge.a.port=a2
170 ])
171 CHECK_BRIDGES([a, a, 0])
172 CHECK_PORTS([a], [a1], [a2])
173 CHECK_IFACES([a], [a1], [a2])
174 AT_CLEANUP
175
176 AT_SETUP([add-br a, add-port a a1, add-port a a1])
177 AT_KEYWORDS([ovs-vsctl])
178 AT_CHECK([RUN_OVS_VSCTL(
179    [add-br a], 
180    [add-port a a1])])
181 AT_CHECK([cat conf], [0],
182   [bridge.a.port=a
183 bridge.a.port=a1
184 ])
185 AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
186   [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
187 ])
188 AT_CLEANUP
189
190 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
191 AT_KEYWORDS([ovs-vsctl])
192 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
193    [add-br a], 
194    [add-br b], 
195    [add-port a a1],
196    [add-port b b1],
197    [del-br a])])
198 AT_CHECK([cat conf], [0],
199   [bridge.b.port=b
200 bridge.b.port=b1
201 ])
202 CHECK_BRIDGES([b, b, 0])
203 CHECK_PORTS([b], [b1])
204 CHECK_IFACES([b], [b1])
205 AT_CLEANUP
206
207 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
208 AT_KEYWORDS([ovs-vsctl])
209 AT_CHECK([RUN_OVS_VSCTL(
210    [add-br a], 
211    [add-bond a bond0 a1 a2 a3])])
212 AT_CHECK([cat conf], [0], [dnl
213 bonding.bond0.slave=a1
214 bonding.bond0.slave=a2
215 bonding.bond0.slave=a3
216 bridge.a.port=a
217 bridge.a.port=bond0
218 ])
219 CHECK_BRIDGES([a, a, 0])
220 CHECK_PORTS([a], [bond0])
221 CHECK_IFACES([a], [a1], [a2], [a3])
222 AT_CLEANUP
223
224 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
225 AT_KEYWORDS([ovs-vsctl])
226 AT_CHECK([RUN_OVS_VSCTL(
227   [add-br a], 
228   [add-br b], 
229   [add-port a a1],
230   [add-port b b1],
231   [del-port a a1])])
232 AT_CHECK([cat conf], [0], [dnl
233 bridge.a.port=a
234 bridge.b.port=b
235 bridge.b.port=b1
236 ])
237 CHECK_BRIDGES([a, a, 0], [b, b, 0])
238 CHECK_PORTS([a])
239 CHECK_IFACES([a])
240 CHECK_PORTS([b], [b1])
241 CHECK_IFACES([b], [b1])
242 AT_CLEANUP
243
244 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
245 AT_KEYWORDS([ovs-vsctl])
246 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
247   [add-br a], 
248   [add-bond a bond0 a1 a2 a3],
249   [del-port bond0])])
250 AT_CHECK([cat conf], [0], [dnl
251 bridge.a.port=a
252 ])
253 CHECK_BRIDGES([a, a, 0])
254 CHECK_PORTS([a])
255 AT_CLEANUP
256
257 dnl ----------------------------------------------------------------------
258 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
259
260 m4_define([SIMPLE_FAKE_CONF], [dnl
261 bridge.xenbr0.port=eth0
262 bridge.xenbr0.port=eth0.9
263 bridge.xenbr0.port=xapi1
264 bridge.xenbr0.port=xenbr0
265 iface.xapi1.fake-bridge=true
266 iface.xapi1.internal=true
267 vlan.eth0.9.tag=9
268 vlan.xapi1.tag=9
269 ])
270
271 AT_SETUP([simple fake bridge])
272 AT_KEYWORDS([ovs-vsctl fake-bridge])
273 AT_CHECK([RUN_OVS_VSCTL(
274   [add-br xenbr0],
275   [add-port xenbr0 eth0],
276   [add-br xapi1 xenbr0 9],
277   [add-port xapi1 eth0.9])])
278 AT_CHECK([cat conf], [0], [SIMPLE_FAKE_CONF])
279 CHECK_BRIDGES([xenbr0, xenbr0, 0], [xapi1, xenbr0, 9])
280 CHECK_PORTS([xenbr0], [eth0])
281 CHECK_IFACES([xenbr0], [eth0])
282 CHECK_PORTS([xapi1], [eth0.9])
283 CHECK_IFACES([xapi1], [eth0.9])
284 AT_CLEANUP
285
286 AT_SETUP([simple fake bridge + del-br fake bridge])
287 AT_KEYWORDS([ovs-vsctl fake-bridge])
288 AT_DATA([conf], [SIMPLE_FAKE_CONF])
289 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
290 AT_CHECK([cat conf], [0], [dnl
291 bridge.xenbr0.port=eth0
292 bridge.xenbr0.port=xenbr0
293 ])
294 CHECK_BRIDGES([xenbr0, xenbr0, 0])
295 CHECK_PORTS([xenbr0], [eth0])
296 CHECK_IFACES([xenbr0], [eth0])
297 AT_CLEANUP
298
299 AT_SETUP([simple fake bridge + del-br real bridge])
300 AT_KEYWORDS([ovs-vsctl fake-bridge])
301 AT_DATA([conf], [SIMPLE_FAKE_CONF])
302 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])])
303 AT_CHECK([cat conf], [0], [])
304 CHECK_BRIDGES
305 AT_CLEANUP
306
307 m4_define([BOND_FAKE_CONF], [dnl
308 bonding.bond0.slave=eth0
309 bonding.bond0.slave=eth1
310 bridge.xapi1.port=bond0
311 bridge.xapi1.port=bond0.11
312 bridge.xapi1.port=xapi1
313 bridge.xapi1.port=xapi2
314 iface.xapi2.fake-bridge=true
315 iface.xapi2.internal=true
316 vlan.bond0.11.tag=11
317 vlan.xapi2.tag=11
318 ])
319
320 AT_SETUP([fake bridge on bond])
321 AT_KEYWORDS([ovs-vsctl fake-bridge])
322 AT_CHECK([RUN_OVS_VSCTL(
323   [add-br xapi1],
324   [add-bond xapi1 bond0 eth0 eth1],
325   [add-br xapi2 xapi1 11],
326   [add-port xapi2 bond0.11])])
327 AT_CHECK([cat conf], [0], [BOND_FAKE_CONF])
328 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
329 CHECK_PORTS([xapi1], [bond0])
330 CHECK_IFACES([xapi1], [eth0], [eth1])
331 CHECK_PORTS([xapi2], [bond0.11])
332 CHECK_IFACES([xapi2], [bond0.11])
333 AT_CLEANUP
334
335 AT_SETUP([fake bridge on bond + del-br fake bridge])
336 AT_KEYWORDS([ovs-vsctl fake-bridge])
337 AT_DATA([conf], [BOND_FAKE_CONF])
338 AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
339 ])
340 CHECK_BRIDGES([xapi1, xapi1, 0])
341 CHECK_PORTS([xapi1], [bond0])
342 CHECK_IFACES([xapi1], [eth0], [eth1])
343 AT_CLEANUP
344
345 AT_SETUP([fake bridge on bond + del-br real bridge])
346 AT_KEYWORDS([ovs-vsctl fake-bridge])
347 AT_DATA([conf], [BOND_FAKE_CONF])
348 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
349 CHECK_BRIDGES
350 AT_CLEANUP