b6b65efd64069e5ebe276e217d8fd1ff9ac45b91
[nepi.git] / src / nepi / resources / omf / node.py
1 #
2 #    NEPI, a framework to manage network experiments
3 #    Copyright (C) 2013 INRIA
4 #
5 #    This program is free software: you can redistribute it and/or modify
6 #    it under the terms of the GNU General Public License as published by
7 #    the Free Software Foundation, either version 3 of the License, or
8 #    (at your option) any later version.
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: Alina Quereilhac <alina.quereilhac@inria.fr>
19 #         Julien Tribino <julien.tribino@inria.fr>
20
21
22 from nepi.execution.resource import ResourceManager, clsinit, ResourceState, \
23         reschedule_delay
24 from nepi.execution.attribute import Attribute, Flags 
25 from nepi.resources.omf.omf_resource import ResourceGateway, OMFResource
26 from nepi.resources.omf.omf_api import OMFAPIFactory
27
28 import time
29
30
31 @clsinit
32 class OMFNode(OMFResource):
33     """
34     .. class:: Class Args :
35       
36         :param ec: The Experiment controller
37         :type ec: ExperimentController
38         :param guid: guid of the RM
39         :type guid: int
40         :param creds: Credentials to communicate with the rm (XmppClient for OMF)
41         :type creds: dict
42
43     .. note::
44
45        This class is used only by the Experiment Controller through the Resource Factory
46
47     """
48     _rtype = "OMFNode"
49     _authorized_connections = ["OMFApplication" , "OMFWifiInterface"]
50
51     @classmethod
52     def _register_attributes(cls):
53         """Register the attributes of an OMF Node
54
55         """
56         hostname = Attribute("hostname", "Hostname of the machine")
57
58         cls._register_attribute(hostname)
59
60     # XXX: We don't necessary need to have the credentials at the 
61     # moment we create the RM
62     def __init__(self, ec, guid):
63         """
64         :param ec: The Experiment controller
65         :type ec: ExperimentController
66         :param guid: guid of the RM
67         :type guid: int
68
69         """
70         super(OMFNode, self).__init__(ec, guid)
71
72         self._omf_api = None 
73
74     def valid_connection(self, guid):
75         """ Check if the connection with the guid in parameter is possible. 
76         Only meaningful connections are allowed.
77
78         :param guid: Guid of the current RM
79         :type guid: int
80         :rtype:  Boolean
81
82         """
83         rm = self.ec.get_resource(guid)
84         if rm.rtype() in self._authorized_connections:
85             msg = "Connection between %s %s and %s %s accepted" % (
86                     self.rtype(), self._guid, rm.rtype(), guid)
87             self.debug(msg)
88
89             return True
90
91         msg = "Connection between %s %s and %s %s refused" % (
92                 self.rtype(), self._guid, rm.rtype(), guid)
93         self.debug(msg)
94
95         return False
96
97     def deploy(self):
98         """ Deploy the RM. It means : Send Xmpp Message Using OMF protocol 
99             to enroll the node into the experiment.
100             It becomes DEPLOYED after sending messages to enroll the node
101
102         """ 
103         if not self._omf_api :
104             self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'), 
105                 self.get('xmppHost'), self.get('xmppPort'), 
106                 self.get('xmppPassword'), exp_id = self.ec.exp_id)
107
108         if not self._omf_api :
109             msg = "Credentials are not initialzed. XMPP Connections impossible"
110             self.error(msg)
111             self.fail()
112             return
113
114         if not self.get('hostname') :
115             msg = "Hostname's value is not initialized"
116             self.error(msg)
117             self.fail()
118             return False
119
120         try:
121             self._omf_api.enroll_host(self.get('hostname'))
122         except AttributeError:
123             msg = "Credentials are not initialzed. XMPP Connections impossible"
124             self.error(msg)
125             self.fail()
126             #raise AttributeError, msg
127
128         super(OMFNode, self).deploy()
129
130     def discover(self):
131         """ Discover the availables nodes
132
133         """
134         pass
135      
136     def provision(self):
137         """ Provision some availables nodes
138
139         """
140         pass
141
142     def start(self):
143         """Start the RM. It means nothing special for an interface for now
144            It becomes STARTED as soon as this method starts.
145
146         """
147
148         super(OMFNode, self).start()
149
150     def stop(self):
151         """Stop the RM. It means nothing special for an interface for now
152            It becomes STOPPED as soon as this method stops
153
154         """
155         super(OMFNode, self).stop()
156
157     def release(self):
158         """Clean the RM at the end of the experiment
159
160         """
161         if self._omf_api :
162             self._omf_api.release(self.get('hostname'))
163
164             OMFAPIFactory.release_api(self.get('xmppSlice'), 
165                 self.get('xmppHost'), self.get('xmppPort'), 
166                 self.get('xmppPassword'), exp_id = self.ec.exp_id)
167
168         super(OMFNode, self).release()
169