merged ex_shutdown into nepi-3-dev
[nepi.git] / test / resources / omf / vlc.py
1 #!/usr/bin/env python
2 #
3 #    NEPI, a framework to manage network experiments
4 #    Copyright (C) 2013 INRIA
5 #
6 #    This program is free software: you can redistribute it and/or modify
7 #    it under the terms of the GNU General Public License as published by
8 #    the Free Software Foundation, either version 3 of the License, or
9 #    (at your option) any later version.
10 #
11 #    This program is distributed in the hope that it will be useful,
12 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #    GNU General Public License for more details.
15 #
16 #    You should have received a copy of the GNU General Public License
17 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #
19 # Author: Julien Tribino <julien.tribino@inria.fr>
20
21
22 from nepi.execution.resource import ResourceFactory, ResourceManager, ResourceAction, ResourceState
23 from nepi.execution.ec import ExperimentController
24
25 from nepi.resources.omf.node import OMFNode
26 from nepi.resources.omf.application import OMFApplication
27 from nepi.resources.omf.interface import OMFWifiInterface
28 from nepi.resources.omf.channel import OMFChannel
29 from nepi.resources.omf.omf_api import OMFAPIFactory
30
31 from nepi.util.timefuncs import *
32
33 import time
34 import unittest
35
36 class DummyEC(ExperimentController):
37     pass
38
39 class DummyRM(ResourceManager):
40     pass
41
42
43 class OMFResourceFactoryTestCase(unittest.TestCase):
44
45     def test_creation_phase(self):
46
47         self.assertEquals(OMFNode.rtype(), "OMFNode")
48         self.assertEquals(len(OMFNode._attributes), 5)
49
50         self.assertEquals(OMFWifiInterface.rtype(), "OMFWifiInterface")
51         self.assertEquals(len(OMFWifiInterface._attributes), 9)
52
53         self.assertEquals(OMFChannel.rtype(), "OMFChannel")
54         self.assertEquals(len(OMFChannel._attributes), 5)
55
56         self.assertEquals(OMFApplication.rtype(), "OMFApplication")
57         self.assertEquals(len(OMFApplication._attributes), 12)
58
59
60 class OMFEachTestCase(unittest.TestCase):
61
62     def setUp(self):
63         self.ec = DummyEC(exp_id = "99999")
64
65         self.node1 = self.ec.register_resource("OMFNode")
66         self.ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
67         self.ec.set(self.node1, 'xmppSlice', "nepi")
68         self.ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu")
69         self.ec.set(self.node1, 'xmppPort', "5222")
70         self.ec.set(self.node1, 'xmppPassword', "1234")
71         
72         self.iface1 = self.ec.register_resource("OMFWifiInterface")
73         self.ec.set(self.iface1, 'alias', "w0")
74         self.ec.set(self.iface1, 'mode', "adhoc")
75         self.ec.set(self.iface1, 'type', "g")
76         self.ec.set(self.iface1, 'essid', "vlcexp")
77         self.ec.set(self.iface1, 'ip', "10.0.0.17")
78         
79         self.channel = self.ec.register_resource("OMFChannel")
80         self.ec.set(self.channel, 'channel', "6")
81         self.ec.set(self.channel, 'xmppSlice', "nepi")
82         self.ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu")
83         self.ec.set(self.channel, 'xmppPort', "5222")
84         self.ec.set(self.channel, 'xmppPassword', "1234")
85         
86         self.app1 = self.ec.register_resource("OMFApplication")
87         self.ec.set(self.app1, 'appid', 'Vlc#1')
88         self.ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc")
89         self.ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
90         self.ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
91
92         self.app2 = self.ec.register_resource("OMFApplication")
93
94         self.app3 = self.ec.register_resource("OMFApplication")
95         self.app4 = self.ec.register_resource("OMFApplication")
96         self.app5 = self.ec.register_resource("OMFApplication")
97
98         self.ec.register_connection(self.app1, self.node1)
99         self.ec.register_connection(self.app2, self.node1)
100         self.ec.register_connection(self.app3, self.node1)
101         self.ec.register_connection(self.app4, self.node1)
102         self.ec.register_connection(self.app5, self.node1)
103         self.ec.register_connection(self.node1, self.iface1)
104         self.ec.register_connection(self.iface1, self.channel)
105
106         self.ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s")
107         self.ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
108         self.ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s")
109         self.ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s")
110         self.ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s")
111
112         self.ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s")
113
114     def tearDown(self):
115         self.ec.shutdown()
116
117     def test_creation_and_configuration_node(self):
118         self.assertEquals(self.ec.get(self.node1, 'hostname'), 'omf.plexus.wlab17')
119         self.assertEquals(self.ec.get(self.node1, 'xmppSlice'), 'nepi')
120         self.assertEquals(self.ec.get(self.node1, 'xmppHost'), 'xmpp-plexus.onelab.eu')
121         self.assertEquals(self.ec.get(self.node1, 'xmppPort'), '5222')
122         self.assertEquals(self.ec.get(self.node1, 'xmppPassword'), '1234')
123
124     def test_creation_and_configuration_interface(self):
125         self.assertEquals(self.ec.get(self.iface1, 'alias'), 'w0')
126         self.assertEquals(self.ec.get(self.iface1, 'mode'), 'adhoc')
127         self.assertEquals(self.ec.get(self.iface1, 'type'), 'g')
128         self.assertEquals(self.ec.get(self.iface1, 'essid'), 'vlcexp')
129         self.assertEquals(self.ec.get(self.iface1, 'ip'), '10.0.0.17')
130
131     def test_creation_and_configuration_channel(self):
132         self.assertEquals(self.ec.get(self.channel, 'channel'), '6')
133         self.assertEquals(self.ec.get(self.channel, 'xmppSlice'), 'nepi')
134         self.assertEquals(self.ec.get(self.channel, 'xmppHost'), 'xmpp-plexus.onelab.eu')
135         self.assertEquals(self.ec.get(self.channel, 'xmppPort'), '5222')
136         self.assertEquals(self.ec.get(self.channel, 'xmppPassword'), '1234')
137
138     def test_creation_and_configuration_application(self):
139         self.assertEquals(self.ec.get(self.app1, 'appid'), 'Vlc#1')
140         self.assertEquals(self.ec.get(self.app1, 'path'), '/opt/vlc-1.1.13/cvlc')
141         self.assertEquals(self.ec.get(self.app1, 'args'), "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
142         self.assertEquals(self.ec.get(self.app1, 'env'), 'DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority')
143
144     def test_connection(self):
145         self.assertEquals(len(self.ec.get_resource(self.node1).connections), 6)
146         self.assertEquals(len(self.ec.get_resource(self.iface1).connections), 2)
147         self.assertEquals(len(self.ec.get_resource(self.channel).connections), 1)
148         self.assertEquals(len(self.ec.get_resource(self.app1).connections), 1)
149         self.assertEquals(len(self.ec.get_resource(self.app2).connections), 1)
150
151     def test_condition(self):
152         self.assertEquals(len(self.ec.get_resource(self.app1).conditions[ResourceAction.STOP]), 1)
153         self.assertEquals(len(self.ec.get_resource(self.app2).conditions[ResourceAction.START]), 1)
154         self.assertEquals(len(self.ec.get_resource(self.app3).conditions[ResourceAction.START]), 1)
155         self.assertEquals(len(self.ec.get_resource(self.app4).conditions[ResourceAction.STOP]), 1)
156         self.assertEquals(len(self.ec.get_resource(self.app5).conditions[ResourceAction.START]), 2)
157
158
159 class OMFVLCTestCaseComplete(unittest.TestCase):
160
161     def xtest_deploy(self):
162         ec = DummyEC(exp_id = "5421" )
163
164         self.node1 = ec.register_resource("OMFNode")
165         ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
166         ec.set(self.node1, 'xmppSlice', "nepi")
167         ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu")
168         ec.set(self.node1, 'xmppPort', "5222")
169         ec.set(self.node1, 'xmppPassword', "1234")
170         
171         self.iface1 = ec.register_resource("OMFWifiInterface")
172         ec.set(self.iface1, 'alias', "w0")
173         ec.set(self.iface1, 'mode', "adhoc")
174         ec.set(self.iface1, 'type', "g")
175         ec.set(self.iface1, 'essid', "vlcexp")
176         ec.set(self.iface1, 'ip', "10.0.0.17")
177         
178         self.channel = ec.register_resource("OMFChannel")
179         ec.set(self.channel, 'channel', "6")
180         ec.set(self.channel, 'xmppSlice', "nepi")
181         ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu")
182         ec.set(self.channel, 'xmppPort', "5222")
183         ec.set(self.channel, 'xmppPassword', "1234")
184         
185         self.app1 = ec.register_resource("OMFApplication")
186         ec.set(self.app1, 'appid', 'Vlc#1')
187         ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc")
188         ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
189         ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
190
191         self.app2 = ec.register_resource("OMFApplication")
192         ec.set(self.app2, 'appid', 'Test#1')
193         ec.set(self.app2, 'path', "/usr/bin/test")
194         ec.set(self.app2, 'args', "-1")
195         ec.set(self.app2, 'env', " ")
196
197         self.app3 = ec.register_resource("OMFApplication")
198         ec.set(self.app3, 'appid', 'Test#2')
199         ec.set(self.app3, 'path', "/usr/bin/test")
200         ec.set(self.app3, 'args', "-2")
201         ec.set(self.app3, 'env', " ")
202
203         self.app4 = ec.register_resource("OMFApplication")
204         ec.set(self.app4, 'appid', 'Test#3')
205         ec.set(self.app4, 'path', "/usr/bin/test")
206         ec.set(self.app4, 'args', "-3")
207         ec.set(self.app4, 'env', " ")
208
209         self.app5 = ec.register_resource("OMFApplication")
210         ec.set(self.app5, 'appid', 'Kill#2')
211         ec.set(self.app5, 'path', "/usr/bin/killall")
212         ec.set(self.app5, 'args', "vlc")
213         ec.set(self.app5, 'env', " ")
214
215         ec.register_connection(self.app1, self.node1)
216         ec.register_connection(self.app2, self.node1)
217         ec.register_connection(self.app3, self.node1)
218         ec.register_connection(self.app4, self.node1)
219         ec.register_connection(self.app5, self.node1)
220         ec.register_connection(self.node1, self.iface1)
221         ec.register_connection(self.iface1, self.channel)
222
223         ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s")
224         ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
225         ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s")
226         ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s")
227         ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s")
228
229         ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s")
230
231         ec.deploy()
232
233         ec.wait_finished([self.app1, self.app2, self.app3,self.app4, self.app5])
234
235         time.sleep(1)
236
237         self.assertEquals(round(tdiffsec(ec.get_resource(self.app2).start_time, ec.get_resource(self.app1).start_time),0), 3.0)
238         self.assertEquals(round(tdiffsec(ec.get_resource(self.app3).start_time, ec.get_resource(self.app2).start_time),0), 2.0)
239         self.assertEquals(round(tdiffsec(ec.get_resource(self.app4).start_time, ec.get_resource(self.app3).start_time),0), 3.0)
240         self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app3).start_time),0), 20.0)
241         self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app1).start_time),0), 25.0)
242
243         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED)
244         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED)
245         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED)
246         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.FINISHED)
247         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.FINISHED)
248         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.FINISHED)
249         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.FINISHED)
250         self.assertEquals(ec.get_resource(self.app5).state, ResourceState.FINISHED)
251
252         ec.shutdown()
253         time.sleep(1)
254
255         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED)
256         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED)
257         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED)
258         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED)
259         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED)
260         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED)
261         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.RELEASED)
262         self.assertEquals(ec.get_resource(self.app5).state, ResourceState.RELEASED)
263
264
265
266 class OMFVLCTestCaseNoComplete(unittest.TestCase):
267     def test_deploy(self):
268
269         ec = DummyEC(exp_id = "1245" )
270
271         self.node1 = ec.register_resource("OMFNode")
272         ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
273         ec.set(self.node1, 'xmppSlice', "nepi")
274         ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu")
275         ec.set(self.node1, 'xmppPort', "5222")
276         ec.set(self.node1, 'xmppPassword', "1234")
277
278         self.node2 = ec.register_resource("OMFNode")
279         
280         self.iface1 = ec.register_resource("OMFWifiInterface")
281         ec.set(self.iface1, 'alias', "w0")
282         ec.set(self.iface1, 'mode', "adhoc")
283         ec.set(self.iface1, 'type', "g")
284         ec.set(self.iface1, 'essid', "vlcexp")
285         ec.set(self.iface1, 'ip', "10.0.0.17")
286
287         self.iface2 = ec.register_resource("OMFWifiInterface")
288         
289         self.channel = ec.register_resource("OMFChannel")
290         ec.set(self.channel, 'channel', "6")
291         ec.set(self.channel, 'xmppSlice', "nepi")
292         ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu")
293         ec.set(self.channel, 'xmppPort', "5222")
294         ec.set(self.channel, 'xmppPassword', "1234")
295         
296         self.app1 = ec.register_resource("OMFApplication")
297         ec.set(self.app1, 'appid', 'Vlc#1')
298         ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc")
299         ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
300         ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
301
302         self.app2 = ec.register_resource("OMFApplication")
303
304         self.app3 = ec.register_resource("OMFApplication")
305         ec.set(self.app3, 'appid', 'Kill#2')
306         ec.set(self.app3, 'path', "/usr/bin/killall")
307         ec.set(self.app3, 'args', "vlc")
308         ec.set(self.app3, 'env', " ")
309
310         ec.register_connection(self.app1, self.node1)
311         ec.register_connection(self.app2, self.node1)
312         ec.register_connection(self.app3, self.node1)
313         ec.register_connection(self.node1, self.iface1)
314         ec.register_connection(self.iface1, self.channel)
315         ec.register_connection(self.node2, self.iface2)
316         ec.register_connection(self.iface2, self.channel)
317
318         ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "2s")
319         ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
320
321         ec.register_condition([self.app1, self.app2, self.app3], ResourceAction.STOP, self.app1, ResourceState.STARTED , "6s")
322
323         ec.deploy()
324
325         ec.wait_finished([self.app1, self.app2, self.app3])
326
327 #        self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED)
328 #        self.assertEquals(ec.get_resource(self.node2).state, ResourceState.FAILED)
329 #        self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED)
330 #        self.assertEquals(ec.get_resource(self.iface2).state, ResourceState.FAILED)
331 #        self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED)
332 #        self.assertEquals(ec.get_resource(self.app1).state, ResourceState.FINISHED)
333 #        self.assertEquals(ec.get_resource(self.app2).state, ResourceState.FAILED)
334 #        self.assertEquals(ec.get_resource(self.app3).state, ResourceState.FINISHED)
335
336         time.sleep(1)
337
338         ec.shutdown()
339
340         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED)
341         self.assertEquals(ec.get_resource(self.node2).state, ResourceState.RELEASED)
342         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED)
343         self.assertEquals(ec.get_resource(self.iface2).state, ResourceState.RELEASED)
344         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED)
345         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED)
346         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED)
347         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED)
348
349 if __name__ == '__main__':
350     unittest.main()
351
352
353