2 # -*- coding: utf-8 -*-
4 from nepi.core.design import ExperimentDescription, FactoriesProvider
5 from nepi.util import proxy, tags
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(desc1.guid, iface12.guid, "cross")
82 cross2 = controller.get(desc2.guid, 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(desc.guid, 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))
103 self.assertEquals(controller.get_tags(desc.guid, node1.guid), [tags.MOBILE])
106 controller.shutdown()
108 def test_daemonized_controller_integration(self):
109 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
110 xml = exp_desc.to_xml()
111 access_config = proxy.AccessConfiguration()
112 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
113 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
114 controller = proxy.create_controller(xml, access_config)
117 while not controller.is_finished(app.guid):
119 fake_result = controller.trace(desc.guid, app.guid, "fake")
120 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
122 --- 10.0.0.2 ping statistics ---
123 1 packets transmitted, 1 received, 0% packet loss, time 0ms
125 self.assertTrue(fake_result.startswith(comp_result))
126 self.assertEquals(controller.get_tags(desc.guid, node1.guid), [tags.MOBILE])
129 controller.shutdown()
131 def test_daemonized_testbed_integration(self):
132 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
134 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
135 desc.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
137 xml = exp_desc.to_xml()
139 controller = proxy.create_controller(xml, access_config = None)
142 while not controller.is_finished(app.guid):
144 fake_result = controller.trace(desc.guid, app.guid, "fake")
145 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
147 --- 10.0.0.2 ping statistics ---
148 1 packets transmitted, 1 received, 0% packet loss, time 0ms
150 self.assertTrue(fake_result.startswith(comp_result))
151 self.assertEquals(controller.get_tags(desc.guid, node1.guid), [tags.MOBILE])
154 controller.shutdown()
156 def test_daemonized_all_integration(self):
157 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
159 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
160 inst_root_dir = os.path.join(self.root_dir, "instance")
161 os.mkdir(inst_root_dir)
162 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
164 xml = exp_desc.to_xml()
166 access_config = proxy.AccessConfiguration()
167 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
168 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
169 controller = proxy.create_controller(xml, access_config)
172 while not controller.is_finished(app.guid):
174 fake_result = controller.trace(desc.guid, app.guid, "fake")
175 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
177 --- 10.0.0.2 ping statistics ---
178 1 packets transmitted, 1 received, 0% packet loss, time 0ms
180 self.assertTrue(fake_result.startswith(comp_result))
181 self.assertEquals(controller.get_tags(desc.guid, node1.guid), [tags.MOBILE])
184 controller.shutdown()
186 def test_daemonized_all_integration_recovery(self):
187 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
189 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
190 inst_root_dir = os.path.join(self.root_dir, "instance")
191 os.mkdir(inst_root_dir)
192 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
194 xml = exp_desc.to_xml()
196 access_config = proxy.AccessConfiguration()
197 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
198 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
199 controller = proxy.create_controller(xml, access_config)
202 while not controller.is_finished(app.guid):
204 fake_result = controller.trace(desc.guid, app.guid, "fake")
205 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
207 --- 10.0.0.2 ping statistics ---
208 1 packets transmitted, 1 received, 0% packet loss, time 0ms
210 self.assertTrue(fake_result.startswith(comp_result))
211 self.assertEquals(controller.get_tags(desc.guid, node1.guid), [tags.MOBILE])
217 access_config.set_attribute_value(DC.RECOVER,True)
218 controller = proxy.create_controller(xml, access_config)
221 self.assertTrue(controller.is_finished(app.guid))
222 fake_result = controller.trace(desc.guid, app.guid, "fake")
223 self.assertTrue(fake_result.startswith(comp_result))
226 controller.shutdown()
228 def test_reference_expressions(self):
229 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
231 iface1.set_attribute_value("label", "some")
232 addr = iface1.add_address()
233 addr.set_attribute_value("Address", "10.0.0.2")
234 iface2.set_attribute_value("test", "{#[some].addr[0].[Address]#}")
236 xml = exp_desc.to_xml()
238 controller = proxy.create_controller(xml, access_config)
240 while not controller.is_finished(app.guid):
242 fake_result = controller.trace(desc.guid, app.guid, "fake")
243 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
245 --- 10.0.0.2 ping statistics ---
246 1 packets transmitted, 1 received, 0% packet loss, time 0ms
249 self.assertTrue(fake_result.startswith(comp_result))
252 controller._testbeds[desc.guid].get(iface2.guid, "test"),
253 addr.get_attribute_value("Address") )
256 controller.shutdown()
258 def test_testbed_reference_expressions(self):
259 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
261 iface1.set_attribute_value("label", "some")
262 addr = iface1.add_address()
263 addr.set_attribute_value("Address", "10.0.0.2")
265 desc2 = exp_desc.add_testbed_description(
266 FactoriesProvider("mock2", "01") )
267 desc2.set_attribute_value(DC.DEPLOYMENT_HOST, "{#[some].addr[0].[Address]#}")
268 # DC.DEPLOYMENT_HOST should be ignored if DC.DEPLOYMENT_CONNECTION is not set
269 # But it should be resolved anyway
271 xml = exp_desc.to_xml()
273 controller = proxy.create_controller(xml, access_config)
275 while not controller.is_finished(app.guid):
277 fake_result = controller.trace(desc.guid, app.guid, "fake")
278 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
280 --- 10.0.0.2 ping statistics ---
281 1 packets transmitted, 1 received, 0% packet loss, time 0ms
283 self.assertTrue(fake_result.startswith(comp_result))
286 controller._deployment_config[desc2.guid]
287 .get_attribute_value(DC.DEPLOYMENT_HOST),
288 addr.get_attribute_value("Address") )
291 controller.shutdown()
293 def TODO_test_ssh_daemonized_all_integration(self):
294 # TODO: This test doesn't run because
295 # sys.modules["nepi.testbeds.mock"] = mock
296 # is not set in the ssh process
297 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
298 env = test_util.test_environment()
300 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
301 inst_root_dir = os.path.join(self.root_dir, "instance")
302 os.mkdir(inst_root_dir)
303 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
304 desc.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
305 desc.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
306 desc.set_attribute_value(DC.USE_AGENT, True)
308 xml = exp_desc.to_xml()
310 access_config = proxy.AccessConfiguration()
311 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
312 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
313 access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
314 access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
315 access_config.set_attribute_value(DC.USE_AGENT, True)
316 controller = proxy.create_controller(xml, access_config)
319 while not controller.is_finished(app.guid):
321 fake_result = controller.trace(desc.guid, app.guid, "fake")
322 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
324 --- 10.0.0.2 ping statistics ---
325 1 packets transmitted, 1 received, 0% packet loss, time 0ms
327 self.assertTrue(fake_result.startswith(comp_result))
329 controller.shutdown()
331 if __name__ == '__main__':