2 NEPI, a framework to manage network experiments
3 Copyright (C) 2013 INRIA
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 from nepi.execution.ec import ExperimentController
22 from nepi.execution.resource import ResourceState, ResourceAction
23 from nepi.execution.trace import TraceAttr
24 from nepi.resources.linux.node import LinuxNode
25 from nepi.resources.linux.application import LinuxApplication
27 from test_utils import skipIfNotAlive
34 class LinuxApplicationTestCase(unittest.TestCase):
36 self.fedora_host = 'nepi2.pl.sophia.inria.fr'
37 self.fedora_user = 'inria_nepi'
39 self.ubuntu_host = 'roseval.pl.sophia.inria.fr'
40 self.ubuntu_user = 'alina'
42 self.target = 'nepi5.pl.sophia.inria.fr'
45 def t_stdout(self, host, user):
46 from nepi.execution.resource import ResourceFactory
48 ResourceFactory.register_type(LinuxNode)
49 ResourceFactory.register_type(LinuxApplication)
51 ec = ExperimentController()
53 node = ec.register_resource("LinuxNode")
54 ec.set(node, "hostname", host)
55 ec.set(node, "username", user)
56 ec.set(node, "cleanHome", True)
57 ec.set(node, "cleanProcesses", True)
59 app = ec.register_resource("LinuxApplication")
61 ec.set(app, "command", cmd)
62 ec.register_connection(app, node)
66 ec.wait_finished([app])
68 self.assertTrue(ec.state(node) == ResourceState.STARTED)
69 self.assertTrue(ec.state(app) == ResourceState.FINISHED)
71 stdout = ec.trace(app, 'stdout')
72 self.assertTrue(stdout.strip() == "HOLA")
77 def t_ping(self, host, user):
78 from nepi.execution.resource import ResourceFactory
80 ResourceFactory.register_type(LinuxNode)
81 ResourceFactory.register_type(LinuxApplication)
83 ec = ExperimentController()
85 node = ec.register_resource("LinuxNode")
86 ec.set(node, "hostname", host)
87 ec.set(node, "username", user)
88 ec.set(node, "cleanHome", True)
89 ec.set(node, "cleanProcesses", True)
91 app = ec.register_resource("LinuxApplication")
92 cmd = "ping -c5 %s" % self.target
93 ec.set(app, "command", cmd)
95 ec.register_connection(app, node)
99 ec.wait_finished([app])
101 self.assertTrue(ec.state(node) == ResourceState.STARTED)
102 self.assertTrue(ec.state(app) == ResourceState.FINISHED)
104 stdout = ec.trace(app, 'stdout')
105 size = ec.trace(app, 'stdout', attr = TraceAttr.SIZE)
106 self.assertEquals(len(stdout), size)
108 block = ec.trace(app, 'stdout', attr = TraceAttr.STREAM, block = 5, offset = 1)
109 self.assertEquals(block, stdout[5:10])
111 path = ec.trace(app, 'stdout', attr = TraceAttr.PATH)
112 rm = ec.get_resource(app)
113 p = os.path.join(rm.app_home, 'stdout')
114 self.assertEquals(path, p)
119 def t_concurrency(self, host, user):
120 from nepi.execution.resource import ResourceFactory
122 ResourceFactory.register_type(LinuxNode)
123 ResourceFactory.register_type(LinuxApplication)
125 ec = ExperimentController()
127 node = ec.register_resource("LinuxNode")
128 ec.set(node, "hostname", host)
129 ec.set(node, "username", user)
130 ec.set(node, "cleanHome", True)
131 ec.set(node, "cleanProcesses", True)
135 app = ec.register_resource("LinuxApplication")
136 cmd = "ping -c5 %s" % self.target
137 ec.set(app, "command", cmd)
138 ec.register_connection(app, node)
143 ec.wait_finished(apps)
145 self.assertTrue(ec.state(node) == ResourceState.STARTED)
147 all([ec.state(guid) == ResourceState.FINISHED \
152 stdout = ec.trace(app, 'stdout')
153 size = ec.trace(app, 'stdout', attr = TraceAttr.SIZE)
154 self.assertEquals(len(stdout), size)
156 block = ec.trace(app, 'stdout', attr = TraceAttr.STREAM, block = 5, offset = 1)
157 self.assertEquals(block, stdout[5:10])
159 path = ec.trace(app, 'stdout', attr = TraceAttr.PATH)
160 rm = ec.get_resource(app)
161 p = os.path.join(rm.app_home, 'stdout')
162 self.assertEquals(path, p)
167 def t_condition(self, host, user, depends):
168 from nepi.execution.resource import ResourceFactory
170 ResourceFactory.register_type(LinuxNode)
171 ResourceFactory.register_type(LinuxApplication)
173 ec = ExperimentController()
175 node = ec.register_resource("LinuxNode")
176 ec.set(node, "hostname", host)
177 ec.set(node, "username", user)
178 ec.set(node, "cleanHome", True)
179 ec.set(node, "cleanProcesses", True)
181 server = ec.register_resource("LinuxApplication")
182 cmd = "echo 'HOLA' | nc -l 3333"
183 ec.set(server, "command", cmd)
184 ec.set(server, "depends", depends)
185 ec.register_connection(server, node)
187 client = ec.register_resource("LinuxApplication")
188 cmd = "nc 127.0.0.1 3333"
189 ec.set(client, "command", cmd)
190 ec.register_connection(client, node)
192 ec.register_condition(client, ResourceAction.START, server, ResourceState.STARTED)
194 apps = [client, server]
198 ec.wait_finished(apps)
200 self.assertTrue(ec.state(node) == ResourceState.STARTED)
201 self.assertTrue(ec.state(server) == ResourceState.FINISHED)
202 self.assertTrue(ec.state(client) == ResourceState.FINISHED)
204 stdout = ec.trace(client, 'stdout')
205 self.assertTrue(stdout.strip() == "HOLA")
210 def t_http_sources(self, host, user):
211 from nepi.execution.resource import ResourceFactory
213 ResourceFactory.register_type(LinuxNode)
214 ResourceFactory.register_type(LinuxApplication)
216 ec = ExperimentController()
218 node = ec.register_resource("LinuxNode")
219 ec.set(node, "hostname", host)
220 ec.set(node, "username", user)
221 ec.set(node, "cleanHome", True)
222 ec.set(node, "cleanProcesses", True)
224 sources = "http://nepi.inria.fr/attachment/wiki/WikiStart/pybindgen-r794.tar.gz " \
225 "http://nepi.inria.fr/attachment/wiki/WikiStart/nepi_integration_framework.pdf"
227 app = ec.register_resource("LinuxApplication")
228 ec.set(app, "sources", sources)
230 ec.register_connection(app, node)
234 ec.wait_finished([app])
236 self.assertTrue(ec.state(node) == ResourceState.STARTED)
237 self.assertTrue(ec.state(app) == ResourceState.FINISHED)
239 err = ec.trace(app, 'http_sources_err')
240 self.assertTrue(err == "")
242 out = ec.trace(app, 'http_sources_out')
243 self.assertTrue(out.find("pybindgen-r794.tar.gz") > -1)
244 self.assertTrue(out.find("nepi_integration_framework.pdf") > -1)
248 def test_stdout_fedora(self):
249 self.t_stdout(self.fedora_host, self.fedora_user)
251 def test_stdout_ubuntu(self):
252 self.t_stdout(self.ubuntu_host, self.ubuntu_user)
254 def test_ping_fedora(self):
255 self.t_ping(self.fedora_host, self.fedora_user)
257 def test_ping_ubuntu(self):
258 self.t_ping(self.ubuntu_host, self.ubuntu_user)
260 def test_concurrency_fedora(self):
261 self.t_concurrency(self.fedora_host, self.fedora_user)
263 def test_concurrency_ubuntu(self):
264 self.t_concurrency(self.ubuntu_host, self.ubuntu_user)
266 def test_condition_fedora(self):
267 self.t_condition(self.fedora_host, self.fedora_user, "nc")
269 def test_condition_ubuntu(self):
270 self.t_condition(self.ubuntu_host, self.ubuntu_user, "netcat")
272 def test_http_sources_fedora(self):
273 self.t_http_sources(self.fedora_host, self.fedora_user)
275 def test_http_sources_ubuntu(self):
276 self.t_http_sources(self.ubuntu_host, self.ubuntu_user)
279 # TODO: test compilation, sources, dependencies, etc!!!
281 if __name__ == '__main__':