Added unit tests for linux application
[nepi.git] / src / neco / execution / resource.py
index 7669804..0eb0d64 100644 (file)
@@ -3,10 +3,13 @@ from neco.execution.trace import TraceAttr
 
 import copy
 import functools
+import inspect
 import logging
+import os
+import pkgutil
 import weakref
 
-_reschedule_delay = "1s"
+reschedule_delay = "0.5s"
 
 class ResourceAction:
     DEPLOY = 0
@@ -152,7 +155,33 @@ class ResourceManager(object):
         self._release_time = None
 
         # Logging
-        self._logger = logging.getLogger("neco.execution.resource.Resource %s.%d " %  (self._rtype, self.guid))
+        self._logger = logging.getLogger("Resource")
+
+    def debug(self, msg, out = None, err = None):
+        self.log(msg, logging.DEBUG, out, err)
+
+    def error(self, msg, out = None, err = None):
+        self.log(msg, logging.ERROR, out, err)
+
+    def warn(self, msg, out = None, err = None):
+        self.log(msg, logging.WARNING, out, err)
+
+    def info(self, msg, out = None, err = None):
+        self.log(msg, logging.INFO, out, err)
+
+    def log(self, msg, level, out = None, err = None):
+        if out:
+            msg += " - OUT: %s " % out
+
+        if err:
+            msg += " - ERROR: %s " % err
+
+        msg = self.log_message(msg)
+
+        self.logger.log(level, msg)
+
+    def log_message(self, msg):
+        return " %s guid: %d - %s " % (self._rtype, self.guid, msg)
 
     @property
     def logger(self):
@@ -225,7 +254,7 @@ class ResourceManager(object):
 
         """
         if not self._state in [ResourceState.READY, ResourceState.STOPPED]:
-            self.logger.error("Wrong state %s for start" % self.state)
+            self.error("Wrong state %s for start" % self.state)
             return
 
         self._start_time = strfnow()
@@ -236,7 +265,7 @@ class ResourceManager(object):
 
         """
         if not self._state in [ResourceState.STARTED]:
-            self.logger.error("Wrong state %s for stop" % self.state)
+            self.error("Wrong state %s for stop" % self.state)
             return
 
         self._stop_time = strfnow()
@@ -348,7 +377,7 @@ class ResourceManager(object):
 
         """
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         # check state and time elapsed on all RMs
         for guid in group:
@@ -403,7 +432,7 @@ class ResourceManager(object):
         """
 
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         ## evaluate if set conditions are met
 
@@ -426,16 +455,16 @@ class ResourceManager(object):
 
         """
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         ## evaluate if set conditions are met
 
         # only can start when RM is either STOPPED or READY
         if self.state not in [ResourceState.STOPPED, ResourceState.READY]:
             reschedule = True
-            self.logger.debug("---- RESCHEDULING START ---- state %s " % self.state )
+            self.debug("---- RESCHEDULING START ---- state %s " % self.state )
         else:
-            self.logger.debug("---- START CONDITIONS ---- %s" % 
+            self.debug("---- START CONDITIONS ---- %s" % 
                     self.conditions.get(ResourceAction.START))
             
             # Verify all start conditions are met
@@ -448,7 +477,7 @@ class ResourceManager(object):
         if reschedule:
             self.ec.schedule(delay, self.start_with_conditions)
         else:
-            self.logger.debug("----- STARTING ---- ")
+            self.debug("----- STARTING ---- ")
             self.start()
 
     def stop_with_conditions(self):
@@ -457,7 +486,7 @@ class ResourceManager(object):
 
         """
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         ## evaluate if set conditions are met
 
@@ -465,7 +494,7 @@ class ResourceManager(object):
         if self.state != ResourceState.STARTED:
             reschedule = True
         else:
-            self.logger.debug(" ---- STOP CONDITIONS ---- %s" % 
+            self.debug(" ---- STOP CONDITIONS ---- %s" % 
                     self.conditions.get(ResourceAction.STOP))
 
             stop_conditions = self.conditions.get(ResourceAction.STOP, []) 
@@ -486,9 +515,10 @@ class ResourceManager(object):
 
         """
         if self._state > ResourceState.READY:
-            self.logger.error("Wrong state %s for deploy" % self.state)
+            self.error("Wrong state %s for deploy" % self.state)
             return
 
+        self.debug("----- DEPLOYING ---- ")
         self._ready_time = strfnow()
         self._state = ResourceState.READY
 
@@ -526,3 +556,44 @@ class ResourceFactory(object):
         rclass = cls._resource_types[rtype]
         return rclass(ec, guid)
 
+def populate_factory():
+    for rclass in find_types():
+        ResourceFactory.register_type(rclass)
+
+def find_types():
+    search_path = os.environ.get("NECO_SEARCH_PATH", "")
+    search_path = set(search_path.split(" "))
+   
+    import neco.resources 
+    path = os.path.dirname(neco.resources.__file__)
+    search_path.add(path)
+
+    types = []
+
+    for importer, modname, ispkg in pkgutil.walk_packages(search_path):
+        loader = importer.find_module(modname)
+        try:
+            module = loader.load_module(loader.fullname)
+            for attrname in dir(module):
+                if attrname.startswith("_"):
+                    continue
+
+                attr = getattr(module, attrname)
+
+                if attr == ResourceManager:
+                    continue
+
+                if not inspect.isclass(attr):
+                    continue
+
+                if issubclass(attr, ResourceManager):
+                    types.append(attr)
+        except:
+            import traceback
+            err = traceback.format_exc()
+            logger = logging.getLogger("Resource.find_types()")
+            logger.error("Error while lading Resource Managers %s" % err)
+
+    return types
+
+