X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fapplication.py;h=673f8100c94b2a2f060d29600dbd728b38840a88;hb=bf43c83ced9389c8fa9468d7c23f67d35af963da;hp=22c8dca4a74d13456c5799219c25a77c4d332b5e;hpb=035281100ca10f829cdf17c16e50f1e13e011e2a;p=nepi.git diff --git a/src/nepi/resources/omf/application.py b/src/nepi/resources/omf/application.py index 22c8dca4..673f8100 100644 --- a/src/nepi/resources/omf/application.py +++ b/src/nepi/resources/omf/application.py @@ -18,11 +18,12 @@ # Author: Alina Quereilhac # Julien Tribino -from nepi.execution.resource import ResourceManager, clsinit, ResourceState +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 -reschedule_delay = "0.5s" @clsinit class OMFApplication(ResourceManager): @@ -38,7 +39,8 @@ 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" @@ -46,7 +48,8 @@ class OMFApplication(ResourceManager): @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") @@ -77,7 +80,6 @@ class OMFApplication(ResourceManager): :type creds: dict """ - super(OMFApplication, self).__init__(ec, guid) self.set('appid', "") @@ -89,8 +91,15 @@ class OMFApplication(ResourceManager): self._omf_api = None + @property + def node(self): + rm_list = self.get_connected(OMFNode.rtype()) + if rm_list: return rm_list[0] + return None + def valid_connection(self, guid): - """Check if the connection with the guid in parameter is possible. Only meaningful connections are allowed. + """ Check if the connection with the guid in parameter is possible. + Only meaningful connections are allowed. :param guid: Guid of RM it will be connected :type guid: int @@ -99,80 +108,105 @@ class OMFApplication(ResourceManager): """ rm = self.ec.get_resource(guid) if rm.rtype() not in self._authorized_connections: - msg = "Connection between %s %s and %s %s refused : An Application can be connected only to a Node" %\ + 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 : - msg = "Connection between %s %s and %s %s refused : This Application is already connected" % \ + 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 : - msg = "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 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. + """ 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. + """ if not self._omf_api : self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword')) - + self.get('xmppHost'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.ec.exp_id) + + if not self._omf_api : + msg = "Credentials are not initialzed. XMPP Connections impossible" + self.error(msg) + self.fail() + return + super(OMFApplication, self).deploy() def start(self): - """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) + """ 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() - if self.get('appid') and self.get('path') and self.get('args') and self.get('env') : - msg = " " + self.rtype() + " ( Guid : " + str(self._guid) +") : " + \ - self.get('appid') + " : " + self.get('path') + " : " + \ - self.get('args') + " : " + self.get('env') - self.info(msg) - rm_list = self.get_connected("OMFNode") - try: - for rm_node in rm_list: - if rm_node.get('hostname') : - self._omf_api.execute(rm_node.get('hostname'),self.get('appid'), \ - self.get('args'), self.get('path'), self.get('env')) - except AttributeError: - self._state = ResourceState.FAILED - msg = "Credentials are not initialzed. XMPP Connections impossible" - self.error(msg) - return - else : - self._state = ResourceState.FAILED + 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 + + super(OMFApplication, self).start() def stop(self): - """Stop the RM. It means : Send Xmpp Message Using OMF protocol to kill the application - It becomes STOPPED after the message is sent. + """ 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: - rm_list = self.get_connected("OMFNode") - for rm_node in rm_list : - self._omf_api.exit(rm_node.get('hostname'),self.get('appid')) + self._omf_api.exit(self.node.get('hostname'),self.get('appid')) except AttributeError: - self._state = ResourceState.FAILED msg = "Credentials were not initialzed. XMPP Connections impossible" self.error(msg) - return + self.fail() + #raise + super(OMFApplication, self).stop() - self._state = ResourceState.FINISHED - def release(self): - """Clean the RM at the end of the experiment and release the API. + """ Clean the RM at the end of the experiment and release the API. """ if self._omf_api : OMFAPIFactory.release_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword')) + self.get('xmppHost'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.ec.exp_id) + + super(OMFApplication, self).release()