2 # -*- coding: utf-8 -*-
4 from nepi.core.design import ExperimentDescription, FactoriesProvider
5 from nepi.util import proxy
6 from nepi.util.constants import STATUS_FINISHED, DeploymentConfiguration as DC
8 import mock.metadata_v01
10 import mock2.metadata_v01
19 class ExecuteTestCase(unittest.TestCase):
21 sys.modules["nepi.testbeds.mock.metadata_v01"] = mock.metadata_v01
22 sys.modules["nepi.testbeds.mock"] = mock
23 sys.modules["nepi.testbeds.mock2.metadata_v01"] = mock2.metadata_v01
24 sys.modules["nepi.testbeds.mock2"] = mock2
25 self.root_dir = tempfile.mkdtemp()
29 shutil.rmtree(self.root_dir)
33 shutil.rmtree(self.root_dir)
35 def make_testbed(self, exp_desc, testbed_id, testbed_version):
36 provider = FactoriesProvider(testbed_id, testbed_version)
37 desc = exp_desc.add_testbed_description(provider)
38 desc.set_attribute_value("fake", True)
39 node1 = desc.create("Node")
40 node2 = desc.create("Node")
41 iface1 = desc.create("Interface")
42 iface1.set_attribute_value("fake", True)
43 node1.connector("devs").connect(iface1.connector("node"))
44 iface2 = desc.create("Interface")
45 iface2.set_attribute_value("fake", True)
46 node2.connector("devs").connect(iface2.connector("node"))
47 iface1.connector("iface").connect(iface2.connector("iface"))
48 app = desc.create("Application")
49 app.connector("node").connect(node1.connector("apps"))
50 app.enable_trace("fake")
52 return exp_desc, desc, app, node1, node2, iface1, iface2
54 def make_test_experiment(self):
55 exp_desc = ExperimentDescription()
56 testbed_version = "01"
58 return self.make_testbed(exp_desc, testbed_id, testbed_version)
60 def make_cross_test_experiment(self):
61 exp_desc = ExperimentDescription()
62 testbed_version = "01"
65 exp_desc, desc1, app1, node11, node12, iface11, iface12 = \
66 self.make_testbed(exp_desc, testbed_id1, testbed_version)
67 exp_desc, desc2, app2, node21, node22, iface21, iface22 = \
68 self.make_testbed(exp_desc, testbed_id2, testbed_version)
69 iface12.connector("cross").connect(iface21.connector("cross"))
71 return exp_desc, desc1, desc2, iface12, iface21
73 def test_single_process_cross_integration(self):
74 exp_desc, desc1, desc2, iface12, iface21 = \
75 self.make_cross_test_experiment()
76 xml = exp_desc.to_xml()
78 controller = proxy.create_controller(xml, access_config)
81 cross1 = controller.get(iface12.guid, "cross")
82 cross2 = controller.get(iface21.guid, "cross")
83 self.assertTrue(cross1 == cross2 == True)
87 def test_single_process_integration(self):
88 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
89 xml = exp_desc.to_xml()
91 controller = proxy.create_controller(xml, access_config)
94 while not controller.is_finished(app.guid):
96 fake_result = controller.trace(app.guid, "fake")
97 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
99 --- 10.0.0.2 ping statistics ---
100 1 packets transmitted, 1 received, 0% packet loss, time 0ms
102 self.assertTrue(fake_result.startswith(comp_result))
104 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
105 self.assertEquals(controller.get_testbed_version(node1.guid), "01")
106 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
109 controller.shutdown()
111 def test_daemonized_controller_integration(self):
112 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
113 xml = exp_desc.to_xml()
114 access_config = proxy.AccessConfiguration()
115 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
116 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
117 controller = proxy.create_controller(xml, access_config)
120 while not controller.is_finished(app.guid):
122 fake_result = controller.trace(app.guid, "fake")
123 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
125 --- 10.0.0.2 ping statistics ---
126 1 packets transmitted, 1 received, 0% packet loss, time 0ms
128 self.assertTrue(fake_result.startswith(comp_result))
130 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
131 self.assertEquals(controller.get_testbed_version(node1.guid), "01")
132 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
135 controller.shutdown()
137 def test_daemonized_testbed_integration(self):
138 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
140 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
141 desc.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
143 xml = exp_desc.to_xml()
145 controller = proxy.create_controller(xml, access_config = None)
148 while not controller.is_finished(app.guid):
150 fake_result = controller.trace(app.guid, "fake")
151 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
153 --- 10.0.0.2 ping statistics ---
154 1 packets transmitted, 1 received, 0% packet loss, time 0ms
156 self.assertTrue(fake_result.startswith(comp_result))
158 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
159 self.assertEquals(controller.get_testbed_version(node1.guid), "01")
160 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
163 controller.shutdown()
165 def test_daemonized_all_integration(self):
166 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
168 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
169 inst_root_dir = os.path.join(self.root_dir, "instance")
170 os.mkdir(inst_root_dir)
171 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
173 xml = exp_desc.to_xml()
175 access_config = proxy.AccessConfiguration()
176 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
177 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
178 controller = proxy.create_controller(xml, access_config)
181 while not controller.is_finished(app.guid):
183 fake_result = controller.trace(app.guid, "fake")
184 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
186 --- 10.0.0.2 ping statistics ---
187 1 packets transmitted, 1 received, 0% packet loss, time 0ms
189 self.assertTrue(fake_result.startswith(comp_result))
191 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
192 self.assertEquals(controller.get_testbed_version(node1.guid), "01")
193 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
196 controller.shutdown()
198 def test_daemonized_all_integration_recovery(self):
199 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
201 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
202 inst_root_dir = os.path.join(self.root_dir, "instance")
203 os.mkdir(inst_root_dir)
204 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
206 xml = exp_desc.to_xml()
208 access_config = proxy.AccessConfiguration()
209 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
210 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
211 controller = proxy.create_controller(xml, access_config)
214 while not controller.is_finished(app.guid):
216 fake_result = controller.trace(app.guid, "fake")
217 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
219 --- 10.0.0.2 ping statistics ---
220 1 packets transmitted, 1 received, 0% packet loss, time 0ms
222 self.assertTrue(fake_result.startswith(comp_result))
224 self.assertEquals(controller.get_testbed_id(node1.guid), "mock")
225 self.assertEquals(controller.get_testbed_version(node1.guid), "01")
226 self.assertEquals(controller.get_factory_id(node1.guid), "Node")
232 access_config.set_attribute_value(DC.RECOVER,True)
233 controller = proxy.create_controller(xml, access_config)
236 self.assertTrue(controller.is_finished(app.guid))
237 fake_result = controller.trace(app.guid, "fake")
238 self.assertTrue(fake_result.startswith(comp_result))
241 controller.shutdown()
243 def test_reference_expressions(self):
244 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
246 iface1.set_attribute_value("label", "some")
247 addr = iface1.add_address()
248 addr.set_attribute_value("Address", "10.0.0.2")
249 iface2.set_attribute_value("test", "{#[some].addr[0].[Address]#}")
251 xml = exp_desc.to_xml()
253 controller = proxy.create_controller(xml, access_config)
255 while not controller.is_finished(app.guid):
257 fake_result = controller.trace(app.guid, "fake")
258 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
260 --- 10.0.0.2 ping statistics ---
261 1 packets transmitted, 1 received, 0% packet loss, time 0ms
264 self.assertTrue(fake_result.startswith(comp_result))
267 controller._testbeds[desc.guid].get(iface2.guid, "test"),
268 addr.get_attribute_value("Address") )
271 controller.shutdown()
273 def test_testbed_reference_expressions(self):
274 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
276 iface1.set_attribute_value("label", "some")
277 addr = iface1.add_address()
278 addr.set_attribute_value("Address", "10.0.0.2")
280 desc2 = exp_desc.add_testbed_description(
281 FactoriesProvider("mock2", "01") )
282 desc2.set_attribute_value(DC.DEPLOYMENT_HOST, "{#[some].addr[0].[Address]#}")
283 # DC.DEPLOYMENT_HOST should be ignored if DC.DEPLOYMENT_CONNECTION is not set
284 # But it should be resolved anyway
286 xml = exp_desc.to_xml()
288 controller = proxy.create_controller(xml, access_config)
290 while not controller.is_finished(app.guid):
292 fake_result = controller.trace(app.guid, "fake")
293 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
295 --- 10.0.0.2 ping statistics ---
296 1 packets transmitted, 1 received, 0% packet loss, time 0ms
298 self.assertTrue(fake_result.startswith(comp_result))
301 controller._deployment_config[desc2.guid]
302 .get_attribute_value(DC.DEPLOYMENT_HOST),
303 addr.get_attribute_value("Address") )
306 controller.shutdown()
308 def TODO_test_ssh_daemonized_all_integration(self):
309 # TODO: This test doesn't run because
310 # sys.modules["nepi.testbeds.mock"] = mock
311 # is not set in the ssh process
312 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
313 env = test_util.test_environment()
315 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
316 inst_root_dir = os.path.join(self.root_dir, "instance")
317 os.mkdir(inst_root_dir)
318 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
319 desc.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
320 desc.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
321 desc.set_attribute_value(DC.USE_AGENT, True)
323 xml = exp_desc.to_xml()
325 access_config = proxy.AccessConfiguration()
326 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
327 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
328 access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
329 access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
330 access_config.set_attribute_value(DC.USE_AGENT, True)
331 controller = proxy.create_controller(xml, access_config)
334 while not controller.is_finished(app.guid):
336 fake_result = controller.trace(app.guid, "fake")
337 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
339 --- 10.0.0.2 ping statistics ---
340 1 packets transmitted, 1 received, 0% packet loss, time 0ms
342 self.assertTrue(fake_result.startswith(comp_result))
344 controller.shutdown()
346 if __name__ == '__main__':