Ticket #29: Phasing out AccessConfiguration.
[nepi.git] / test / core / integration.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
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
7 import mock
8 import mock.metadata_v01
9 import mock2
10 import mock2.metadata_v01
11 import os
12 import shutil
13 import sys
14 import tempfile
15 import test_util
16 import time
17 import unittest
18
19 class ExecuteTestCase(unittest.TestCase):
20     def setUp(self):
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()
26
27     def tearDown(self):
28         shutil.rmtree(self.root_dir)
29
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")
46         
47         return exp_desc, desc, app, node1, node2, iface1, iface2
48
49     def make_test_experiment(self):
50         exp_desc = ExperimentDescription()
51         testbed_version = "01"
52         testbed_id = "mock"
53         return self.make_testbed(exp_desc, testbed_id, testbed_version)
54
55     def make_cross_test_experiment(self):
56         exp_desc = ExperimentDescription()
57         testbed_version = "01"
58         testbed_id1 = "mock"
59         testbed_id2 = "mock2"
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"))
65
66         return exp_desc, desc1, desc2, iface12, iface21
67
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()
72         access_config = None
73         controller = proxy.create_controller(xml, access_config)
74
75         controller.start()
76         cross1 = controller.get(desc1.guid, iface12.guid, "cross")
77         cross2 = controller.get(desc2.guid, iface21.guid, "cross")
78         self.assertTrue(cross1 == cross2 == True)
79         controller.stop()
80         controller.shutdown()
81
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()
85         access_config = None
86         controller = proxy.create_controller(xml, access_config)
87
88         controller.start()
89         while not controller.is_finished(app.guid):
90             time.sleep(0.5)
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.
93
94 --- 10.0.0.2 ping statistics ---
95 1 packets transmitted, 1 received, 0% packet loss, time 0ms
96 """
97         self.assertTrue(fake_result.startswith(comp_result))
98         controller.stop()
99         controller.shutdown()
100
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)
108
109         controller.start()
110         while not controller.is_finished(app.guid):
111             time.sleep(0.5)
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.
114
115 --- 10.0.0.2 ping statistics ---
116 1 packets transmitted, 1 received, 0% packet loss, time 0ms
117 """
118         self.assertTrue(fake_result.startswith(comp_result))
119         controller.stop()
120         controller.shutdown()
121
122     def test_daemonized_testbed_integration(self):
123         exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
124         
125         desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
126         desc.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
127
128         xml = exp_desc.to_xml()
129         
130         controller = proxy.create_controller(xml, access_config = None)
131
132         controller.start()
133         while not controller.is_finished(app.guid):
134             time.sleep(0.5)
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.
137
138 --- 10.0.0.2 ping statistics ---
139 1 packets transmitted, 1 received, 0% packet loss, time 0ms
140 """
141         self.assertTrue(fake_result.startswith(comp_result))
142         controller.stop()
143         controller.shutdown()
144
145     def test_daemonized_all_integration(self):
146         exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
147         
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)
152         
153         xml = exp_desc.to_xml()
154         
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)
159
160         controller.start()
161         while not controller.is_finished(app.guid):
162             time.sleep(0.5)
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.
165
166 --- 10.0.0.2 ping statistics ---
167 1 packets transmitted, 1 received, 0% packet loss, time 0ms
168 """
169         self.assertTrue(fake_result.startswith(comp_result))
170         controller.stop()
171         controller.shutdown()
172
173     def test_daemonized_all_integration_recovery(self):
174         exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
175         
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)
180         
181         xml = exp_desc.to_xml()
182         
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)
187
188         controller.start()
189         while not controller.is_finished(app.guid):
190             time.sleep(0.5)
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.
193
194 --- 10.0.0.2 ping statistics ---
195 1 packets transmitted, 1 received, 0% packet loss, time 0ms
196 """
197         self.assertTrue(fake_result.startswith(comp_result))
198         
199         # controller dies
200         del controller
201         
202         # recover
203         access_config.set_attribute_value(DC.RECOVER,True)
204         controller = proxy.create_controller(xml, access_config)
205         
206         # test recovery
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))
210         
211         controller.stop()
212         controller.shutdown()
213
214     def test_reference_expressions(self):
215         exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
216         
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]#}")
221         
222         # TODO: Test actual substitution
223         
224         xml = exp_desc.to_xml()
225         access_config = None
226         controller = proxy.create_controller(xml, access_config)
227         controller.start()
228         while not controller.is_finished(app.guid):
229             time.sleep(0.5)
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.
232
233 --- 10.0.0.2 ping statistics ---
234 1 packets transmitted, 1 received, 0% packet loss, time 0ms
235 """
236         self.assertTrue(fake_result.startswith(comp_result))
237         controller.stop()
238         controller.shutdown()
239
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()
246         
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)
254         
255         xml = exp_desc.to_xml()
256         
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)
264
265         controller.start()
266         while not controller.is_finished(app.guid):
267             time.sleep(0.5)
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.
270
271 --- 10.0.0.2 ping statistics ---
272 1 packets transmitted, 1 received, 0% packet loss, time 0ms
273 """
274         self.assertTrue(fake_result.startswith(comp_result))
275         controller.stop()
276         controller.shutdown()
277  
278 if __name__ == '__main__':
279     unittest.main()
280