update omf part with last changes for the demo
[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_copy, 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_copy
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     @property
75     def exp_id(self):
76         return self.ec.exp_id
77
78     def valid_connection(self, guid):
79         """ Check if the connection with the guid in parameter is possible. 
80         Only meaningful connections are allowed.
81
82         :param guid: Guid of the current RM
83         :type guid: int
84         :rtype:  Boolean
85
86         """
87         rm = self.ec.get_resource(guid)
88         if rm.rtype() in self._authorized_connections:
89             msg = "Connection between %s %s and %s %s accepted" % (
90                     self.rtype(), self._guid, rm.rtype(), guid)
91             self.debug(msg)
92
93             return True
94
95         msg = "Connection between %s %s and %s %s refused" % (
96                 self.rtype(), self._guid, rm.rtype(), guid)
97         self.debug(msg)
98
99         return False
100
101     def deploy(self):
102         """ Deploy the RM. It means : Send Xmpp Message Using OMF protocol 
103             to enroll the node into the experiment.
104             It becomes DEPLOYED after sending messages to enroll the node
105
106         """ 
107         if not self._omf_api :
108             self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'), 
109                 self.get('xmppHost'), self.get('xmppPort'), 
110                 self.get('xmppPassword'), exp_id = self.exp_id)
111
112         if not self._omf_api :
113             msg = "Credentials are not initialzed. XMPP Connections impossible"
114             self.error(msg)
115             self.fail()
116             return
117
118         if not self.get('hostname') :
119             msg = "Hostname's value is not initialized"
120             self.error(msg)
121             self.fail()
122             return False
123
124         try:
125             self._omf_api.enroll_host(self.get('hostname'))
126         except AttributeError:
127             msg = "Credentials are not initialzed. XMPP Connections impossible"
128             self.error(msg)
129             self.fail()
130             #raise AttributeError, msg
131
132         super(OMFNode, self).deploy()
133
134     def discover(self):
135         """ Discover the availables nodes
136
137         """
138         pass
139      
140     def provision(self):
141         """ Provision some availables nodes
142
143         """
144         pass
145
146     def start(self):
147         """Start the RM. It means nothing special for an interface for now
148            It becomes STARTED as soon as this method starts.
149
150         """
151
152         super(OMFNode, self).start()
153
154     def stop(self):
155         """Stop the RM. It means nothing special for an interface for now
156            It becomes STOPPED as soon as this method stops
157
158         """
159         super(OMFNode, self).stop()
160         self.set_finished()
161
162     def release(self):
163         """Clean the RM at the end of the experiment
164
165         """
166         if self._omf_api :
167             self._omf_api.release(self.get('hostname'))
168
169             OMFAPIFactory.release_api(self.get('xmppSlice'), 
170                 self.get('xmppHost'), self.get('xmppPort'), 
171                 self.get('xmppPassword'), exp_id = self.exp_id)
172
173         super(OMFNode, self).release()
174