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
23 from nepi.resources.planetlab.sfa_node import PlanetlabSfaNode
24 from nepi.util.sfaapi import SFAAPI, SFAAPIFactory
26 from test_utils import skipIfNotSfaCredentials
31 import multiprocessing
34 class DummyEC(ExperimentController):
37 class PLSfaNodeFactoryTestCase(unittest.TestCase):
39 def test_creation_phase(self):
40 self.assertEquals(PlanetlabSfaNode._rtype, "PlanetlabSfaNode")
41 self.assertEquals(len(PlanetlabSfaNode._attributes), 31)
43 class PLSfaNodeTestCase(unittest.TestCase):
45 This tests use inria_nepi slice, from the test instance of MyPLC
46 nepiplc.pl.sophia.inria.fr. This test can fail if the user running
47 the test does not have a user in this instance of MyPLC or is not
48 added to the inria_nepi slice.
53 self.username = 'inria_lguevgeo'
54 self.sfauser = os.environ.get('SFA_USER')
55 self.sfaPrivateKey = os.environ.get('SFA_PK')
57 @skipIfNotSfaCredentials
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("PlanetlabSfaNode")
65 self.ec.set(node1, "hostname", "planetlab2.ionio.gr")
66 self.ec.set(node1, "username", self.username)
67 self.ec.set(node1, "sfauser", self.sfauser)
68 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
70 plnode_rm1 = self.ec.get_resource(node1)
72 self.assertIsNone(plnode_rm1._node_to_provision)
74 api1 = plnode_rm1.sfaapi
75 self.assertIsInstance(api1, SFAAPI)
76 self.assertEquals(len(api1._reserved), 0)
77 self.assertEquals(len(api1._blacklist), 0)
79 node2 = self.ec.register_resource("PlanetlabSfaNode")
80 self.ec.set(node2, "hostname", "planetlab2.ionio.gr")
81 self.ec.set(node2, "username", self.username)
82 self.ec.set(node2, "sfauser", self.sfauser)
83 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
85 plnode_rm2 = self.ec.get_resource(node2)
86 api2 = plnode_rm2.sfaapi
87 self.assertEquals(api1, api2)
89 @skipIfNotSfaCredentials
90 def test_discover(self):
92 Check that the method do_discover reserve the right node.
94 node = self.ec.register_resource("PlanetlabSfaNode")
95 self.ec.set(node, "hostname", "roti.mimuw.edu.pl")
96 self.ec.set(node, "username", self.username)
97 self.ec.set(node, "sfauser", self.sfauser)
98 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
100 plnode_rm = self.ec.get_resource(node)
102 hostname = plnode_rm.get("hostname")
103 self.assertIsNotNone(hostname)
105 self.assertEquals(len(plnode_rm.sfaapi._reserved), 0)
107 plnode_rm.do_discover()
109 self.assertEquals(len(plnode_rm.sfaapi._reserved), 1)
110 self.assertEquals(plnode_rm._node_to_provision, 'ple.mimuw.roti.mimuw.edu.pl')
111 plnode_rm.sfaapi._reserved = set()
112 plnode_rm.sfaapi._blacklist = set()
114 @skipIfNotSfaCredentials
115 def test_provision(self):
117 This test checks that the method do_provision add the node in the slice and check
118 its well functioning.
120 node = self.ec.register_resource("PlanetlabSfaNode")
121 self.ec.set(node, "hostname", "planetlab2.ionio.gr")
122 self.ec.set(node, "username", self.username)
123 self.ec.set(node, "sfauser", self.sfauser)
124 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
126 plnode_rm = self.ec.get_resource(node)
128 self.assertEquals(plnode_rm.sfaapi._reserved, set())
129 self.assertIsNone(plnode_rm._node_to_provision)
131 plnode_rm.do_discover()
132 plnode_rm.do_provision()
134 cmd = 'echo "IT WORKED"'
135 ((out, err), proc) = plnode_rm.execute(cmd)
136 self.assertEquals(out.strip(), "IT WORKED")
138 plnode_rm.sfaapi._reserved = set()
139 plnode_rm.sfaapi._blacklist = set()
141 @skipIfNotSfaCredentials
142 def test_xdeploy1(self):
146 node = self.ec.register_resource("PlanetlabSfaNode")
147 self.ec.set(node, "hostname", "planetlab2.ionio.gr")
148 self.ec.set(node, "username", self.username)
149 self.ec.set(node, "sfauser", self.sfauser)
150 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
153 self.ec.wait_deployed(node)
154 state = self.ec.state(node)
155 if not self.ec.abort:
156 self.assertIn(state, (3, 4))
158 plnode_rm = self.ec.get_resource(1)
159 plnode_rm.sfaapi._reserved = set()
160 plnode_rm.sfaapi._blacklist = set()
162 @skipIfNotSfaCredentials
163 def test_xdeploy2(self):
165 Test deploy 2 nodes. Empty slice.
167 node1 = self.ec.register_resource("PlanetlabSfaNode")
168 self.ec.set(node1, "hostname", "planetlab3.xeno.cl.cam.ac.uk")
169 self.ec.set(node1, "username", self.username)
170 self.ec.set(node1, "sfauser", self.sfauser)
171 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
173 node2 = self.ec.register_resource("PlanetlabSfaNode")
174 self.ec.set(node2, "hostname", "planetlab1.cs.vu.nl")
175 self.ec.set(node2, "username", self.username)
176 self.ec.set(node2, "sfauser", self.sfauser)
177 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
179 node1rm = self.ec.get_resource(node1)
180 node1rm._delete_from_slice()
183 self.ec.wait_deployed([node1, node2])
184 state1 = self.ec.state(node1)
185 state2 = self.ec.state(node2)
186 if not self.ec.abort:
187 self.assertIn(state1, (3, 4))
188 self.assertIn(state2, (3, 4))
190 plnode_rm = self.ec.get_resource(1)
191 plnode_rm.sfaapi._reserved = set()
192 plnode_rm.sfaapi._blacklist = set()
194 @skipIfNotSfaCredentials
195 def test_xdeploy3(self):
197 Test deploy 2 nodes, already in the slice.
199 node1 = self.ec.register_resource("PlanetlabSfaNode")
200 self.ec.set(node1, "hostname", "planetlab3.xeno.cl.cam.ac.uk")
201 self.ec.set(node1, "username", self.username)
202 self.ec.set(node1, "sfauser", self.sfauser)
203 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
205 node2 = self.ec.register_resource("PlanetlabSfaNode")
206 self.ec.set(node2, "hostname", "planetlab1.cs.vu.nl")
207 self.ec.set(node2, "username", self.username)
208 self.ec.set(node2, "sfauser", self.sfauser)
209 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
212 self.ec.wait_deployed([node1, node2])
213 state1 = self.ec.state(node1)
214 state2 = self.ec.state(node2)
215 if not self.ec.abort:
216 self.assertIn(state1, (3, 4))
217 self.assertIn(state2, (3, 4))
224 if __name__ == '__main__':