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
22 from nepi.resources.planetlab.sfa_node import PlanetlabSfaNode
23 from nepi.util.sfaapi import SFAAPI, SFAAPIFactory
25 from test_utils import skipIfNotSfaCredentials
30 import multiprocessing
33 class DummyEC(ExperimentController):
36 class PLSfaNodeFactoryTestCase(unittest.TestCase):
38 def test_creation_phase(self):
39 self.assertEqual(PlanetlabSfaNode._rtype, "planetlab::sfa::Node")
40 self.assertEqual(len(PlanetlabSfaNode._attributes), 31)
42 class PLSfaNodeTestCase(unittest.TestCase):
44 This tests use inria_nepi slice, from the test instance of MyPLC
45 nepiplc.pl.sophia.inria.fr. This test can fail if the user running
46 the test does not have a user in this instance of MyPLC or is not
47 added to the inria_nepi slice.
52 self.username = 'inria_lguevgeo'
53 self.sfauser = os.environ.get('SFA_USER')
54 self.sfaPrivateKey = os.environ.get('SFA_PK')
56 @skipIfNotSfaCredentials
57 def test_a_sfaapi(self):
59 Check that the api to discover and reserve resources is well
60 instanciated, and is an instance of SFAAPI. Check that using
61 the same credentials, the same object of the api is used.
63 node1 = self.ec.register_resource("planetlab::sfa::Node")
64 self.ec.set(node1, "hostname", "planetlab2.ionio.gr")
65 self.ec.set(node1, "username", self.username)
66 self.ec.set(node1, "sfauser", self.sfauser)
67 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
69 plnode_rm1 = self.ec.get_resource(node1)
71 self.assertIsNone(plnode_rm1._node_to_provision)
73 api1 = plnode_rm1.sfaapi
74 self.assertIsInstance(api1, SFAAPI)
75 self.assertEqual(len(api1._reserved), 0)
76 self.assertEqual(len(api1._blacklist), 0)
78 node2 = self.ec.register_resource("planetlab::sfa::Node")
79 self.ec.set(node2, "hostname", "planetlab2.ionio.gr")
80 self.ec.set(node2, "username", self.username)
81 self.ec.set(node2, "sfauser", self.sfauser)
82 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
84 plnode_rm2 = self.ec.get_resource(node2)
85 api2 = plnode_rm2.sfaapi
86 self.assertEqual(api1, api2)
88 @skipIfNotSfaCredentials
89 def test_discover(self):
91 Check that the method do_discover reserve the right node.
93 node = self.ec.register_resource("planetlab::sfa::Node")
94 self.ec.set(node, "hostname", "roti.mimuw.edu.pl")
95 self.ec.set(node, "username", self.username)
96 self.ec.set(node, "sfauser", self.sfauser)
97 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
99 plnode_rm = self.ec.get_resource(node)
101 hostname = plnode_rm.get("hostname")
102 self.assertIsNotNone(hostname)
104 self.assertEqual(len(plnode_rm.sfaapi._reserved), 0)
106 plnode_rm.do_discover()
108 self.assertEqual(len(plnode_rm.sfaapi._reserved), 1)
109 self.assertEqual(plnode_rm._node_to_provision, 'ple.mimuw.roti.mimuw.edu.pl')
110 plnode_rm.sfaapi._reserved = set()
111 plnode_rm.sfaapi._blacklist = set()
113 @skipIfNotSfaCredentials
114 def test_provision(self):
116 This test checks that the method do_provision add the node in the slice and check
117 its well functioning.
119 node = self.ec.register_resource("planetlab::sfa::Node")
120 self.ec.set(node, "hostname", "planetlab2.ionio.gr")
121 self.ec.set(node, "username", self.username)
122 self.ec.set(node, "sfauser", self.sfauser)
123 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
125 plnode_rm = self.ec.get_resource(node)
127 self.assertEqual(plnode_rm.sfaapi._reserved, set())
128 self.assertIsNone(plnode_rm._node_to_provision)
130 plnode_rm.do_discover()
131 plnode_rm.do_provision()
133 cmd = 'echo "IT WORKED"'
134 ((out, err), proc) = plnode_rm.execute(cmd)
135 self.assertEqual(out.strip(), "IT WORKED")
137 plnode_rm.sfaapi._reserved = set()
138 plnode_rm.sfaapi._blacklist = set()
140 @skipIfNotSfaCredentials
141 def test_xdeploy1(self):
145 node = self.ec.register_resource("planetlab::sfa::Node")
146 self.ec.set(node, "hostname", "planetlab2.ionio.gr")
147 self.ec.set(node, "username", self.username)
148 self.ec.set(node, "sfauser", self.sfauser)
149 self.ec.set(node, "sfaPrivateKey", self.sfaPrivateKey)
152 self.ec.wait_deployed(node)
153 state = self.ec.state(node)
154 if not self.ec.abort:
155 self.assertIn(state, (3, 4))
157 plnode_rm = self.ec.get_resource(1)
158 plnode_rm.sfaapi._reserved = set()
159 plnode_rm.sfaapi._blacklist = set()
161 @skipIfNotSfaCredentials
162 def test_xdeploy2(self):
164 Test deploy 2 nodes. Empty slice.
166 node1 = self.ec.register_resource("planetlab::sfa::Node")
167 self.ec.set(node1, "hostname", "planetlab3.xeno.cl.cam.ac.uk")
168 self.ec.set(node1, "username", self.username)
169 self.ec.set(node1, "sfauser", self.sfauser)
170 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
172 node2 = self.ec.register_resource("planetlab::sfa::Node")
173 self.ec.set(node2, "hostname", "planetlab1.cs.vu.nl")
174 self.ec.set(node2, "username", self.username)
175 self.ec.set(node2, "sfauser", self.sfauser)
176 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
178 node1rm = self.ec.get_resource(node1)
179 node1rm._delete_from_slice()
182 self.ec.wait_deployed([node1, node2])
183 state1 = self.ec.state(node1)
184 state2 = self.ec.state(node2)
185 if not self.ec.abort:
186 self.assertIn(state1, (3, 4))
187 self.assertIn(state2, (3, 4))
189 plnode_rm = self.ec.get_resource(1)
190 plnode_rm.sfaapi._reserved = set()
191 plnode_rm.sfaapi._blacklist = set()
193 @skipIfNotSfaCredentials
194 def test_xdeploy3(self):
196 Test deploy 2 nodes, already in the slice.
198 node1 = self.ec.register_resource("planetlab::sfa::Node")
199 self.ec.set(node1, "hostname", "planetlab3.xeno.cl.cam.ac.uk")
200 self.ec.set(node1, "username", self.username)
201 self.ec.set(node1, "sfauser", self.sfauser)
202 self.ec.set(node1, "sfaPrivateKey", self.sfaPrivateKey)
204 node2 = self.ec.register_resource("planetlab::sfa::Node")
205 self.ec.set(node2, "hostname", "planetlab1.cs.vu.nl")
206 self.ec.set(node2, "username", self.username)
207 self.ec.set(node2, "sfauser", self.sfauser)
208 self.ec.set(node2, "sfaPrivateKey", self.sfaPrivateKey)
211 self.ec.wait_deployed([node1, node2])
212 state1 = self.ec.state(node1)
213 state2 = self.ec.state(node2)
214 if not self.ec.abort:
215 self.assertIn(state1, (3, 4))
216 self.assertIn(state2, (3, 4))
223 if __name__ == '__main__':