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