e32d56191acb1c874956b873521f522b64a5f5a1
[nepi.git] / test / resources / planetlab / sfa_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 version 2 as
8 #    published by the Free Software Foundation;
9 #
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.
14 #
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/>.
17 #
18 # Author: Lucia Guevgeozian <lucia.guevgeozian_odizzio@inria.fr>
19
20 from nepi.execution.ec import ExperimentController
21
22 from nepi.resources.planetlab.sfa_node import PlanetlabSfaNode
23 from nepi.util.sfaapi import SFAAPI, SFAAPIFactory
24
25 from test_utils import skipIfNotSfaCredentials
26
27 import os
28 import time
29 import unittest
30 import multiprocessing
31
32
33 class DummyEC(ExperimentController):
34     pass
35
36 class PLSfaNodeFactoryTestCase(unittest.TestCase):
37
38     def test_creation_phase(self):
39         self.assertEquals(PlanetlabSfaNode._rtype, "planetlab::sfa::Node")
40         self.assertEquals(len(PlanetlabSfaNode._attributes), 31)
41
42 class PLSfaNodeTestCase(unittest.TestCase):
43     """
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.
48     """
49
50     def setUp(self):
51         self.ec = DummyEC()
52         self.username = 'inria_lguevgeo'
53         self.sfauser = os.environ.get('SFA_USER')
54         self.sfaPrivateKey = os.environ.get('SFA_PK')
55         
56     @skipIfNotSfaCredentials
57     def test_a_sfaapi(self):
58         """
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.
62         """
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)
68
69         plnode_rm1 = self.ec.get_resource(node1)
70
71         self.assertIsNone(plnode_rm1._node_to_provision)
72
73         api1 = plnode_rm1.sfaapi
74         self.assertIsInstance(api1, SFAAPI)
75         self.assertEquals(len(api1._reserved), 0)
76         self.assertEquals(len(api1._blacklist), 0)
77
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)
83
84         plnode_rm2 = self.ec.get_resource(node2)
85         api2 = plnode_rm2.sfaapi
86         self.assertEquals(api1, api2)
87     
88     @skipIfNotSfaCredentials
89     def test_discover(self):
90         """
91         Check that the method do_discover reserve the right node.
92         """
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)
98
99         plnode_rm = self.ec.get_resource(node)
100        
101         hostname = plnode_rm.get("hostname")
102         self.assertIsNotNone(hostname)
103
104         self.assertEquals(len(plnode_rm.sfaapi._reserved), 0)
105
106         plnode_rm.do_discover()
107
108         self.assertEquals(len(plnode_rm.sfaapi._reserved), 1)
109         self.assertEquals(plnode_rm._node_to_provision, 'ple.mimuw.roti.mimuw.edu.pl')
110         plnode_rm.sfaapi._reserved = set()
111         plnode_rm.sfaapi._blacklist = set()
112
113     @skipIfNotSfaCredentials
114     def test_provision(self):
115         """
116         This test checks that the method do_provision add the node in the slice and check
117         its well functioning.
118         """
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)
124
125         plnode_rm = self.ec.get_resource(node)
126
127         self.assertEquals(plnode_rm.sfaapi._reserved, set())
128         self.assertIsNone(plnode_rm._node_to_provision)
129
130         plnode_rm.do_discover()
131         plnode_rm.do_provision()    
132
133         cmd = 'echo "IT WORKED"'
134         ((out, err), proc) = plnode_rm.execute(cmd)
135         self.assertEquals(out.strip(), "IT WORKED")
136
137         plnode_rm.sfaapi._reserved = set()
138         plnode_rm.sfaapi._blacklist = set()
139
140     @skipIfNotSfaCredentials
141     def test_xdeploy1(self):
142         """
143         Test deploy 1 node.
144         """
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)
150
151         self.ec.deploy()
152         self.ec.wait_deployed(node)
153         state = self.ec.state(node)
154         if not self.ec.abort:
155             self.assertIn(state, (3, 4))
156
157         plnode_rm = self.ec.get_resource(1)
158         plnode_rm.sfaapi._reserved = set()
159         plnode_rm.sfaapi._blacklist = set()
160
161     @skipIfNotSfaCredentials
162     def test_xdeploy2(self):
163         """
164         Test deploy 2 nodes. Empty slice.
165         """
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)
171
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)
177
178         node1rm = self.ec.get_resource(node1)
179         node1rm._delete_from_slice()
180
181         self.ec.deploy()
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))
188
189         plnode_rm = self.ec.get_resource(1)
190         plnode_rm.sfaapi._reserved = set()
191         plnode_rm.sfaapi._blacklist = set()
192
193     @skipIfNotSfaCredentials
194     def test_xdeploy3(self):
195         """
196         Test deploy 2 nodes, already in the slice.
197         """
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)
203
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)
209
210         self.ec.deploy()
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))
217
218
219     def tearDown(self):
220         self.ec.shutdown()
221
222
223 if __name__ == '__main__':
224     unittest.main()
225
226
227