5bca9692d25ccb38c537c5c3ce06640c38926919
[nepi.git] / test / resources / omf / wilab_node.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: Lucia Guevgeozian <lucia.guevgeozian_odizzio@inria.fr>
20
21 from nepi.execution.ec import ExperimentController
22 from nepi.resources.omf.wilabt_node import WilabtSfaNode
23 from nepi.util.sfaapi import SFAAPI, SFAAPIFactory
24
25 from test_utils import skipIfNotSfi
26
27 import os
28 import time
29 import unittest
30 import multiprocessing
31
32 class DummyEC(ExperimentController):
33     pass
34
35 class WilabtSfaNodeFactoryTestCase(unittest.TestCase):
36
37     def test_creation_phase(self):
38         self.assertEquals(WilabtSfaNode._rtype, "WilabtSfaNode")
39         self.assertEquals(len(WilabtSfaNode._attributes), 17)
40
41 class WilabtSfaNodeTestCase(unittest.TestCase):
42     """
43     This tests use inria_nepi slice, from the test instance of MyPLC
44     nepiplc.pl.sophia.inria.fr. This test can fail if the user running
45     the test does not have a user in this instance of MyPLC or is not
46     added to the inria_nepi slice.
47     """
48
49     def setUp(self):
50         self.ec = DummyEC()
51         slicepl = os.environ.get('SFA_SLICE')
52         slicename = ['ple'] + slicepl.split('_')
53         self.slicename = '.'.join(slicename)
54         self.sfauser = os.environ.get('SFA_USER')
55         self.sfaPrivateKey = os.environ.get('SFA_PK')
56         
57     @skipIfNotSfi
58     def test_a_sfaapi(self):
59         """
60         Check that the api to discover and reserve resources is well
61         instanciated, and is an instance of SFAAPI. Check that using
62         the same credentials, the same object of the api is used.
63         """
64         node1 = self.ec.register_resource("WilabtSfaNode")
65         self.ec.set(node1, "hostname", "zotacB5")
66         self.ec.set(node1, "slicename", self.slicename)
67         self.ec.set(node1, "sfauser", self.sfauser)
68         self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
69         self.ec.set(node1, "gatewayUser", "nepi")
70         self.ec.set(node1, "gateway", "bastion.test.iminds.be")
71         self.ec.set(node1, "cleanHome", True)
72         self.ec.set(node1, "cleanProcesses", True)
73
74         wnode_rm1 = self.ec.get_resource(node1)
75
76         self.assertIsNone(wnode_rm1._node_to_provision)
77
78         api1 = wnode_rm1.sfaapi
79         self.assertIsInstance(api1, SFAAPI)
80         self.assertEquals(len(api1._reserved), 0)
81         self.assertEquals(len(api1._blacklist), 0)
82
83         node2 = self.ec.register_resource("WilabtSfaNode")
84         self.ec.set(node2, "hostname", "zotacM20")
85         self.ec.set(node2, "slicename", self.slicename)
86         self.ec.set(node2, "sfauser", self.sfauser)
87         self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
88         self.ec.set(node1, "gatewayUser", "nepi")
89         self.ec.set(node1, "gateway", "bastion.test.iminds.be")
90         self.ec.set(node1, "cleanHome", True)
91         self.ec.set(node1, "cleanProcesses", True)
92
93         wnode_rm2 = self.ec.get_resource(node2)
94         api2 = wnode_rm2.sfaapi
95         self.assertEquals(api1, api2)
96
97         wnode_rm1.sfaapi._reserved = set()
98         wnode_rm1.sfaapi._blacklist = set()
99     
100     @skipIfNotSfi
101     def test_discover(self):
102         """
103         Check that the method do_discover reserve the right node.
104         """
105         node1 = self.ec.register_resource("WilabtSfaNode")
106         self.ec.set(node1, "hostname", "zotacB5")
107         self.ec.set(node1, "slicename", self.slicename)
108         self.ec.set(node1, "sfauser", self.sfauser)
109         self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
110         self.ec.set(node1, "gatewayUser", "nepi")
111         self.ec.set(node1, "gateway", "bastion.test.iminds.be")
112         self.ec.set(node1, "cleanHome", True)
113         self.ec.set(node1, "cleanProcesses", True)
114
115         wnode_rm = self.ec.get_resource(node1)
116        
117         hostname = wnode_rm.get("hostname")
118         self.assertIsNotNone(hostname)
119
120         self.assertEquals(wnode_rm.sfaapi._reserved, set())
121
122         wnode_rm.do_discover()
123         self.assertEquals(len(wnode_rm.sfaapi._reserved), 1)
124         self.assertEquals(wnode_rm._node_to_provision, 'wilab2.ilabt.iminds.be.zotacB5')
125
126         wnode_rm.sfaapi._reserved = set()
127         wnode_rm.sfaapi._blacklist = set()
128
129     @skipIfNotSfi
130     def test_provision(self):
131         """
132         This test checks that the method do_provision add the node in the slice and check
133         its well functioning.
134         """
135         node = self.ec.register_resource("WilabtSfaNode")
136         self.ec.set(node, "hostname", "zotacB5")
137         self.ec.set(node, "slicename", self.slicename)
138         self.ec.set(node, "sfauser", self.sfauser)
139         self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
140         self.ec.set(node, "gatewayUser", "nepi")
141         self.ec.set(node, "gateway", "bastion.test.iminds.be")
142         self.ec.set(node, "cleanHome", True)
143         self.ec.set(node, "cleanProcesses", True)
144
145         wnode_rm = self.ec.get_resource(node)
146
147         self.assertEquals(wnode_rm.sfaapi._reserved, set())
148         self.assertIsNone(wnode_rm._node_to_provision)
149
150         wnode_rm.do_discover()
151         with self.assertRaises(RuntimeError):
152             wnode_rm.do_provision()
153
154         if not self.ec.abort and self.ec.state(node) > 2:
155             cmd = 'echo "IT WORKED"'
156             ((out, err), proc) = wnode_rm.execute(cmd)
157             self.assertEquals(out.strip(), "IT WORKED")
158
159         wnode_rm.sfaapi._reserved = set()
160         wnode_rm.sfaapi._blacklist = set()
161
162         self.ec.shutdown()
163
164     @skipIfNotSfi
165     def test_xdeploy1(self):
166         """
167         Test deploy 1 node.
168         """
169         node = self.ec.register_resource("WilabtSfaNode")
170         self.ec.set(node, "hostname", "zotacM20")
171         self.ec.set(node, "slicename", self.slicename)
172         self.ec.set(node, "sfauser", self.sfauser)
173         self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
174         self.ec.set(node, "gatewayUser", "nepi")
175         self.ec.set(node, "gateway", "bastion.test.iminds.be")
176         self.ec.set(node, "cleanHome", True)
177         self.ec.set(node, "cleanProcesses", True)
178
179         self.ec.deploy()
180         self.ec.wait_deployed(node)
181         state = self.ec.state(node)
182         if not self.ec.abort:
183             self.assertIn(state, (3, 4))
184
185         wnode_rm = self.ec.get_resource(node)
186         wnode_rm.sfaapi._reserved = set()
187         wnode_rm.sfaapi._blacklist = set()
188
189         self.ec.shutdown()
190
191     @skipIfNotSfi
192     def test_xdeploy2(self):
193         """
194         Test deploy 2 nodes.
195         """
196         node1 = self.ec.register_resource("WilabtSfaNode")
197         self.ec.set(node1, "hostname", "zotacB5")
198         self.ec.set(node1, "slicename", self.slicename)
199         self.ec.set(node1, "sfauser", self.sfauser)
200         self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
201         self.ec.set(node1, "gatewayUser", "nepi")
202         self.ec.set(node1, "gateway", "bastion.test.iminds.be")
203         self.ec.set(node1, "cleanHome", True)
204         self.ec.set(node1, "cleanProcesses", True)
205
206         node2 = self.ec.register_resource("WilabtSfaNode")
207         self.ec.set(node2, "hostname", "zotacM20")
208         self.ec.set(node2, "slicename", self.slicename)
209         self.ec.set(node2, "sfauser", self.sfauser)
210         self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
211         self.ec.set(node2, "gatewayUser", "nepi")
212         self.ec.set(node2, "gateway", "bastion.test.iminds.be")
213         self.ec.set(node2, "cleanHome", True)
214         self.ec.set(node2, "cleanProcesses", True)
215
216         self.ec.deploy()
217         self.ec.wait_deployed([node1, node2])
218         state1 = self.ec.state(node1)
219         state2 = self.ec.state(node2)
220         if not self.ec.abort:
221             self.assertIn(state1, (3, 4))
222             self.assertIn(state2, (3, 4))
223
224         wnode_rm = self.ec.get_resource(node1)
225         wnode_rm.sfaapi._reserved = set()
226         wnode_rm.sfaapi._blacklist = set()
227
228         self.ec.shutdown()
229
230     @skipIfNotSfi
231     def test_xdeploy3(self):
232         """
233         Test deploy 2 nodes, already in the slice.
234         """
235         node1 = self.ec.register_resource("WilabtSfaNode")
236         self.ec.set(node1, "hostname", "zotacM20")
237         self.ec.set(node1, "slicename", self.slicename)
238         self.ec.set(node1, "sfauser", self.sfauser)
239         self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
240         self.ec.set(node1, "gatewayUser", "nepi")
241         self.ec.set(node1, "gateway", "bastion.test.iminds.be")
242         self.ec.set(node1, "cleanHome", True)
243         self.ec.set(node1, "cleanProcesses", True)
244
245         node2 = self.ec.register_resource("WilabtSfaNode")
246         self.ec.set(node2, "hostname", "zotacB5")
247         self.ec.set(node2, "slicename", self.slicename)
248         self.ec.set(node2, "sfauser", self.sfauser)
249         self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
250         self.ec.set(node2, "gatewayUser", "nepi")
251         self.ec.set(node2, "gateway", "bastion.test.iminds.be")
252         self.ec.set(node2, "cleanHome", True)
253         self.ec.set(node2, "cleanProcesses", True)
254
255         self.ec.deploy()
256         self.ec.wait_deployed([node1, node2])
257         state1 = self.ec.state(node1)
258         state2 = self.ec.state(node2)
259         if not self.ec.abort:
260             self.assertEquals(state1, (3, 4))
261             self.assertEquals(state2, (3, 4))
262
263         self.ec.shutdown() 
264
265     def tearDown(self):
266         pass
267         #self.ec.shutdown()
268
269
270 if __name__ == '__main__':
271     unittest.main()
272
273
274