Commiting improvements to Collector. Local_dir added to ExperimentController
[nepi.git] / src / nepi / execution / ec.py
index 2c6557f..1357e4f 100644 (file)
@@ -34,6 +34,7 @@ import functools
 import logging
 import os
 import sys
+import tempfile
 import time
 import threading
 import weakref
@@ -150,7 +151,7 @@ class ExperimentController(object):
     exp_id, which can be re-used in different ExperimentController,
     and the run_id, which is unique to one ExperimentController instance, and
     is automatically generated by NEPI.
-        
+   
     """
 
     @classmethod
@@ -159,7 +160,22 @@ class ExperimentController(object):
         ec = serializer.load(filepath)
         return ec
 
-    def __init__(self, exp_id = None): 
+    def __init__(self, exp_id = None, local_dir = None, persist = False):
+        """ ExperimentController entity to model an execute a network experiment.
+        
+        :param exp_id: Human readable name to identify the experiment
+        :type name: str
+
+        :param local_dir: Path to local directory where to store experiment
+            related files
+        :type name: str
+
+        :param persist: Save an XML description of the experiment after 
+        completion at local_dir
+        :type name: bool
+
+        """
+
         super(ExperimentController, self).__init__()
 
         # Logging
@@ -177,6 +193,17 @@ class ExperimentController(object):
         # resources used, etc)
         self._exp_id = exp_id or "exp-%s" % os.urandom(8).encode('hex')
 
+        # Local path where to store experiment related files (results, etc)
+        if not local_dir:
+            local_dir = tempfile.mkdtemp()
+
+        self._local_dir = local_dir
+        self._exp_dir = os.path.join(local_dir, self.exp_id)
+        self._run_dir = os.path.join(self.exp_dir, self.run_id)
+
+        # If True persist the experiment controller in XML format, after completion
+        self._persist = persist
+
         # generator of globally unique ids
         self._guid_generator = guid.GuidGenerator()
         
@@ -261,7 +288,36 @@ class ExperimentController(object):
         """
         return self._nthreads
 
+    @property
+    def local_dir(self):
+        """ Root local directory for experiment files
+
+        """
+        return self._local_dir
+
+    @property
+    def exp_dir(self):
+        """ Local directory to store results and other files related to the 
+        experiment.
+
+        """
+        return self._exp_dir
+
+    @property
+    def run_dir(self):
+        """ Local directory to store results and other files related to the 
+        experiment run.
+
+        """
+        return self._run_dir
+
+    @property
+    def persist(self):
+        """ If Trie persist the ExperimentController to XML format upon completion
+
+        """
+        return self._persist
+
     @property
     def abort(self):
         """ Returns True if the experiment has failed and should be interrupted,
@@ -942,6 +998,9 @@ class ExperimentController(object):
 
         self.wait_released(guids)
 
+        if self.persist:
+            self.save(dirpath = self.run_dir)
+
         for guid in guids:
             if self.get(guid, "hardRelease"):
                 self.remove_resource(guid)