2 NEPI, a framework to manage network experiments
3 Copyright (C) 2013 INRIA
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.
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/>.
20 from nepi.execution.resource import ResourceManager, clsinit
21 from nepi.execution.attribute import Attribute, Flags
22 from nepi.resources.omf.omf_api import OMFAPIFactory
28 class OMFApplication(ResourceManager):
30 .. class:: Class Args :
32 :param ec: The Experiment controller
33 :type ec: ExperimentController
34 :param guid: guid of the RM
36 :param creds: Credentials to communicate with the rm (XmppClient)
41 This class is used only by the Experiment Controller through the Resource Factory
44 _rtype = "OMFApplication"
45 _authorized_connections = ["OMFNode"]
46 _waiters = ["OMFNode", "OMFChannel", "OMFWifiInterface"]
49 def _register_attributes(cls):
50 """Register the attributes of an OMF application
53 appid = Attribute("appid", "Name of the application")
54 path = Attribute("path", "Path of the application")
55 args = Attribute("args", "Argument of the application")
56 env = Attribute("env", "Environnement variable of the application")
57 xmppSlice = Attribute("xmppSlice","Name of the slice", flags = Flags.Credential)
58 xmppHost = Attribute("xmppHost", "Xmpp Server",flags = Flags.Credential)
59 xmppPort = Attribute("xmppPort", "Xmpp Port",flags = Flags.Credential)
60 xmppPassword = Attribute("xmppPassword", "Xmpp Port",flags = Flags.Credential)
61 cls._register_attribute(appid)
62 cls._register_attribute(path)
63 cls._register_attribute(args)
64 cls._register_attribute(env)
65 cls._register_attribute(xmppSlice)
66 cls._register_attribute(xmppHost)
67 cls._register_attribute(xmppPort)
68 cls._register_attribute(xmppPassword)
71 def __init__(self, ec, guid):
73 :param ec: The Experiment controller
74 :type ec: ExperimentController
75 :param guid: guid of the RM
77 :param creds: Credentials to communicate with the rm (XmppClient for OMF)
82 super(OMFApplication, self).__init__(ec, guid)
93 self._logger = logging.getLogger("nepi.omf.omfApp ")
94 self._logger.setLevel(nepi.LOGLEVEL)
97 def _validate_connection(self, guid):
98 """Check if the connection is available.
100 :param guid: Guid of the current RM
105 rm = self.ec.get_resource(guid)
106 if rm.rtype() not in self._authorized_connections:
107 self._logger.debug("Connection between %s %s and %s %s refused : An Application can be connected only to a Node" % (self.rtype(), self._guid, rm.rtype(), guid))
109 elif len(self.connections) != 0 :
110 self._logger.debug("Connection between %s %s and %s %s refused : Already Connected" % (self.rtype(), self._guid, rm.rtype(), guid))
113 self._logger.debug("Connection between %s %s and %s %s accepted" % (self.rtype(), self._guid, rm.rtype(), guid))
116 def _get_nodes(self, conn_set):
117 """Get the RM of the node to which the application is connected
119 :param conn_set: Connections of the current Guid
121 :rtype: ResourceManager
125 rm = self.ec.get_resource(elt)
126 if rm.rtype() == "OMFNode":
130 def deploy_action(self):
134 self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'),
135 self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword'))
136 super(OMFApplication, self).deploy_action()
139 """Send Xmpp Message Using OMF protocol to execute the application
142 super(OMFApplication, self).start()
143 self._logger.debug(" " + self.rtype() + " ( Guid : " + str(self._guid) +") : " + self.get('appid') + " : " + self.get('path') + " : " + self.get('args') + " : " + self.get('env'))
145 if self.get('appid') and self.get('path') and self.get('args') and self.get('env'):
146 rm_node = self._get_nodes(self._connections)
147 self._omf_api.execute(rm_node.get('hostname'),self.get('appid'), self.get('args'), self.get('path'), self.get('env'))
150 """Send Xmpp Message Using OMF protocol to kill the application
154 rm_node = self._get_nodes(self._connections)
155 self._omf_api.exit(rm_node.get('hostname'),self.get('appid'))
156 super(OMFApplication, self).stop()
159 """Clean the RM at the end of the experiment
162 OMFAPIFactory.release_api(self.get('xmppSlice'),
163 self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword'))