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