X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fapplication.py;h=03db08892ae220a49b3666d4fa771cd436b053ee;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=a0faf2a1d36e1da9b1cfaecc2aa071a0e9dd97ff;hpb=665cc9b410de55b1013ad86b4764b07f2b1e5f42;p=nepi.git diff --git a/src/nepi/resources/omf/application.py b/src/nepi/resources/omf/application.py index a0faf2a1..03db0889 100644 --- a/src/nepi/resources/omf/application.py +++ b/src/nepi/resources/omf/application.py @@ -3,9 +3,8 @@ # 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. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,10 +17,14 @@ # Author: Alina Quereilhac # Julien Tribino +from __future__ import print_function + import os +from nepi.util.timefuncs import tnow from nepi.execution.resource import ResourceManager, clsinit_copy, \ - ResourceState, reschedule_delay + ResourceState +from nepi.execution.trace import Trace, TraceAttr from nepi.execution.attribute import Attribute, Flags from nepi.resources.omf.omf_resource import ResourceGateway, OMFResource from nepi.resources.omf.node import OMFNode, confirmation_counter, reschedule_check @@ -40,8 +43,8 @@ class OMFApplication(OMFResource): :type guid: int """ - _rtype = "OMFApplication" - _authorized_connections = ["OMFNode", "WilabtSfaNode"] + _rtype = "omf::Application" + _authorized_connections = ["omf::Node", "wilabt::sfa::Node"] @classmethod def _register_attributes(cls): @@ -97,6 +100,14 @@ class OMFApplication(OMFResource): self.release_id = None self._release_cnt = 0 + # For performance tests + self.begin_deploy_time = None + self.begin_start_time = None + self.begin_release_time = None + self.dperf = True + self.sperf = True + self.rperf = True + self.add_set_hook() def _init_command(self): @@ -172,9 +183,14 @@ class OMFApplication(OMFResource): if not self.node or self.node.state < ResourceState.READY: self.debug("---- RESCHEDULING DEPLOY ---- node state %s " % self.node.state ) - self.ec.schedule(reschedule_delay, self.deploy) + self.ec.schedule(self.reschedule_delay, self.deploy) return + ## For performance test + if self.dperf: + self.begin_deploy_time = tnow() + self.dperf = False + self._init_command() self.set('xmppUser',self.node.get('xmppUser')) @@ -186,7 +202,7 @@ class OMFApplication(OMFResource): if not self.get('xmppServer'): msg = "XmppServer is not initialzed. XMPP Connections impossible" self.error(msg) - raise RuntimeError, msg + raise RuntimeError(msg) if not (self.get('xmppUser') or self.get('xmppPort') or self.get('xmppPassword')): @@ -196,7 +212,7 @@ class OMFApplication(OMFResource): if not self.get('command') : msg = "Application's Command is not initialized" self.error(msg) - raise RuntimeError, msg + raise RuntimeError(msg) if not self._omf_api : self._omf_api = OMFAPIFactory.get_api(self.get('version'), @@ -204,6 +220,9 @@ class OMFApplication(OMFResource): self.get('xmppPassword'), exp_id = self.exp_id) if self.get('version') == "5": + + self.begin_deploy_time = tnow() + if self.get('sources'): gateway = ResourceGateway.AMtoGateway[self.get('xmppServer')] user = self.get('sshUser') or self.get('xmppUser') @@ -225,7 +244,7 @@ class OMFApplication(OMFResource): if self._create_cnt > confirmation_counter: msg = "Couldn't retrieve the confirmation of the creation" self.error(msg) - raise RuntimeError, msg + raise RuntimeError(msg) uid = self.check_deploy(self.create_id) if not uid: @@ -251,16 +270,44 @@ class OMFApplication(OMFResource): return uid return False + def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0): + self.info("Retrieving '%s' trace %s " % (name, attr)) + if name == 'stdout' : + suffix = '.out' + elif name == 'stderr' : + suffix = '.err' + else : + suffix = '.misc' + + trace_path = '/tmp/'+ self._topic_app + suffix + + if attr == TraceAttr.PATH: + return trace_path + + if attr == TraceAttr.ALL: + try: + with open(trace_path ,'r') as f: + return f.read() + except IOError: + print("File with traces has not been found") + return False + + def do_start(self): """ Start the RM. It means : Send Xmpp Message Using OMF protocol to execute the application. """ + ## For performance test + if self.sperf: + self.begin_start_time = tnow() + self.sperf = False if not self.get('env'): self.set('env', " ") if self.get('version') == "5": + self.begin_start_time = tnow() # Some information to check the command for OMF5 msg = " " + self.get_rtype() + " ( Guid : " + str(self._guid) +") : " + \ self.get('appid') + " : " + self._path + " : " + \ @@ -284,7 +331,7 @@ class OMFApplication(OMFResource): if self._start_cnt > confirmation_counter: msg = "Couldn't retrieve the confirmation that the application started" self.error(msg) - raise RuntimeError, msg + raise RuntimeError(msg) res = self.check_start(self._topic_app) if not res: @@ -313,6 +360,8 @@ class OMFApplication(OMFResource): State is set to STOPPED after the message is sent. """ + + if self.get('version') == 5: self._omf_api.exit(self.node.get('hostname'),self.get('appid')) super(OMFApplication, self).do_stop() @@ -334,8 +383,13 @@ class OMFApplication(OMFResource): """ Clean the RM at the end of the experiment and release the API. """ + ## For performance test + if self.rperf: + self.begin_release_time = tnow() + self.rperf = False + if self._omf_api: - if self.get('version') == "6": + if self.get('version') == "6" and self._topic_app: if not self.release_id: self.release_id = os.urandom(16).encode('hex') self._omf_api.frcp_release( self.release_id, self.node.get('hostname'),self._topic_app, res_id=self._topic_app) @@ -350,6 +404,12 @@ class OMFApplication(OMFResource): msg = "Couldn't retrieve the confirmation of the release" self.error(msg) + # Remove the stdout and stderr of the application + try: + os.remove('/tmp/'+self._topic_app +'.out') + os.remove('/tmp/'+self._topic_app +'.err') + except OSError: + pass OMFAPIFactory.release_api(self.get('version'), self.get('xmppServer'), self.get('xmppUser'), self.get('xmppPort'),