ovs-vsctl: Add the ability to perform multiple operations in a single run.
[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 b])
128 AT_KEYWORDS([ovs-vsctl])
129 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])])
130 AT_CHECK([cat conf], [0], [dnl
131 bridge.a.port=a
132 bridge.b.port=b
133 ])
134 CHECK_BRIDGES([a, a, 0], [b, b, 0])
135 CHECK_PORTS([a])
136 CHECK_IFACES([a])
137 CHECK_PORTS([b])
138 CHECK_IFACES([b])
139 AT_CLEANUP
140
141 AT_SETUP([add-br a, add-br b, del-br a])
142 AT_KEYWORDS([ovs-vsctl])
143 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])])
144 AT_CHECK([cat conf], [0], [dnl
145 bridge.b.port=b
146 ])
147 CHECK_BRIDGES([b, b, 0])
148 CHECK_PORTS([b])
149 CHECK_IFACES([b])
150 AT_CLEANUP
151
152 AT_SETUP([add-br a, add-port a a1, add-port a a2])
153 AT_KEYWORDS([ovs-vsctl])
154 AT_CHECK([RUN_OVS_VSCTL(
155    [add-br a], 
156    [add-port a a1],
157    [add-port a a2])])
158 AT_CHECK([cat conf], [0],
159   [bridge.a.port=a
160 bridge.a.port=a1
161 bridge.a.port=a2
162 ])
163 CHECK_BRIDGES([a, a, 0])
164 CHECK_PORTS([a], [a1], [a2])
165 CHECK_IFACES([a], [a1], [a2])
166 AT_CLEANUP
167
168 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
169 AT_KEYWORDS([ovs-vsctl])
170 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
171    [add-br a], 
172    [add-br b], 
173    [add-port a a1],
174    [add-port b b1],
175    [del-br a])])
176 AT_CHECK([cat conf], [0],
177   [bridge.b.port=b
178 bridge.b.port=b1
179 ])
180 CHECK_BRIDGES([b, b, 0])
181 CHECK_PORTS([b], [b1])
182 CHECK_IFACES([b], [b1])
183 AT_CLEANUP
184
185 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3])
186 AT_KEYWORDS([ovs-vsctl])
187 AT_CHECK([RUN_OVS_VSCTL(
188    [add-br a], 
189    [add-bond a bond0 a1 a2 a3])])
190 AT_CHECK([cat conf], [0], [dnl
191 bonding.bond0.slave=a1
192 bonding.bond0.slave=a2
193 bonding.bond0.slave=a3
194 bridge.a.port=a
195 bridge.a.port=bond0
196 ])
197 CHECK_BRIDGES([a, a, 0])
198 CHECK_PORTS([a], [bond0])
199 CHECK_IFACES([a], [a1], [a2], [a3])
200 AT_CLEANUP
201
202 AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-port a a1])
203 AT_KEYWORDS([ovs-vsctl])
204 AT_CHECK([RUN_OVS_VSCTL(
205   [add-br a], 
206   [add-br b], 
207   [add-port a a1],
208   [add-port b b1],
209   [del-port a a1])])
210 AT_CHECK([cat conf], [0], [dnl
211 bridge.a.port=a
212 bridge.b.port=b
213 bridge.b.port=b1
214 ])
215 CHECK_BRIDGES([a, a, 0], [b, b, 0])
216 CHECK_PORTS([a])
217 CHECK_IFACES([a])
218 CHECK_PORTS([b], [b1])
219 CHECK_IFACES([b], [b1])
220 AT_CLEANUP
221
222 AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
223 AT_KEYWORDS([ovs-vsctl])
224 AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
225   [add-br a], 
226   [add-bond a bond0 a1 a2 a3],
227   [del-port bond0])])
228 AT_CHECK([cat conf], [0], [dnl
229 bridge.a.port=a
230 ])
231 CHECK_BRIDGES([a, a, 0])
232 CHECK_PORTS([a])
233 AT_CLEANUP
234
235 dnl ----------------------------------------------------------------------
236 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
237
238 m4_define([SIMPLE_FAKE_CONF], [dnl
239 bridge.xenbr0.port=eth0
240 bridge.xenbr0.port=eth0.9
241 bridge.xenbr0.port=xapi1
242 bridge.xenbr0.port=xenbr0
243 iface.xapi1.fake-bridge=true
244 iface.xapi1.internal=true
245 vlan.eth0.9.tag=9
246 vlan.xapi1.tag=9
247 ])
248
249 AT_SETUP([simple fake bridge])
250 AT_KEYWORDS([ovs-vsctl fake-bridge])
251 AT_CHECK([RUN_OVS_VSCTL(
252   [add-br xenbr0],
253   [add-port xenbr0 eth0],
254   [add-br xapi1 xenbr0 9],
255   [add-port xapi1 eth0.9])])
256 AT_CHECK([cat conf], [0], [SIMPLE_FAKE_CONF])
257 CHECK_BRIDGES([xenbr0, xenbr0, 0], [xapi1, xenbr0, 9])
258 CHECK_PORTS([xenbr0], [eth0])
259 CHECK_IFACES([xenbr0], [eth0])
260 CHECK_PORTS([xapi1], [eth0.9])
261 CHECK_IFACES([xapi1], [eth0.9])
262 AT_CLEANUP
263
264 AT_SETUP([simple fake bridge + del-br fake bridge])
265 AT_KEYWORDS([ovs-vsctl fake-bridge])
266 AT_DATA([conf], [SIMPLE_FAKE_CONF])
267 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
268 AT_CHECK([cat conf], [0], [dnl
269 bridge.xenbr0.port=eth0
270 bridge.xenbr0.port=xenbr0
271 ])
272 CHECK_BRIDGES([xenbr0, xenbr0, 0])
273 CHECK_PORTS([xenbr0], [eth0])
274 CHECK_IFACES([xenbr0], [eth0])
275 AT_CLEANUP
276
277 AT_SETUP([simple fake bridge + del-br real bridge])
278 AT_KEYWORDS([ovs-vsctl fake-bridge])
279 AT_DATA([conf], [SIMPLE_FAKE_CONF])
280 AT_CHECK([RUN_OVS_VSCTL([del-br xenbr0])])
281 AT_CHECK([cat conf], [0], [])
282 CHECK_BRIDGES
283 AT_CLEANUP
284
285 m4_define([BOND_FAKE_CONF], [dnl
286 bonding.bond0.slave=eth0
287 bonding.bond0.slave=eth1
288 bridge.xapi1.port=bond0
289 bridge.xapi1.port=bond0.11
290 bridge.xapi1.port=xapi1
291 bridge.xapi1.port=xapi2
292 iface.xapi2.fake-bridge=true
293 iface.xapi2.internal=true
294 vlan.bond0.11.tag=11
295 vlan.xapi2.tag=11
296 ])
297
298 AT_SETUP([fake bridge on bond])
299 AT_KEYWORDS([ovs-vsctl fake-bridge])
300 AT_CHECK([RUN_OVS_VSCTL(
301   [add-br xapi1],
302   [add-bond xapi1 bond0 eth0 eth1],
303   [add-br xapi2 xapi1 11],
304   [add-port xapi2 bond0.11])])
305 AT_CHECK([cat conf], [0], [BOND_FAKE_CONF])
306 CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
307 CHECK_PORTS([xapi1], [bond0])
308 CHECK_IFACES([xapi1], [eth0], [eth1])
309 CHECK_PORTS([xapi2], [bond0.11])
310 CHECK_IFACES([xapi2], [bond0.11])
311 AT_CLEANUP
312
313 AT_SETUP([fake bridge on bond + del-br fake bridge])
314 AT_KEYWORDS([ovs-vsctl fake-bridge])
315 AT_DATA([conf], [BOND_FAKE_CONF])
316 AT_CHECK([RUN_OVS_VSCTL([del-br xapi2])])
317 CHECK_BRIDGES([xapi1, xapi1, 0])
318 CHECK_PORTS([xapi1], [bond0])
319 CHECK_IFACES([xapi1], [eth0], [eth1])
320 AT_CLEANUP
321
322 AT_SETUP([fake bridge on bond + del-br real bridge])
323 AT_KEYWORDS([ovs-vsctl fake-bridge])
324 AT_DATA([conf], [BOND_FAKE_CONF])
325 AT_CHECK([RUN_OVS_VSCTL([del-br xapi1])])
326 CHECK_BRIDGES
327 AT_CLEANUP