e2c3b6b1647d0bd3a770890a689ff8951c714fdf
2 Test suite to automatically test emulator functionalities.
3 Directly interacts with the emulator through the Mininet-like
6 Does not test API endpoints. This is done in separated test suites.
11 from emuvim
.dcemulator
.node
import EmulatorCompute
12 from emuvim
.test
.base
import SimpleTestTopology
13 from mininet
.node
import RemoteController
16 #@unittest.skip("disabled topology tests for development")
17 class testEmulatorTopology( SimpleTestTopology
):
19 Tests to check the topology API of the emulator.
22 def testSingleDatacenter(self
):
24 Create a single data center and add check if its switch is up
25 by using manually added hosts. Tests especially the
26 data center specific addLink method.
29 self
.createNet(nswitches
=0, ndatacenter
=1, nhosts
=2, ndockers
=0)
31 self
.net
.addLink(self
.dc
[0], self
.h
[0])
32 self
.net
.addLink(self
.h
[1], self
.dc
[0])
33 # start Mininet network
35 # check number of running nodes
36 self
.assertTrue(len(self
.getContainernetContainers()) == 0)
37 self
.assertTrue(len(self
.net
.hosts
) == 2)
38 self
.assertTrue(len(self
.net
.switches
) == 1)
39 # check connectivity by using ping
40 self
.assertTrue(self
.net
.ping([self
.h
[0], self
.h
[1]]) <= 0.0)
41 # stop Mininet network
44 #@unittest.skip("disabled to test if CI fails because this is the first test.")
45 def testMultipleDatacenterDirect(self
):
47 Create a two data centers and interconnect them.
50 self
.createNet(nswitches
=0, ndatacenter
=2, nhosts
=2, ndockers
=0)
52 self
.net
.addLink(self
.dc
[0], self
.h
[0])
53 self
.net
.addLink(self
.h
[1], self
.dc
[1])
54 self
.net
.addLink(self
.dc
[0], self
.dc
[1])
55 # start Mininet network
57 # check number of running nodes
58 self
.assertTrue(len(self
.getContainernetContainers()) == 0)
59 self
.assertTrue(len(self
.net
.hosts
) == 2)
60 self
.assertTrue(len(self
.net
.switches
) == 2)
61 # check connectivity by using ping
62 self
.assertTrue(self
.net
.ping([self
.h
[0], self
.h
[1]]) <= 0.0)
63 # stop Mininet network
66 def testMultipleDatacenterWithIntermediateSwitches(self
):
68 Create a two data centers and interconnect them with additional
69 switches between them.
73 nswitches
=3, ndatacenter
=2, nhosts
=2, ndockers
=0,
74 autolinkswitches
=True)
76 self
.net
.addLink(self
.dc
[0], self
.h
[0])
77 self
.net
.addLink(self
.h
[1], self
.dc
[1])
78 self
.net
.addLink(self
.dc
[0], self
.s
[0])
79 self
.net
.addLink(self
.s
[2], self
.dc
[1])
80 # start Mininet network
82 # check number of running nodes
83 self
.assertTrue(len(self
.getContainernetContainers()) == 0)
84 self
.assertTrue(len(self
.net
.hosts
) == 2)
85 self
.assertTrue(len(self
.net
.switches
) == 5)
86 # check connectivity by using ping
87 self
.assertTrue(self
.net
.ping([self
.h
[0], self
.h
[1]]) <= 0.0)
88 # stop Mininet network
91 class testEmulatorNetworking( SimpleTestTopology
):
93 def testSDNChaining(self
):
95 Create a two data centers and interconnect them with additional
96 switches between them.
97 Uses Ryu SDN controller.
98 Connect the Docker hosts to different datacenters and setup the links between.
102 nswitches
=3, ndatacenter
=2, nhosts
=0, ndockers
=0,
103 autolinkswitches
=True,
104 controller
=RemoteController
,
105 enable_learning
=False)
107 self
.net
.addLink(self
.dc
[0], self
.s
[0])
108 self
.net
.addLink(self
.s
[2], self
.dc
[1])
109 # start Mininet network
112 # add compute resources
113 vnf1
= self
.dc
[0].startCompute("vnf1", network
=[{'id':'intf1', 'ip':'10.0.10.1/24'}])
114 vnf2
= self
.dc
[1].startCompute("vnf2", network
=[{'id':'intf2', 'ip':'10.0.10.2/24'}])
115 # check number of running nodes
116 self
.assertTrue(len(self
.getDockernetContainers()) == 2)
117 self
.assertTrue(len(self
.net
.hosts
) == 2)
118 self
.assertTrue(len(self
.net
.switches
) == 5)
121 s1
= self
.dc
[0].containers
.get("vnf1").getStatus()
122 self
.assertTrue(s1
["name"] == "vnf1")
123 self
.assertTrue(s1
["state"]["Running"])
124 self
.assertTrue(s1
["network"][0]['intf_name'] == 'intf1')
125 self
.assertTrue(s1
["network"][0]['ip'] == '10.0.10.1')
127 s2
= self
.dc
[1].containers
.get("vnf2").getStatus()
128 self
.assertTrue(s2
["name"] == "vnf2")
129 self
.assertTrue(s2
["state"]["Running"])
130 self
.assertTrue(s2
["network"][0]['intf_name'] == 'intf2')
131 self
.assertTrue(s2
["network"][0]['ip'] == '10.0.10.2')
134 self
.net
.setChain('vnf1', 'vnf2', 'intf1', 'intf2', bidirectional
=True, cmd
='add-flow')
135 # check connectivity by using ping
136 self
.assertTrue(self
.net
.ping([vnf1
, vnf2
]) <= 0.0)
137 # stop Mininet network
140 #@unittest.skip("disabled compute tests for development")
141 class testEmulatorCompute( SimpleTestTopology
):
143 Tests to check the emulator's API to add and remove
144 compute resources at runtime.
147 def testAddSingleComputeSingleDC(self
):
149 Adds a single compute instance to
150 a single DC and checks its connectivity with a
154 self
.createNet(nswitches
=0, ndatacenter
=1, nhosts
=1, ndockers
=0)
156 self
.net
.addLink(self
.dc
[0], self
.h
[0])
157 # start Mininet network
159 # add compute resources
160 vnf1
= self
.dc
[0].startCompute("vnf1")
161 # check number of running nodes
162 self
.assertTrue(len(self
.getContainernetContainers()) == 1)
163 self
.assertTrue(len(self
.net
.hosts
) == 2)
164 self
.assertTrue(len(self
.net
.switches
) == 1)
165 # check compute list result
166 self
.assertTrue(len(self
.dc
[0].listCompute()) == 1)
167 self
.assertTrue(isinstance(self
.dc
[0].listCompute()[0], EmulatorCompute
))
168 self
.assertTrue(self
.dc
[0].listCompute()[0].name
== "vnf1")
169 # check connectivity by using ping
170 self
.assertTrue(self
.net
.ping([self
.h
[0], vnf1
]) <= 0.0)
171 # stop Mininet network
174 def testRemoveSingleComputeSingleDC(self
):
176 Test stop method for compute instances.
177 Check that the instance is really removed.
180 self
.createNet(nswitches
=0, ndatacenter
=1, nhosts
=1, ndockers
=0)
182 self
.net
.addLink(self
.dc
[0], self
.h
[0])
183 # start Mininet network
185 # add compute resources
186 vnf1
= self
.dc
[0].startCompute("vnf1")
187 # check number of running nodes
188 self
.assertTrue(len(self
.getContainernetContainers()) == 1)
189 self
.assertTrue(len(self
.net
.hosts
) == 2)
190 self
.assertTrue(len(self
.net
.switches
) == 1)
191 # check compute list result
192 self
.assertTrue(len(self
.dc
[0].listCompute()) == 1)
193 # check connectivity by using ping
194 self
.assertTrue(self
.net
.ping([self
.h
[0], vnf1
]) <= 0.0)
195 # remove compute resources
196 self
.dc
[0].stopCompute("vnf1")
197 # check number of running nodes
198 self
.assertTrue(len(self
.getContainernetContainers()) == 0)
199 self
.assertTrue(len(self
.net
.hosts
) == 1)
200 self
.assertTrue(len(self
.net
.switches
) == 1)
201 # check compute list result
202 self
.assertTrue(len(self
.dc
[0].listCompute()) == 0)
203 # stop Mininet network
206 def testGetStatusSingleComputeSingleDC(self
):
208 Check if the getStatus functionality of EmulatorCompute
212 self
.createNet(nswitches
=0, ndatacenter
=1, nhosts
=1, ndockers
=0)
214 self
.net
.addLink(self
.dc
[0], self
.h
[0])
215 # start Mininet network
217 # add compute resources
218 vnf1
= self
.dc
[0].startCompute("vnf1")
219 # check number of running nodes
220 self
.assertTrue(len(self
.getContainernetContainers()) == 1)
221 self
.assertTrue(len(self
.net
.hosts
) == 2)
222 self
.assertTrue(len(self
.net
.switches
) == 1)
223 # check compute list result
224 self
.assertTrue(len(self
.dc
[0].listCompute()) == 1)
225 self
.assertTrue(isinstance(self
.dc
[0].listCompute()[0], EmulatorCompute
))
226 self
.assertTrue(self
.dc
[0].listCompute()[0].name
== "vnf1")
227 # check connectivity by using ping
228 self
.assertTrue(self
.net
.ping([self
.h
[0], vnf1
]) <= 0.0)
230 s
= self
.dc
[0].containers
.get("vnf1").getStatus()
231 self
.assertTrue(s
["name"] == "vnf1")
232 self
.assertTrue(s
["state"]["Running"])
233 # stop Mininet network
236 def testConnectivityMultiDC(self
):
238 Test if compute instances started in different data centers
239 are able to talk to each other.
243 nswitches
=3, ndatacenter
=2, nhosts
=0, ndockers
=0,
244 autolinkswitches
=True)
246 self
.net
.addLink(self
.dc
[0], self
.s
[0])
247 self
.net
.addLink(self
.dc
[1], self
.s
[2])
248 # start Mininet network
250 # add compute resources
251 vnf1
= self
.dc
[0].startCompute("vnf1")
252 vnf2
= self
.dc
[1].startCompute("vnf2")
253 # check number of running nodes
254 self
.assertTrue(len(self
.getContainernetContainers()) == 2)
255 self
.assertTrue(len(self
.net
.hosts
) == 2)
256 self
.assertTrue(len(self
.net
.switches
) == 5)
257 # check compute list result
258 self
.assertTrue(len(self
.dc
[0].listCompute()) == 1)
259 self
.assertTrue(len(self
.dc
[1].listCompute()) == 1)
260 # check connectivity by using ping
261 self
.assertTrue(self
.net
.ping([vnf1
, vnf2
]) <= 0.0)
262 # stop Mininet network
265 def testInterleavedAddRemoveMultiDC(self
):
267 Test multiple, interleaved add and remove operations and ensure
268 that always all expected compute instances are reachable.
272 nswitches
=3, ndatacenter
=2, nhosts
=0, ndockers
=0,
273 autolinkswitches
=True)
275 self
.net
.addLink(self
.dc
[0], self
.s
[0])
276 self
.net
.addLink(self
.dc
[1], self
.s
[2])
277 # start Mininet network
279 # add compute resources
280 vnf1
= self
.dc
[0].startCompute("vnf1")
281 vnf2
= self
.dc
[1].startCompute("vnf2")
282 # check number of running nodes
283 self
.assertTrue(len(self
.getContainernetContainers()) == 2)
284 self
.assertTrue(len(self
.net
.hosts
) == 2)
285 self
.assertTrue(len(self
.net
.switches
) == 5)
286 # check compute list result
287 self
.assertTrue(len(self
.dc
[0].listCompute()) == 1)
288 self
.assertTrue(len(self
.dc
[1].listCompute()) == 1)
289 # check connectivity by using ping
290 self
.assertTrue(self
.net
.ping([vnf1
, vnf2
]) <= 0.0)
291 # remove compute resources
292 self
.dc
[0].stopCompute("vnf1")
293 # check number of running nodes
294 self
.assertTrue(len(self
.getContainernetContainers()) == 1)
295 self
.assertTrue(len(self
.net
.hosts
) == 1)
296 self
.assertTrue(len(self
.net
.switches
) == 5)
297 # check compute list result
298 self
.assertTrue(len(self
.dc
[0].listCompute()) == 0)
299 self
.assertTrue(len(self
.dc
[1].listCompute()) == 1)
300 # add compute resources
301 vnf3
= self
.dc
[0].startCompute("vnf3")
302 vnf4
= self
.dc
[0].startCompute("vnf4")
303 # check compute list result
304 self
.assertTrue(len(self
.dc
[0].listCompute()) == 2)
305 self
.assertTrue(len(self
.dc
[1].listCompute()) == 1)
306 self
.assertTrue(self
.net
.ping([vnf3
, vnf2
]) <= 0.0)
307 self
.assertTrue(self
.net
.ping([vnf4
, vnf2
]) <= 0.0)
308 # remove compute resources
309 self
.dc
[0].stopCompute("vnf3")
310 self
.dc
[0].stopCompute("vnf4")
311 self
.dc
[1].stopCompute("vnf2")
312 # check compute list result
313 self
.assertTrue(len(self
.dc
[0].listCompute()) == 0)
314 self
.assertTrue(len(self
.dc
[1].listCompute()) == 0)
315 # stop Mininet network
318 if __name__
== '__main__':