2 # -*- coding: utf-8 -*-
4 from nepi.core.design import ExperimentDescription, FactoriesProvider
5 from nepi.util.constants import STATUS_FINISHED, DeploymentConfiguration as DC
6 from nepi.util import proxy
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()
28 shutil.rmtree(self.root_dir)
30 def make_testbed(self, exp_desc, testbed_id, testbed_version):
31 provider = FactoriesProvider(testbed_id, testbed_version)
32 desc = exp_desc.add_testbed_description(provider)
33 desc.set_attribute_value("fake", True)
34 node1 = desc.create("Node")
35 node2 = desc.create("Node")
36 iface1 = desc.create("Interface")
37 iface1.set_attribute_value("fake", True)
38 node1.connector("devs").connect(iface1.connector("node"))
39 iface2 = desc.create("Interface")
40 iface2.set_attribute_value("fake", True)
41 node2.connector("devs").connect(iface2.connector("node"))
42 iface1.connector("iface").connect(iface2.connector("iface"))
43 app = desc.create("Application")
44 app.connector("node").connect(node1.connector("apps"))
45 app.enable_trace("fake")
47 return exp_desc, desc, app, node1, node2, iface1, iface2
49 def make_test_experiment(self):
50 exp_desc = ExperimentDescription()
51 testbed_version = "01"
53 return self.make_testbed(exp_desc, testbed_id, testbed_version)
55 def make_cross_test_experiment(self):
56 exp_desc = ExperimentDescription()
57 testbed_version = "01"
60 exp_desc, desc1, app1, node11, node12, iface11, iface12 = \
61 self.make_testbed(exp_desc, testbed_id1, testbed_version)
62 exp_desc, desc2, app2, node21, node22, iface21, iface22 = \
63 self.make_testbed(exp_desc, testbed_id2, testbed_version)
64 iface12.connector("cross").connect(iface21.connector("cross"))
66 return exp_desc, desc1, desc2, iface12, iface21
68 def test_single_process_cross_integration(self):
69 exp_desc, desc1, desc2, iface12, iface21 = \
70 self.make_cross_test_experiment()
71 xml = exp_desc.to_xml()
73 controller = proxy.create_controller(xml, access_config)
76 cross1 = controller.get(desc1.guid, iface12.guid, "cross")
77 cross2 = controller.get(desc2.guid, iface21.guid, "cross")
78 self.assertTrue(cross1 == cross2 == True)
82 def test_single_process_integration(self):
83 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
84 xml = exp_desc.to_xml()
86 controller = proxy.create_controller(xml, access_config)
89 while not controller.is_finished(app.guid):
91 fake_result = controller.trace(desc.guid, app.guid, "fake")
92 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
94 --- 10.0.0.2 ping statistics ---
95 1 packets transmitted, 1 received, 0% packet loss, time 0ms
97 self.assertTrue(fake_result.startswith(comp_result))
101 def test_daemonized_controller_integration(self):
102 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
103 xml = exp_desc.to_xml()
104 access_config = proxy.AccessConfiguration()
105 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
106 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
107 controller = proxy.create_controller(xml, access_config)
110 while not controller.is_finished(app.guid):
112 fake_result = controller.trace(desc.guid, app.guid, "fake")
113 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
115 --- 10.0.0.2 ping statistics ---
116 1 packets transmitted, 1 received, 0% packet loss, time 0ms
118 self.assertTrue(fake_result.startswith(comp_result))
120 controller.shutdown()
122 def test_daemonized_testbed_integration(self):
123 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
125 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
126 desc.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
128 xml = exp_desc.to_xml()
130 controller = proxy.create_controller(xml, access_config = None)
133 while not controller.is_finished(app.guid):
135 fake_result = controller.trace(desc.guid, app.guid, "fake")
136 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
138 --- 10.0.0.2 ping statistics ---
139 1 packets transmitted, 1 received, 0% packet loss, time 0ms
141 self.assertTrue(fake_result.startswith(comp_result))
143 controller.shutdown()
145 def test_daemonized_all_integration(self):
146 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
148 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
149 inst_root_dir = os.path.join(self.root_dir, "instance")
150 os.mkdir(inst_root_dir)
151 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
153 xml = exp_desc.to_xml()
155 access_config = proxy.AccessConfiguration()
156 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
157 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
158 controller = proxy.create_controller(xml, access_config)
161 while not controller.is_finished(app.guid):
163 fake_result = controller.trace(desc.guid, app.guid, "fake")
164 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
166 --- 10.0.0.2 ping statistics ---
167 1 packets transmitted, 1 received, 0% packet loss, time 0ms
169 self.assertTrue(fake_result.startswith(comp_result))
171 controller.shutdown()
173 def test_daemonized_all_integration_recovery(self):
174 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
176 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
177 inst_root_dir = os.path.join(self.root_dir, "instance")
178 os.mkdir(inst_root_dir)
179 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
181 xml = exp_desc.to_xml()
183 access_config = proxy.AccessConfiguration()
184 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
185 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
186 controller = proxy.create_controller(xml, access_config)
189 while not controller.is_finished(app.guid):
191 fake_result = controller.trace(desc.guid, app.guid, "fake")
192 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
194 --- 10.0.0.2 ping statistics ---
195 1 packets transmitted, 1 received, 0% packet loss, time 0ms
197 self.assertTrue(fake_result.startswith(comp_result))
203 access_config.set_attribute_value(DC.RECOVER,True)
204 controller = proxy.create_controller(xml, access_config)
207 self.assertTrue(controller.is_finished(app.guid))
208 fake_result = controller.trace(desc.guid, app.guid, "fake")
209 self.assertTrue(fake_result.startswith(comp_result))
212 controller.shutdown()
214 def test_reference_expressions(self):
215 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
217 iface1.set_attribute_value("label", "some")
218 addr = iface1.add_address()
219 addr.set_attribute_value("Address", "10.0.0.2")
220 iface2.set_attribute_value("test", "{#[some].addr[0].[Address]#}")
222 # TODO: Test actual substitution
224 xml = exp_desc.to_xml()
226 controller = proxy.create_controller(xml, access_config)
228 while not controller.is_finished(app.guid):
230 fake_result = controller.trace(desc.guid, app.guid, "fake")
231 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
233 --- 10.0.0.2 ping statistics ---
234 1 packets transmitted, 1 received, 0% packet loss, time 0ms
236 self.assertTrue(fake_result.startswith(comp_result))
238 controller.shutdown()
240 def TODO_test_ssh_daemonized_all_integration(self):
241 # TODO: This test doesn't run because
242 # sys.modules["nepi.testbeds.mock"] = mock
243 # is not set in the ssh process
244 exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
245 env = test_util.test_environment()
247 desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
248 inst_root_dir = os.path.join(self.root_dir, "instance")
249 os.mkdir(inst_root_dir)
250 desc.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
251 desc.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
252 desc.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
253 desc.set_attribute_value(DC.USE_AGENT, True)
255 xml = exp_desc.to_xml()
257 access_config = proxy.AccessConfiguration()
258 access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
259 access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
260 access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
261 access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
262 access_config.set_attribute_value(DC.USE_AGENT, True)
263 controller = proxy.create_controller(xml, access_config)
266 while not controller.is_finished(app.guid):
268 fake_result = controller.trace(desc.guid, app.guid, "fake")
269 comp_result = """PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
271 --- 10.0.0.2 ping statistics ---
272 1 packets transmitted, 1 received, 0% packet loss, time 0ms
274 self.assertTrue(fake_result.startswith(comp_result))
276 controller.shutdown()
278 if __name__ == '__main__':