applied the except and raise fixers to the master branch to close the gap with py3
[nepi.git] / src / nepi / resources / omf / application.py
index a0faf2a..03db088 100644 (file)
@@ -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
 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
 #         Julien Tribino <julien.tribino@inria.fr>
 
+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'),