Fixing get_ip and do_ping method PLnode
[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), 9)
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         self.ec.set(self.iface1, 'xmppSlice', "nepi")
79         self.ec.set(self.iface1, 'xmppHost', "xmpp-plexus.onelab.eu")
80         self.ec.set(self.iface1, 'xmppPort', "5222")
81         self.ec.set(self.iface1, 'xmppPassword', "1234")
82         
83         self.channel = self.ec.register_resource("OMFChannel")
84         self.ec.set(self.channel, 'channel', "6")
85         self.ec.set(self.channel, 'xmppSlice', "nepi")
86         self.ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu")
87         self.ec.set(self.channel, 'xmppPort', "5222")
88         self.ec.set(self.channel, 'xmppPassword', "1234")
89         
90         self.app1 = self.ec.register_resource("OMFApplication")
91         self.ec.set(self.app1, 'appid', 'Vlc#1')
92         self.ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc")
93         self.ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
94         self.ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
95         self.ec.set(self.app1, 'xmppSlice', "nepi")
96         self.ec.set(self.app1, 'xmppHost', "xmpp-plexus.onelab.eu")
97         self.ec.set(self.app1, 'xmppPort', "5222")
98         self.ec.set(self.app1, 'xmppPassword', "1234")
99
100         self.app2 = self.ec.register_resource("OMFApplication")
101
102         self.app3 = self.ec.register_resource("OMFApplication")
103         self.app4 = self.ec.register_resource("OMFApplication")
104         self.app5 = self.ec.register_resource("OMFApplication")
105
106         self.ec.register_connection(self.app1, self.node1)
107         self.ec.register_connection(self.app2, self.node1)
108         self.ec.register_connection(self.app3, self.node1)
109         self.ec.register_connection(self.app4, self.node1)
110         self.ec.register_connection(self.app5, self.node1)
111         self.ec.register_connection(self.node1, self.iface1)
112         self.ec.register_connection(self.iface1, self.channel)
113
114         self.ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s")
115         self.ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
116         self.ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s")
117         self.ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s")
118         self.ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s")
119
120         self.ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s")
121
122     def tearDown(self):
123         self.ec.shutdown()
124
125     def test_creation_and_configuration_node(self):
126         self.assertEquals(self.ec.get(self.node1, 'hostname'), 'omf.plexus.wlab17')
127         self.assertEquals(self.ec.get(self.node1, 'xmppSlice'), 'nepi')
128         self.assertEquals(self.ec.get(self.node1, 'xmppHost'), 'xmpp-plexus.onelab.eu')
129         self.assertEquals(self.ec.get(self.node1, 'xmppPort'), '5222')
130         self.assertEquals(self.ec.get(self.node1, 'xmppPassword'), '1234')
131
132     def test_creation_and_configuration_interface(self):
133         self.assertEquals(self.ec.get(self.iface1, 'alias'), 'w0')
134         self.assertEquals(self.ec.get(self.iface1, 'mode'), 'adhoc')
135         self.assertEquals(self.ec.get(self.iface1, 'type'), 'g')
136         self.assertEquals(self.ec.get(self.iface1, 'essid'), 'vlcexp')
137         self.assertEquals(self.ec.get(self.iface1, 'ip'), '10.0.0.17')
138         self.assertEquals(self.ec.get(self.iface1, 'xmppSlice'), 'nepi')
139         self.assertEquals(self.ec.get(self.iface1, 'xmppHost'), 'xmpp-plexus.onelab.eu')
140         self.assertEquals(self.ec.get(self.iface1, 'xmppPort'), '5222')
141         self.assertEquals(self.ec.get(self.iface1, 'xmppPassword'), '1234')
142
143     def test_creation_and_configuration_channel(self):
144         self.assertEquals(self.ec.get(self.channel, 'channel'), '6')
145         self.assertEquals(self.ec.get(self.channel, 'xmppSlice'), 'nepi')
146         self.assertEquals(self.ec.get(self.channel, 'xmppHost'), 'xmpp-plexus.onelab.eu')
147         self.assertEquals(self.ec.get(self.channel, 'xmppPort'), '5222')
148         self.assertEquals(self.ec.get(self.channel, 'xmppPassword'), '1234')
149
150     def test_creation_and_configuration_application(self):
151         self.assertEquals(self.ec.get(self.app1, 'appid'), 'Vlc#1')
152         self.assertEquals(self.ec.get(self.app1, 'path'), '/opt/vlc-1.1.13/cvlc')
153         self.assertEquals(self.ec.get(self.app1, 'args'), "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
154         self.assertEquals(self.ec.get(self.app1, 'env'), 'DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority')
155         self.assertEquals(self.ec.get(self.app1, 'xmppSlice'), 'nepi')
156         self.assertEquals(self.ec.get(self.app1, 'xmppHost'), 'xmpp-plexus.onelab.eu')
157         self.assertEquals(self.ec.get(self.app1, 'xmppPort'), '5222')
158         self.assertEquals(self.ec.get(self.app1, 'xmppPassword'), '1234')
159
160     def test_connection(self):
161         self.assertEquals(len(self.ec.get_resource(self.node1).connections), 6)
162         self.assertEquals(len(self.ec.get_resource(self.iface1).connections), 2)
163         self.assertEquals(len(self.ec.get_resource(self.channel).connections), 1)
164         self.assertEquals(len(self.ec.get_resource(self.app1).connections), 1)
165         self.assertEquals(len(self.ec.get_resource(self.app2).connections), 1)
166
167     def test_condition(self):
168         self.assertEquals(len(self.ec.get_resource(self.app1).conditions[ResourceAction.STOP]), 1)
169         self.assertEquals(len(self.ec.get_resource(self.app2).conditions[ResourceAction.START]), 1)
170         self.assertEquals(len(self.ec.get_resource(self.app3).conditions[ResourceAction.START]), 1)
171         self.assertEquals(len(self.ec.get_resource(self.app4).conditions[ResourceAction.STOP]), 1)
172         self.assertEquals(len(self.ec.get_resource(self.app5).conditions[ResourceAction.START]), 2)
173
174
175 class OMFVLCTestCaseComplete(unittest.TestCase):
176
177     def test_deploy(self):
178         ec = DummyEC(exp_id = "5421" )
179
180         self.node1 = ec.register_resource("OMFNode")
181         ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
182         ec.set(self.node1, 'xmppSlice', "nepi")
183         ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu")
184         ec.set(self.node1, 'xmppPort', "5222")
185         ec.set(self.node1, 'xmppPassword', "1234")
186         
187         self.iface1 = ec.register_resource("OMFWifiInterface")
188         ec.set(self.iface1, 'alias', "w0")
189         ec.set(self.iface1, 'mode', "adhoc")
190         ec.set(self.iface1, 'type', "g")
191         ec.set(self.iface1, 'essid', "vlcexp")
192         ec.set(self.iface1, 'ip', "10.0.0.17")
193         ec.set(self.iface1, 'xmppSlice', "nepi")
194         ec.set(self.iface1, 'xmppHost', "xmpp-plexus.onelab.eu")
195         ec.set(self.iface1, 'xmppPort', "5222")
196         ec.set(self.iface1, 'xmppPassword', "1234")
197         
198         self.channel = ec.register_resource("OMFChannel")
199         ec.set(self.channel, 'channel', "6")
200         ec.set(self.channel, 'xmppSlice', "nepi")
201         ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu")
202         ec.set(self.channel, 'xmppPort', "5222")
203         ec.set(self.channel, 'xmppPassword', "1234")
204         
205         self.app1 = ec.register_resource("OMFApplication")
206         ec.set(self.app1, 'appid', 'Vlc#1')
207         ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc")
208         ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
209         ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
210         ec.set(self.app1, 'xmppSlice', "nepi")
211         ec.set(self.app1, 'xmppHost', "xmpp-plexus.onelab.eu")
212         ec.set(self.app1, 'xmppPort', "5222")
213         ec.set(self.app1, 'xmppPassword', "1234")
214
215         self.app2 = ec.register_resource("OMFApplication")
216         ec.set(self.app2, 'appid', 'Test#1')
217         ec.set(self.app2, 'path', "/usr/bin/test")
218         ec.set(self.app2, 'args', "-1")
219         ec.set(self.app2, 'env', " ")
220         ec.set(self.app2, 'xmppSlice', "nepi")
221         ec.set(self.app2, 'xmppHost', "xmpp-plexus.onelab.eu")
222         ec.set(self.app2, 'xmppPort', "5222")
223         ec.set(self.app2, 'xmppPassword', "1234")
224
225         self.app3 = ec.register_resource("OMFApplication")
226         ec.set(self.app3, 'appid', 'Test#2')
227         ec.set(self.app3, 'path', "/usr/bin/test")
228         ec.set(self.app3, 'args', "-2")
229         ec.set(self.app3, 'env', " ")
230         ec.set(self.app3, 'xmppSlice', "nepi")
231         ec.set(self.app3, 'xmppHost', "xmpp-plexus.onelab.eu")
232         ec.set(self.app3, 'xmppPort', "5222")
233         ec.set(self.app3, 'xmppPassword', "1234")
234
235         self.app4 = ec.register_resource("OMFApplication")
236         ec.set(self.app4, 'appid', 'Test#3')
237         ec.set(self.app4, 'path', "/usr/bin/test")
238         ec.set(self.app4, 'args', "-3")
239         ec.set(self.app4, 'env', " ")
240         ec.set(self.app4, 'xmppSlice', "nepi")
241         ec.set(self.app4, 'xmppHost', "xmpp-plexus.onelab.eu")
242         ec.set(self.app4, 'xmppPort', "5222")
243         ec.set(self.app4, 'xmppPassword', "1234")
244
245         self.app5 = ec.register_resource("OMFApplication")
246         ec.set(self.app5, 'appid', 'Kill#2')
247         ec.set(self.app5, 'path', "/usr/bin/killall")
248         ec.set(self.app5, 'args', "vlc")
249         ec.set(self.app5, 'env', " ")
250         ec.set(self.app5, 'xmppSlice', "nepi")
251         ec.set(self.app5, 'xmppHost', "xmpp-plexus.onelab.eu")
252         ec.set(self.app5, 'xmppPort', "5222")
253         ec.set(self.app5, 'xmppPassword', "1234")
254
255         ec.register_connection(self.app1, self.node1)
256         ec.register_connection(self.app2, self.node1)
257         ec.register_connection(self.app3, self.node1)
258         ec.register_connection(self.app4, self.node1)
259         ec.register_connection(self.app5, self.node1)
260         ec.register_connection(self.node1, self.iface1)
261         ec.register_connection(self.iface1, self.channel)
262
263         ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s")
264         ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
265         ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s")
266         ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s")
267         ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s")
268
269         ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s")
270
271         ec.deploy()
272
273         ec.wait_finished([self.app1, self.app2, self.app3,self.app4, self.app5])
274
275         time.sleep(2)
276
277         self.assertEquals(round(tdiffsec(ec.get_resource(self.app2).start_time, ec.get_resource(self.app1).start_time),0), 3.0)
278         self.assertEquals(round(tdiffsec(ec.get_resource(self.app3).start_time, ec.get_resource(self.app2).start_time),0), 2.0)
279         self.assertEquals(round(tdiffsec(ec.get_resource(self.app4).start_time, ec.get_resource(self.app3).start_time),0), 3.0)
280         self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app3).start_time),0), 20.0)
281         self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app1).start_time),0), 25.0)
282
283         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED)
284         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED)
285         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED)
286         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.FINISHED)
287         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.FINISHED)
288         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.FINISHED)
289         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.FINISHED)
290         self.assertEquals(ec.get_resource(self.app5).state, ResourceState.FINISHED)
291
292         ec.shutdown()
293         time.sleep(2)
294
295         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED)
296         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED)
297         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED)
298         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED)
299         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED)
300         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED)
301         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.RELEASED)
302         self.assertEquals(ec.get_resource(self.app5).state, ResourceState.RELEASED)
303
304
305
306 class OMFVLCTestCaseNoComplete(unittest.TestCase):
307     def test_deploy(self):
308
309         ec = DummyEC(exp_id = "1245" )
310
311         self.node1 = ec.register_resource("OMFNode")
312         ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
313         ec.set(self.node1, 'xmppSlice', "nepi")
314         ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu")
315         ec.set(self.node1, 'xmppPort', "5222")
316         ec.set(self.node1, 'xmppPassword', "1234")
317
318         self.node2 = ec.register_resource("OMFNode")
319         
320         self.iface1 = ec.register_resource("OMFWifiInterface")
321         ec.set(self.iface1, 'alias', "w0")
322         ec.set(self.iface1, 'mode', "adhoc")
323         ec.set(self.iface1, 'type', "g")
324         ec.set(self.iface1, 'essid', "vlcexp")
325         ec.set(self.iface1, 'ip', "10.0.0.17")
326         ec.set(self.iface1, 'xmppSlice', "nepi")
327         ec.set(self.iface1, 'xmppHost', "xmpp-plexus.onelab.eu")
328         ec.set(self.iface1, 'xmppPort', "5222")
329         ec.set(self.iface1, 'xmppPassword', "1234")
330
331         self.iface2 = ec.register_resource("OMFWifiInterface")
332         
333         self.channel = ec.register_resource("OMFChannel")
334         ec.set(self.channel, 'channel', "6")
335         ec.set(self.channel, 'xmppSlice', "nepi")
336         ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu")
337         ec.set(self.channel, 'xmppPort', "5222")
338         ec.set(self.channel, 'xmppPassword', "1234")
339         
340         self.app1 = ec.register_resource("OMFApplication")
341         ec.set(self.app1, 'appid', 'Vlc#1')
342         ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc")
343         ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
344         ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
345         ec.set(self.app1, 'xmppSlice', "nepi")
346         ec.set(self.app1, 'xmppHost', "xmpp-plexus.onelab.eu")
347         ec.set(self.app1, 'xmppPort', "5222")
348         ec.set(self.app1, 'xmppPassword', "1234")
349
350         self.app2 = ec.register_resource("OMFApplication")
351         ec.set(self.app2, 'xmppSlice', "nepi")
352         ec.set(self.app2, 'xmppHost', "xmpp-plexus.onelab.eu")
353         ec.set(self.app2, 'xmppPort', "5222")
354         ec.set(self.app2, 'xmppPassword', "1234")
355
356         self.app3 = ec.register_resource("OMFApplication")
357         ec.set(self.app3, 'appid', 'Kill#2')
358         ec.set(self.app3, 'path', "/usr/bin/killall")
359         ec.set(self.app3, 'args', "vlc")
360         ec.set(self.app3, 'env', " ")
361
362         self.app4 = ec.register_resource("OMFApplication")
363
364         ec.register_connection(self.app1, self.node1)
365         ec.register_connection(self.app2, self.node1)
366         ec.register_connection(self.app3, self.node1)
367         ec.register_connection(self.app4, self.node1)
368         ec.register_connection(self.node1, self.iface1)
369         ec.register_connection(self.iface1, self.channel)
370         ec.register_connection(self.node2, self.iface2)
371         ec.register_connection(self.iface2, self.channel)
372
373         ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "2s")
374         ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
375         ec.register_condition(self.app4, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s")
376
377         ec.register_condition([self.app1, self.app2, self.app3], ResourceAction.STOP, self.app1, ResourceState.STARTED , "8s")
378
379         ec.deploy()
380
381         ec.wait_finished([self.app1, self.app2, self.app3,self.app4])
382
383         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED)
384         self.assertEquals(ec.get_resource(self.node2).state, ResourceState.FAILED)
385         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED)
386         self.assertEquals(ec.get_resource(self.iface2).state, ResourceState.FAILED)
387         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED)
388         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.FINISHED)
389         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.FAILED)
390         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.FAILED)
391         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.FAILED)
392
393         time.sleep(1)
394
395         ec.shutdown()
396
397         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED)
398         self.assertEquals(ec.get_resource(self.node2).state, ResourceState.RELEASED)
399         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED)
400         self.assertEquals(ec.get_resource(self.iface2).state, ResourceState.RELEASED)
401         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED)
402         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED)
403         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED)
404         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED)
405         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.RELEASED)
406
407 if __name__ == '__main__':
408     unittest.main()
409
410
411