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