applied the except and raise fixers to the master branch to close the gap with py3
[nepi.git] / src / nepi / resources / linux / ns3 / ns3simulation.py
index 63d8d37..0a44d7a 100644 (file)
@@ -3,9 +3,8 @@
 #    Copyright (C) 2014 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
@@ -20,7 +19,7 @@
 from nepi.execution.attribute import Attribute, Flags, Types
 from nepi.execution.trace import Trace, TraceAttr
 from nepi.execution.resource import ResourceManager, clsinit_copy, \
-        ResourceState, ResourceFactory, reschedule_delay
+        ResourceState, ResourceFactory
 from nepi.resources.linux.application import LinuxApplication
 from nepi.util.timefuncs import tnow, tdiffsec
 from nepi.resources.ns3.ns3simulation import NS3Simulation
@@ -32,12 +31,9 @@ import os
 import time
 import threading
 
-## TODO: Clean up DCE part. All that is DCE specific should go
-##       in the linux ns3dceapplication.py
-
 @clsinit_copy
 class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
-    _rtype = "LinuxNS3Simulation"
+    _rtype = "linux::ns3::Simulation"
 
     @classmethod
     def _register_attributes(cls):
@@ -104,8 +100,8 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
 
         dce_version = Attribute("dceVersion",
             "Version of dce to install from nsam repo (tag branch for repo)",
-            default = "dce-1.3", 
-            #default = "dce-dev", 
+            #default = "dce-1.3", 
+            default = "dce-dev", 
             flags = Flags.Design)
 
         populate_routing_tables = Attribute("populateRoutingTables",
@@ -138,9 +134,8 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
         self._client = None
         self._home = "ns3-simu-%s" % self.guid
         self._socket_name = "ns3-%s.sock" % os.urandom(4).encode('hex')
-        self._dce_manager_helper_uuid = None
-        self._dce_application_helper_uuid = None
         self._enable_dce = None
+        self._dce_helper = None
 
     @property
     def socket_name(self):
@@ -257,7 +252,7 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
             self.debug("---- RESCHEDULING DEPLOY ---- node state %s " % self.node.state )
             
             # ccnd needs to wait until node is deployed and running
-            self.ec.schedule(reschedule_delay, self.deploy)
+            self.ec.schedule(self.reschedule_delay, self.deploy)
         else:
             if not self.get("command"):
                 self.set("command", self._start_command)
@@ -316,7 +311,7 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
         else:
             msg = " Failed to execute command '%s'" % command
             self.error(msg, out, err)
-            raise RuntimeError, msg
+            raise RuntimeError(msg)
 
     def do_stop(self):
         """ Stops simulation execution
@@ -340,6 +335,27 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
         
         super(LinuxApplication, self).do_release()
 
+    @property
+    def state(self):
+        super(LinuxApplication, self).state
+        
+        if self._state == ResourceState.STARTED:
+            try:
+                is_finished = self.invoke(SIMULATOR_UUID, "isFinished")
+                
+                if is_finished:
+                    self.set_stopped()
+            except:
+                msg = "Simulator failed. Can not retrieve state"
+                out = ""
+
+                import traceback
+                err = traceback.format_exc()
+                self.error(msg, out, err)
+                self.do_fail()
+
+        return self._state
+
     @property
     def enable_dce(self):
         if self._enable_dce is None:
@@ -352,10 +368,17 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                 rm = self.ec.get_resource(guid)
                 if isinstance(rm, rclass):
                     self._enable_dce = True
+
+                    from nepi.resources.ns3.ns3dcehelper import NS3DceHelper
+                    self._dce_helper = NS3DceHelper(self)
                     break
 
         return self._enable_dce
 
+    @property
+    def dce_helper(self):
+        return self._dce_helper
+        
     @property
     def _start_command(self):
         command = []