2 # -*- coding: utf-8 -*-
4 from nepi.core.design import ExperimentDescription, FactoriesProvider
5 from nepi.util import proxy
6 from nepi.util.constants import DeploymentConfiguration as DC
20 class ExecuteTestCase(unittest.TestCase):
22 sys.modules["nepi.testbeds.mock.metadata"] = mock.metadata
23 sys.modules["nepi.testbeds.mock"] = mock
24 sys.modules["nepi.testbeds.mock2.metadata"] = mock2.metadata
25 sys.modules["nepi.testbeds.mock2"] = mock2
26 self.root_dir = tempfile.mkdtemp()
30 shutil.rmtree(self.root_dir)
34 shutil.rmtree(self.root_dir)
36 def make_testbed(self, exp_desc, testbed_id):
37 provider = FactoriesProvider(testbed_id)
38 desc = exp_desc.add_testbed_description(provider)
39 desc.set_attribute_value("fake", True)
40 node1 = desc.create("Node")
41 node2 = desc.create("Node")
42 iface1 = desc.create("Interface")
43 iface1.set_attribute_value("fake", True)
44 node1.connector("devs").connect(iface1.connector("node"))
45 iface2 = desc.create("Interface")
46 iface2.set_attribute_value("fake", True)
47 node2.connector("devs").connect(iface2.connector("node"))
48 iface1.connector("iface").connect(iface2.connector("iface"))
49 app = desc.create("Application")
50 app.connector("node").connect(node1.connector("apps"))
51 app.enable_trace("fake")
53 return exp_desc, desc, app, node1, node2, iface1, iface2
55 def make_test_experiment(self):
56 exp_desc = ExperimentDescription()
58 return self.make_testbed(exp_desc, testbed_id)
60 def make_cross_test_experiment(self):
61 exp_desc = ExperimentDescription()
64 exp_desc, desc1, app1, node11, node12, iface11, iface12 = \
65 self.make_testbed(exp_desc, testbed_id1)
66 exp_desc, desc2, app2, node21, node22, iface21, iface22 = \
67 self.make_testbed(exp_desc, testbed_id2)
68 iface12.connector("cross").connect(iface21.connector("cross"))
70 return exp_desc, desc1, desc2, iface12, iface21
72 def test_single_process_cross_integration(self):
73 exp_desc, desc1, desc2, iface12, iface21 = \
74 self.make_cross_test_experiment()
75 xml = exp_desc.to_xml()
77 controller = proxy.create_experiment_controller(xml, access_config)
80 cross1 = controller.get(iface12.guid, "cross")
81 cross2 = controller.get(iface21.guid, "cross")
82 self.assertTrue(cross1 == cross2 == True)
86 def test_single_process_integration(self):
87 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
88 xml = exp_desc.to_xml()
90 controller = proxy.create_experiment_controller(xml, access_config)
93 started_time = controller.started_time
94 self.assertTrue(started_time < time.time())
95 while not controller.is_finished(app.guid):
97 fake_result = controller.trace(app.guid, "fake")
98 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
100 --- 10.0.0.2 ping statistics ---
101 1 packets transmitted, 1 received, 0% packet loss, time 0ms
103 self.assertTrue(fake_result.startswith(comp_result))
105 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
106 self.assertEquals(controller.get_testbed_version(node1.guid), "0.1")
107 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
110 stopped_time = controller.stopped_time
111 self.assertTrue(stopped_time < time.time())
112 controller.shutdown()
114 def test_daemonized_controller_integration(self):
115 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
116 xml = exp_desc.to_xml()
117 access_config = proxy.AccessConfiguration()
118 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
119 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
120 controller = proxy.create_experiment_controller(xml, access_config)
123 started_time = controller.started_time
124 self.assertTrue(started_time < time.time())
125 while not controller.is_finished(app.guid):
127 fake_result = controller.trace(app.guid, "fake")
128 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
130 --- 10.0.0.2 ping statistics ---
131 1 packets transmitted, 1 received, 0% packet loss, time 0ms
133 self.assertTrue(fake_result.startswith(comp_result))
135 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
136 self.assertEquals(controller.get_testbed_version(node1.guid), "0.1")
137 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
140 stopped_time = controller.stopped_time
141 self.assertTrue(stopped_time < time.time())
142 controller.shutdown()
144 def test_daemonized_testbed_integration(self):
145 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
147 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
148 desc.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
150 xml = exp_desc.to_xml()
152 controller = proxy.create_experiment_controller(xml, access_config = None)
155 while not controller.is_finished(app.guid):
157 fake_result = controller.trace(app.guid, "fake")
158 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
160 --- 10.0.0.2 ping statistics ---
161 1 packets transmitted, 1 received, 0% packet loss, time 0ms
163 self.assertTrue(fake_result.startswith(comp_result))
165 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
166 self.assertEquals(controller.get_testbed_version(node1.guid), "0.1")
167 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
170 controller.shutdown()
172 def test_daemonized_all_integration(self):
173 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
175 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
176 inst_root_dir = os.path.join(self.root_dir, "instance")
177 os.mkdir(inst_root_dir)
178 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
180 xml = exp_desc.to_xml()
182 access_config = proxy.AccessConfiguration()
183 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
184 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
185 controller = proxy.create_experiment_controller(xml, access_config)
188 while not controller.is_finished(app.guid):
190 fake_result = controller.trace(app.guid, "fake")
191 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
193 --- 10.0.0.2 ping statistics ---
194 1 packets transmitted, 1 received, 0% packet loss, time 0ms
196 self.assertTrue(fake_result.startswith(comp_result))
198 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
199 self.assertEquals(controller.get_testbed_version(node1.guid), "0.1")
200 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
202 traces_info = controller.traces_info()
203 expected_traces_info = dict({
204 1: dict({ # testbed guid
205 6: dict({ # element guid
206 'fake': dict({ # trace_id
208 'user': getpass.getuser(),
214 self.assertEquals(traces_info, expected_traces_info)
217 controller.shutdown()
219 def test_daemonized_all_integration_recovery(self):
220 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
222 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
223 inst_root_dir = os.path.join(self.root_dir, "instance")
224 os.mkdir(inst_root_dir)
225 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
227 xml = exp_desc.to_xml()
229 access_config = proxy.AccessConfiguration()
230 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
231 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
232 controller = proxy.create_experiment_controller(xml, access_config)
235 while not controller.is_finished(app.guid):
237 fake_result = controller.trace(app.guid, "fake")
238 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
240 --- 10.0.0.2 ping statistics ---
241 1 packets transmitted, 1 received, 0% packet loss, time 0ms
243 self.assertTrue(fake_result.startswith(comp_result))
245 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
246 self.assertEquals(controller.get_testbed_version(node1.guid), "0.1")
247 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
253 access_config.set_attribute_value(DC.RECOVER,True)
254 controller = proxy.create_experiment_controller(xml, access_config)
257 self.assertTrue(controller.is_finished(app.guid))
258 fake_result = controller.trace(app.guid, "fake")
259 self.assertTrue(fake_result.startswith(comp_result))
262 controller.shutdown()
264 def test_reference_expressions(self):
265 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
267 iface1.set_attribute_value("label", "some")
268 addr = iface1.add_address()
269 addr.set_attribute_value("Address", "10.0.0.2")
270 iface2.set_attribute_value("test", "{#[some].addr[0].[Address]#}")
272 xml = exp_desc.to_xml()
274 controller = proxy.create_experiment_controller(xml, access_config)
276 while not controller.is_finished(app.guid):
278 fake_result = controller.trace(app.guid, "fake")
279 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
281 --- 10.0.0.2 ping statistics ---
282 1 packets transmitted, 1 received, 0% packet loss, time 0ms
285 self.assertTrue(fake_result.startswith(comp_result))
288 controller._testbeds[desc.guid].get(iface2.guid, "test"),
289 addr.get_attribute_value("Address") )
292 controller.shutdown()
294 def test_testbed_reference_expressions(self):
295 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
297 iface1.set_attribute_value("label", "some")
298 addr = iface1.add_address()
299 addr.set_attribute_value("Address", "10.0.0.2")
301 desc2 = exp_desc.add_testbed_description(
302 FactoriesProvider("mock2") )
303 desc2.set_attribute_value(DC.DEPLOYMENT_HOST, "{#[some].addr[0].[Address]#}")
304 # DC.DEPLOYMENT_HOST should be ignored if DC.DEPLOYMENT_CONNECTION is not set
305 # But it should be resolved anyway
307 xml = exp_desc.to_xml()
309 controller = proxy.create_experiment_controller(xml, access_config)
311 while not controller.is_finished(app.guid):
313 fake_result = controller.trace(app.guid, "fake")
314 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
316 --- 10.0.0.2 ping statistics ---
317 1 packets transmitted, 1 received, 0% packet loss, time 0ms
319 self.assertTrue(fake_result.startswith(comp_result))
322 controller._deployment_config[desc2.guid]
323 .get_attribute_value(DC.DEPLOYMENT_HOST),
324 addr.get_attribute_value("Address") )
327 controller.shutdown()
329 def test_ssh_daemonized_integration(self):
330 # TODO: This test doesn't run because
331 # sys.modules["nepi.testbeds.mock"] = mock
332 # is not set in the ssh process
333 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
334 env = test_util.test_environment()
336 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
337 inst_root_dir = os.path.join(self.root_dir, "instance")
338 os.mkdir(inst_root_dir)
339 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
340 desc.set_attribute_value(DC.DEPLOYMENT_ENVIRONMENT_SETUP,
341 "export PYTHONPATH=%r:%r:$PYTHONPATH ; "
342 "export NEPI_TESTBEDS='mock:mock mock2:mock2' ; " % (
343 os.path.dirname(os.path.dirname(mock.__file__)),
344 os.path.dirname(os.path.dirname(mock2.__file__)),))
346 xml = exp_desc.to_xml()
348 access_config = proxy.AccessConfiguration()
349 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
350 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
351 access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
352 access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
353 access_config.set_attribute_value(DC.USE_AGENT, True)
354 controller = proxy.create_experiment_controller(xml, access_config)
358 while not controller.is_finished(app.guid):
360 fake_result = controller.trace(app.guid, "fake")
361 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
363 --- 10.0.0.2 ping statistics ---
364 1 packets transmitted, 1 received, 0% packet loss, time 0ms
366 self.assertTrue(fake_result.startswith(comp_result))
369 controller.shutdown()
371 if __name__ == '__main__':