07962e8ec310f55c378857fad2f4cde9f215f635
[nepi.git] / test / resources / omf / omf5_vlc_normal_case.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_factory import OMFAPIFactory
30
31 from nepi.util.timefuncs import *
32
33 import time
34 import unittest
35
36 class OMFResourceFactoryTestCase(unittest.TestCase):
37     def test_creation_phase(self):
38
39         self.assertEquals(OMFNode.get_rtype(), "omf::Node")
40         self.assertEquals(len(OMFNode._attributes), 8)
41
42         self.assertEquals(OMFWifiInterface.get_rtype(), "omf::WifiInterface")
43         self.assertEquals(len(OMFWifiInterface._attributes), 12)
44
45         self.assertEquals(OMFChannel.get_rtype(), "omf::Channel")
46         self.assertEquals(len(OMFChannel._attributes), 8)
47
48         self.assertEquals(OMFApplication.get_rtype(), "omf::Application")
49         self.assertEquals(len(OMFApplication._attributes), 14)
50
51 class OMFEachTestCase(unittest.TestCase):
52     def setUp(self):
53         self.ec = ExperimentController(exp_id = "99999")
54
55         self.node1 = self.ec.register_resource("omf::Node")
56         self.ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
57         self.ec.set(self.node1, 'xmppUser', "nepi")
58         self.ec.set(self.node1, 'xmppServer', "xmpp-plexus.onelab.eu")
59         self.ec.set(self.node1, 'xmppPort', "5222")
60         self.ec.set(self.node1, 'xmppPassword', "1234")
61         self.ec.set(self.node1, 'version', "5")
62         
63         self.iface1 = self.ec.register_resource("omf::WifiInterface")
64         self.ec.set(self.iface1, 'name', "wlan0")
65         self.ec.set(self.iface1, 'mode', "adhoc")
66         self.ec.set(self.iface1, 'hw_mode', "g")
67         self.ec.set(self.iface1, 'essid', "vlcexp")
68         self.ec.set(self.iface1, 'ip', "10.0.0.17/24")
69         self.ec.set(self.iface1, 'version', "5")
70         
71         self.channel = self.ec.register_resource("omf::Channel")
72         self.ec.set(self.channel, 'channel', "6")
73         self.ec.set(self.channel, 'xmppUser', "nepi")
74         self.ec.set(self.channel, 'xmppServer', "xmpp-plexus.onelab.eu")
75         self.ec.set(self.channel, 'xmppPort', "5222")
76         self.ec.set(self.channel, 'xmppPassword', "1234")
77         self.ec.set(self.channel, 'version', "5")
78         
79         self.app1 = self.ec.register_resource("omf::Application")
80         self.ec.set(self.app1, 'appid', 'Vlc#1')
81         self.ec.set(self.app1, 'command', "/opt/vlc-1.1.13/cvlc /opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
82         self.ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
83         self.ec.set(self.app1, 'version', "5")
84
85         self.app2 = self.ec.register_resource("omf::Application")
86         self.ec.set(self.app2, 'version', "5")
87
88         self.app3 = self.ec.register_resource("omf::Application")
89         self.ec.set(self.app3, 'version', "5")
90
91         self.app4 = self.ec.register_resource("omf::Application")
92         self.ec.set(self.app4, 'version', "5")
93
94         self.app5 = self.ec.register_resource("omf::Application")
95         self.ec.set(self.app5, 'version', "5")
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, 'xmppUser'), 'nepi')
119         self.assertEquals(self.ec.get(self.node1, 'xmppServer'), '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         self.assertEquals(self.ec.get(self.node1, 'version'), '5')
123
124
125     def test_creation_and_configuration_interface(self):
126         self.assertEquals(self.ec.get(self.iface1, 'name'), 'wlan0')
127         self.assertEquals(self.ec.get(self.iface1, 'mode'), 'adhoc')
128         self.assertEquals(self.ec.get(self.iface1, 'hw_mode'), 'g')
129         self.assertEquals(self.ec.get(self.iface1, 'essid'), 'vlcexp')
130         self.assertEquals(self.ec.get(self.iface1, 'ip'), '10.0.0.17/24')
131         self.assertEquals(self.ec.get(self.iface1, 'version'), '5')
132
133     def test_creation_and_configuration_channel(self):
134         self.assertEquals(self.ec.get(self.channel, 'channel'), '6')
135         self.assertEquals(self.ec.get(self.channel, 'xmppUser'), 'nepi')
136         self.assertEquals(self.ec.get(self.channel, 'xmppServer'), 'xmpp-plexus.onelab.eu')
137         self.assertEquals(self.ec.get(self.channel, 'xmppPort'), '5222')
138         self.assertEquals(self.ec.get(self.channel, 'xmppPassword'), '1234')
139         self.assertEquals(self.ec.get(self.channel, 'version'), '5')
140
141
142     def test_creation_and_configuration_application(self):
143         self.assertEquals(self.ec.get(self.app1, 'appid'), 'Vlc#1')
144         self.assertEquals(self.ec.get(self.app1, 'command'), "/opt/vlc-1.1.13/cvlc /opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
145         self.assertEquals(self.ec.get(self.app1, 'env'), 'DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority')
146         self.assertEquals(self.ec.get(self.app1, 'version'), '5')
147
148     def test_connection(self):
149         self.assertEquals(len(self.ec.get_resource(self.node1).connections), 6)
150         self.assertEquals(len(self.ec.get_resource(self.iface1).connections), 2)
151         self.assertEquals(len(self.ec.get_resource(self.channel).connections), 1)
152         self.assertEquals(len(self.ec.get_resource(self.app1).connections), 1)
153         self.assertEquals(len(self.ec.get_resource(self.app2).connections), 1)
154
155     def test_condition(self):
156         self.assertEquals(len(self.ec.get_resource(self.app1).conditions[ResourceAction.STOP]), 1)
157         self.assertEquals(len(self.ec.get_resource(self.app2).conditions[ResourceAction.START]), 1)
158         self.assertEquals(len(self.ec.get_resource(self.app3).conditions[ResourceAction.START]), 1)
159         self.assertEquals(len(self.ec.get_resource(self.app4).conditions[ResourceAction.STOP]), 1)
160         self.assertEquals(len(self.ec.get_resource(self.app5).conditions[ResourceAction.START]), 2)
161
162 class OMFVLCNormalCase(unittest.TestCase):
163     def test_deploy(self):
164         ec = ExperimentController(exp_id = "5421" )
165
166         self.node1 = ec.register_resource("omf::Node")
167         ec.set(self.node1, 'hostname', 'omf.plexus.wlab17')
168         ec.set(self.node1, 'xmppUser', "nepi")
169         ec.set(self.node1, 'xmppServer', "xmpp-plexus.onelab.eu")
170         ec.set(self.node1, 'xmppPort', "5222")
171         ec.set(self.node1, 'xmppPassword', "1234")
172         ec.set(self.node1, 'version', "5")
173         
174         self.iface1 = ec.register_resource("omf::WifiInterface")
175         ec.set(self.iface1, 'name', "wlan0")
176         ec.set(self.iface1, 'mode', "adhoc")
177         ec.set(self.iface1, 'hw_mode', "g")
178         ec.set(self.iface1, 'essid', "vlcexp")
179         ec.set(self.iface1, 'ip', "10.0.0.17/24")
180         ec.set(self.iface1, 'version', "5")
181         
182         self.channel = ec.register_resource("omf::Channel")
183         ec.set(self.channel, 'channel', "6")
184         ec.set(self.channel, 'xmppUser', "nepi")
185         ec.set(self.channel, 'xmppServer', "xmpp-plexus.onelab.eu")
186         ec.set(self.channel, 'xmppPort', "5222")
187         ec.set(self.channel, 'xmppPassword', "1234")
188         ec.set(self.channel, 'version', "5")
189         
190         self.app1 = ec.register_resource("omf::Application")
191         ec.set(self.app1, 'appid', 'Vlc#1')
192         ec.set(self.app1, 'command', "/opt/vlc-1.1.13/cvlc /opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'")
193         ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority")
194         ec.set(self.app1, 'version', "5")
195
196         self.app2 = ec.register_resource("omf::Application")
197         ec.set(self.app2, 'appid', 'Test#1')
198         ec.set(self.app2, 'command', "/usr/bin/test -1")
199         ec.set(self.app2, 'env', " ")
200         ec.set(self.app2, 'version', "5")
201
202         self.app3 = ec.register_resource("omf::Application")
203         ec.set(self.app3, 'appid', 'Test#2')
204         ec.set(self.app3, 'command', "/usr/bin/test -2")
205         ec.set(self.app3, 'env', " ")
206         ec.set(self.app3, 'version', "5")
207
208         self.app4 = ec.register_resource("omf::Application")
209         ec.set(self.app4, 'appid', 'Test#3')
210         ec.set(self.app4, 'command', "/usr/bin/test -3")
211         ec.set(self.app4, 'env', " ")
212         ec.set(self.app4, 'version', "5")
213
214         self.app5 = ec.register_resource("omf::Application")
215         ec.set(self.app5, 'appid', 'Kill#2')
216         ec.set(self.app5, 'command', "/usr/bin/killall vlc")
217         ec.set(self.app5, 'env', " ")
218         ec.set(self.app5, 'version', "5")
219
220         ec.register_connection(self.app1, self.node1)
221         ec.register_connection(self.app2, self.node1)
222         ec.register_connection(self.app3, self.node1)
223         ec.register_connection(self.app4, self.node1)
224         ec.register_connection(self.app5, self.node1)
225         ec.register_connection(self.node1, self.iface1)
226         ec.register_connection(self.iface1, self.channel)
227
228         ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s")
229         ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s")
230         ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s")
231         ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s")
232         ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s")
233
234         ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s")
235
236         ec.deploy()
237
238         ec.wait_finished([self.app1, self.app2, self.app3,self.app4, self.app5])
239
240         self.assertEquals(round(tdiffsec(ec.get_resource(self.app2).start_time, ec.get_resource(self.app1).start_time),0), 3.0)
241         self.assertEquals(round(tdiffsec(ec.get_resource(self.app3).start_time, ec.get_resource(self.app2).start_time),0), 2.0)
242         self.assertEquals(round(tdiffsec(ec.get_resource(self.app4).start_time, ec.get_resource(self.app3).start_time),0), 3.0)
243         self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app3).start_time),0), 20.0)
244         self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app1).start_time),0), 25.0)
245
246         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED)
247         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED)
248         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED)
249         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.STOPPED)
250         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.STOPPED)
251         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.STOPPED)
252         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.STOPPED)
253         self.assertEquals(ec.get_resource(self.app5).state, ResourceState.STOPPED)
254
255         ec.shutdown()
256
257         self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED)
258         self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED)
259         self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED)
260         self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED)
261         self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED)
262         self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED)
263         self.assertEquals(ec.get_resource(self.app4).state, ResourceState.RELEASED)
264         self.assertEquals(ec.get_resource(self.app5).state, ResourceState.RELEASED)
265
266
267 if __name__ == '__main__':
268     unittest.main()
269
270
271