X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fapplication.py;h=0bc0c622ea90c39f6dba73442663eb5397dab6eb;hb=386498468dfb01f71b0efbbe0c208819f18f82ec;hp=ad52c89c87bac6463044d80e3e4974de715947f0;hpb=4896d77f40a611a22f9f1f8f2ae0e63e9008fee1;p=nepi.git diff --git a/src/nepi/resources/omf/application.py b/src/nepi/resources/omf/application.py index ad52c89c..0bc0c622 100644 --- a/src/nepi/resources/omf/application.py +++ b/src/nepi/resources/omf/application.py @@ -1,28 +1,29 @@ -""" - NEPI, a framework to manage network experiments - Copyright (C) 2013 INRIA - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -""" - -from nepi.execution.resource import ResourceManager, clsinit +# +# NEPI, a framework to manage network experiments +# Copyright (C) 2013 INRIA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Author: Alina Quereilhac +# Julien Tribino + +from nepi.execution.resource import ResourceManager, clsinit, ResourceState, \ + reschedule_delay from nepi.execution.attribute import Attribute, Flags +from nepi.resources.omf.node import OMFNode from nepi.resources.omf.omf_api import OMFAPIFactory -import nepi -import logging @clsinit class OMFApplication(ResourceManager): @@ -38,16 +39,17 @@ class OMFApplication(ResourceManager): .. note:: - This class is used only by the Experiment Controller through the Resource Factory + This class is used only by the Experiment Controller through the + Resource Factory """ _rtype = "OMFApplication" _authorized_connections = ["OMFNode"] - _waiters = ["OMFNode", "OMFChannel", "OMFWifiInterface"] @classmethod def _register_attributes(cls): - """Register the attributes of an OMF application + """ Register the attributes of an OMF application + """ appid = Attribute("appid", "Name of the application") @@ -78,7 +80,6 @@ class OMFApplication(ResourceManager): :type creds: dict """ - super(OMFApplication, self).__init__(ec, guid) self.set('appid', "") @@ -90,75 +91,122 @@ class OMFApplication(ResourceManager): self._omf_api = None - self._logger = logging.getLogger("nepi.omf.omfApp ") - self._logger.setLevel(nepi.LOGLEVEL) - + @property + def node(self): + rm_list = self.get_connected(OMFNode.rtype()) + if rm_list: return rm_list[0] + return None - def _validate_connection(self, guid): - """Check if the connection is available. + def valid_connection(self, guid): + """ Check if the connection with the guid in parameter is possible. + Only meaningful connections are allowed. - :param guid: Guid of the current RM + :param guid: Guid of RM it will be connected :type guid: int :rtype: Boolean """ rm = self.ec.get_resource(guid) if rm.rtype() not in self._authorized_connections: - 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)) + msg = ("Connection between %s %s and %s %s refused: " + "An Application can be connected only to a Node" ) % \ + (self.rtype(), self._guid, rm.rtype(), guid) + self.debug(msg) + return False + elif len(self.connections) != 0 : - self._logger.debug("Connection between %s %s and %s %s refused : Already Connected" % (self.rtype(), self._guid, rm.rtype(), guid)) + msg = ("Connection between %s %s and %s %s refused: " + "This Application is already connected" ) % \ + (self.rtype(), self._guid, rm.rtype(), guid) + self.debug(msg) + return False + else : - self._logger.debug("Connection between %s %s and %s %s accepted" % (self.rtype(), self._guid, rm.rtype(), guid)) + msg = "Connection between %s %s and %s %s accepted" % ( + self.rtype(), self._guid, rm.rtype(), guid) + self.debug(msg) + return True - def _get_nodes(self, conn_set): - """Get the RM of the node to which the application is connected + def deploy(self): + """ Deploy the RM. It means nothing special for an application + for now (later it will be upload sources, ...) + It becomes DEPLOYED after getting the xmpp client. - :param conn_set: Connections of the current Guid - :type conn_set: set - :rtype: ResourceManager """ + if not self._omf_api : + self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'), + self.get('xmppHost'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.ec.exp_id) - for elt in conn_set: - rm = self.ec.get_resource(elt) - if rm.rtype() == "OMFNode": - return rm - return None + if not self._omf_api : + msg = "Credentials are not initialzed. XMPP Connections impossible" + self.error(msg) + self.fail() + return - def deploy_action(self): - """Deploy the RM - - """ - self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword')) - super(OMFApplication, self).deploy_action() + super(OMFApplication, self).deploy() def start(self): - """Send Xmpp Message Using OMF protocol to execute the application + """ Start the RM. It means : Send Xmpp Message Using OMF protocol + to execute the application. + It becomes STARTED before the messages are sent (for coordination) """ - super(OMFApplication, self).start() - self._logger.debug(" " + self.rtype() + " ( Guid : " + str(self._guid) +") : " + self.get('appid') + " : " + self.get('path') + " : " + self.get('args') + " : " + self.get('env')) + if not (self.get('appid') and self.get('path')) : + msg = "Application's information are not initialized" + self.error(msg) + self.fail() + return + + if not self.get('args'): + self.set('args', " ") + if not self.get('env'): + self.set('env', " ") + + # Some information to check the information in parameter + msg = " " + self.rtype() + " ( Guid : " + str(self._guid) +") : " + \ + self.get('appid') + " : " + self.get('path') + " : " + \ + self.get('args') + " : " + self.get('env') + self.info(msg) + + try: + self._omf_api.execute(self.node.get('hostname'),self.get('appid'), \ + self.get('args'), self.get('path'), self.get('env')) + except AttributeError: + msg = "Credentials are not initialzed. XMPP Connections impossible" + self.error(msg) + self.fail() + raise - if self.get('appid') and self.get('path') and self.get('args') and self.get('env'): - rm_node = self._get_nodes(self._connections) - self._omf_api.execute(rm_node.get('hostname'),self.get('appid'), self.get('args'), self.get('path'), self.get('env')) + super(OMFApplication, self).start() def stop(self): - """Send Xmpp Message Using OMF protocol to kill the application + """ Stop the RM. It means : Send Xmpp Message Using OMF protocol to + kill the application. + State is set to STOPPED after the message is sent. """ + try: + self._omf_api.exit(self.node.get('hostname'),self.get('appid')) + except AttributeError: + msg = "Credentials were not initialzed. XMPP Connections impossible" + self.error(msg) + self.fail() + return - rm_node = self._get_nodes(self._connections) - self._omf_api.exit(rm_node.get('hostname'),self.get('appid')) super(OMFApplication, self).stop() def release(self): - """Clean the RM at the end of the experiment + """ Clean the RM at the end of the experiment and release the API. """ - OMFAPIFactory.release_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword')) + if self._omf_api : + OMFAPIFactory.release_api(self.get('xmppSlice'), + self.get('xmppHost'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.ec.exp_id) + + super(OMFApplication, self).release()