3 # NEPI, a framework to manage network experiments
4 # Copyright (C) 2013 INRIA
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 2 as
8 # published by the Free Software Foundation;
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 # Author: Lucia Guevgeozian <lucia.guevgeozian_odizzio@inria.fr>
20 from nepi.execution.ec import ExperimentController
21 from nepi.resources.omf.wilabt_node import WilabtSfaNode
22 from nepi.util.sfaapi import SFAAPI, SFAAPIFactory
24 from test_utils import skipIfNotSfi
29 import multiprocessing
31 class DummyEC(ExperimentController):
34 class WilabtSfaNodeFactoryTestCase(unittest.TestCase):
36 def test_creation_phase(self):
37 self.assertEqual(WilabtSfaNode._rtype, "WilabtSfaNode")
38 self.assertEqual(len(WilabtSfaNode._attributes), 17)
40 class WilabtSfaNodeTestCase(unittest.TestCase):
42 This tests use inria_nepi slice, from the test instance of MyPLC
43 nepiplc.pl.sophia.inria.fr. This test can fail if the user running
44 the test does not have a user in this instance of MyPLC or is not
45 added to the inria_nepi slice.
50 #slicepl = os.environ.get('SFA_SLICE')
51 #slicename = ['ple'] + slicepl.split('_')
52 #self.slicename = '.'.join(slicename)
53 self.slicename = os.environ.get('SFA_SLICE')
54 self.sfauser = os.environ.get('SFA_USER')
55 self.sfaPrivateKey = os.environ.get('SFA_PK')
58 def test_a_sfaapi(self):
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.
64 node1 = self.ec.register_resource("WilabtSfaNode")
65 self.ec.set(node1, "host", "zotacE5")
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")
72 wnode_rm1 = self.ec.get_resource(node1)
74 self.assertIsNone(wnode_rm1._node_to_provision)
76 api1 = wnode_rm1.sfaapi
77 self.assertIsInstance(api1, SFAAPI)
78 self.assertEqual(len(api1._reserved), 0)
79 self.assertEqual(len(api1._blacklist), 0)
81 node2 = self.ec.register_resource("WilabtSfaNode")
82 self.ec.set(node2, "host", "zotacM20")
83 self.ec.set(node2, "slicename", self.slicename)
84 self.ec.set(node2, "sfauser", self.sfauser)
85 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
86 self.ec.set(node1, "gatewayUser", "nepi")
87 self.ec.set(node1, "gateway", "bastion.test.iminds.be")
89 wnode_rm2 = self.ec.get_resource(node2)
90 api2 = wnode_rm2.sfaapi
91 self.assertEqual(api1, api2)
93 wnode_rm1.sfaapi._reserved = set()
94 wnode_rm1.sfaapi._blacklist = set()
97 def test_discover(self):
99 Check that the method do_discover reserve the right node.
101 node1 = self.ec.register_resource("WilabtSfaNode")
102 self.ec.set(node1, "host", "zotacE5")
103 self.ec.set(node1, "slicename", self.slicename)
104 self.ec.set(node1, "sfauser", self.sfauser)
105 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
106 self.ec.set(node1, "gatewayUser", "nepi")
107 self.ec.set(node1, "gateway", "bastion.test.iminds.be")
109 wnode_rm = self.ec.get_resource(node1)
111 host = wnode_rm.get("host")
112 self.assertIsNotNone(host)
114 self.assertEqual(wnode_rm.sfaapi._reserved, set())
116 wnode_rm.do_discover()
117 self.assertEqual(len(wnode_rm.sfaapi._reserved), 1)
118 self.assertEqual(wnode_rm._node_to_provision, 'wilab2.ilabt.iminds.be.zotacE5')
120 wnode_rm.sfaapi._reserved = set()
121 wnode_rm.sfaapi._blacklist = set()
124 def test_provision(self):
126 This test checks that the method do_provision add the node in the slice and check
127 its well functioning.
129 node = self.ec.register_resource("WilabtSfaNode")
130 self.ec.set(node, "host", "zotacE5")
131 self.ec.set(node, "slicename", self.slicename)
132 self.ec.set(node, "sfauser", self.sfauser)
133 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
134 self.ec.set(node, "gatewayUser", "nepi")
135 self.ec.set(node, "gateway", "bastion.test.iminds.be")
137 wnode_rm = self.ec.get_resource(node)
139 self.assertEqual(wnode_rm.sfaapi._reserved, set())
140 self.assertIsNone(wnode_rm._node_to_provision)
142 wnode_rm.do_discover()
143 #with self.assertRaises(RuntimeError):
144 # wnode_rm.do_provision()
145 wnode_rm.do_provision()
147 if not self.ec.abort and self.ec.state(node) > 2:
148 cmd = 'echo "IT WORKED"'
149 ((out, err), proc) = wnode_rm.execute(cmd)
150 self.assertEqual(out.strip(), "IT WORKED")
152 #wnode_rm.sfaapi._reserved = set()
153 #wnode_rm.sfaapi._blacklist = set()
158 def test_xdeploy1(self):
162 node = self.ec.register_resource("WilabtSfaNode")
163 self.ec.set(node, "host", "zotacM20")
164 self.ec.set(node, "slicename", self.slicename)
165 self.ec.set(node, "sfauser", self.sfauser)
166 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
167 self.ec.set(node, "gatewayUser", "nepi")
168 self.ec.set(node, "gateway", "bastion.test.iminds.be")
171 self.ec.wait_deployed(node)
172 state = self.ec.state(node)
173 if not self.ec.abort:
174 self.assertIn(state, (3, 4))
176 wnode_rm = self.ec.get_resource(node)
177 wnode_rm.sfaapi._reserved = set()
178 wnode_rm.sfaapi._blacklist = set()
183 def test_xdeploy2(self):
187 node1 = self.ec.register_resource("WilabtSfaNode")
188 self.ec.set(node1, "host", "zotacE3")
189 self.ec.set(node1, "slicename", self.slicename)
190 self.ec.set(node1, "sfauser", self.sfauser)
191 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
192 self.ec.set(node1, "gatewayUser", "nepi")
193 self.ec.set(node1, "gateway", "bastion.test.iminds.be")
195 node2 = self.ec.register_resource("WilabtSfaNode")
196 self.ec.set(node2, "host", "zotacM20")
197 self.ec.set(node2, "slicename", self.slicename)
198 self.ec.set(node2, "sfauser", self.sfauser)
199 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
200 self.ec.set(node2, "gatewayUser", "nepi")
201 self.ec.set(node2, "gateway", "bastion.test.iminds.be")
204 self.ec.wait_deployed([node1, node2])
205 state1 = self.ec.state(node1)
206 state2 = self.ec.state(node2)
207 if not self.ec.abort:
208 self.assertIn(state1, (3, 4))
209 self.assertIn(state2, (3, 4))
211 wnode_rm = self.ec.get_resource(node1)
212 wnode_rm.sfaapi._reserved = set()
213 wnode_rm.sfaapi._blacklist = set()
218 def test_xdeploy3(self):
220 Test deploy 2 nodes, already in the slice.
222 node1 = self.ec.register_resource("WilabtSfaNode")
223 self.ec.set(node1, "host", "zotacM20")
224 self.ec.set(node1, "slicename", self.slicename)
225 self.ec.set(node1, "sfauser", self.sfauser)
226 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
227 self.ec.set(node1, "gatewayUser", "nepi")
228 self.ec.set(node1, "gateway", "bastion.test.iminds.be")
230 node2 = self.ec.register_resource("WilabtSfaNode")
231 self.ec.set(node2, "host", "zotacE3")
232 self.ec.set(node2, "slicename", self.slicename)
233 self.ec.set(node2, "sfauser", self.sfauser)
234 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
235 self.ec.set(node2, "gatewayUser", "nepi")
236 self.ec.set(node2, "gateway", "bastion.test.iminds.be")
239 self.ec.wait_deployed([node1, node2])
240 state1 = self.ec.state(node1)
241 state2 = self.ec.state(node2)
242 if not self.ec.abort:
243 self.assertEqual(state1, (3, 4))
244 self.assertEqual(state2, (3, 4))
253 if __name__ == '__main__':