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 as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
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.
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/>.
19 # Author: Lucia Guevgeozian <lucia.guevgeozian_odizzio@inria.fr>
21 from nepi.execution.ec import ExperimentController
22 from nepi.resources.omf.wilabt_node import WilabtSfaNode
23 from nepi.util.sfaapi import SFAAPI, SFAAPIFactory
25 from test_utils import skipIfNotSfi
30 import multiprocessing
32 class DummyEC(ExperimentController):
35 class WilabtSfaNodeFactoryTestCase(unittest.TestCase):
37 def test_creation_phase(self):
38 self.assertEquals(WilabtSfaNode._rtype, "WilabtSfaNode")
39 self.assertEquals(len(WilabtSfaNode._attributes), 17)
41 class WilabtSfaNodeTestCase(unittest.TestCase):
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.
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')
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, "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)
74 wnode_rm1 = self.ec.get_resource(node1)
76 self.assertIsNone(wnode_rm1._node_to_provision)
78 api1 = wnode_rm1.sfaapi
79 self.assertIsInstance(api1, SFAAPI)
80 self.assertEquals(len(api1._reserved), 0)
81 self.assertEquals(len(api1._blacklist), 0)
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)
93 wnode_rm2 = self.ec.get_resource(node2)
94 api2 = wnode_rm2.sfaapi
95 self.assertEquals(api1, api2)
97 wnode_rm1.sfaapi._reserved = set()
98 wnode_rm1.sfaapi._blacklist = set()
101 def test_discover(self):
103 Check that the method do_discover reserve the right node.
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)
115 wnode_rm = self.ec.get_resource(node1)
117 hostname = wnode_rm.get("hostname")
118 self.assertIsNotNone(hostname)
120 self.assertEquals(wnode_rm.sfaapi._reserved, set())
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')
126 wnode_rm.sfaapi._reserved = set()
127 wnode_rm.sfaapi._blacklist = set()
130 def test_provision(self):
132 This test checks that the method do_provision add the node in the slice and check
133 its well functioning.
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)
145 wnode_rm = self.ec.get_resource(node)
147 self.assertEquals(wnode_rm.sfaapi._reserved, set())
148 self.assertIsNone(wnode_rm._node_to_provision)
150 wnode_rm.do_discover()
151 with self.assertRaises(RuntimeError):
152 wnode_rm.do_provision()
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")
159 wnode_rm.sfaapi._reserved = set()
160 wnode_rm.sfaapi._blacklist = set()
165 def test_xdeploy1(self):
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)
180 self.ec.wait_deployed(node)
181 state = self.ec.state(node)
182 if not self.ec.abort:
183 self.assertIn(state, (3, 4))
185 wnode_rm = self.ec.get_resource(node)
186 wnode_rm.sfaapi._reserved = set()
187 wnode_rm.sfaapi._blacklist = set()
192 def test_xdeploy2(self):
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)
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)
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))
224 wnode_rm = self.ec.get_resource(node1)
225 wnode_rm.sfaapi._reserved = set()
226 wnode_rm.sfaapi._blacklist = set()
231 def test_xdeploy3(self):
233 Test deploy 2 nodes, already in the slice.
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)
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)
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))
270 if __name__ == '__main__':