Minor typos
[nepi.git] / src / neco / execution / resource.py
index 322e276..a7e7758 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
@@ -374,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:
@@ -429,7 +432,7 @@ class ResourceManager(object):
         """
 
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         ## evaluate if set conditions are met
 
@@ -452,7 +455,7 @@ class ResourceManager(object):
 
         """
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         ## evaluate if set conditions are met
 
@@ -461,12 +464,20 @@ class ResourceManager(object):
             reschedule = True
             self.debug("---- RESCHEDULING START ---- state %s " % self.state )
         else:
-            self.debug("---- START CONDITIONS ---- %s" % 
-                    self.conditions.get(ResourceAction.START))
+            start_conditions = self.conditions.get(ResourceAction.START, [])
+            
+            self.debug("---- START CONDITIONS ---- %s" % start_conditions) 
             
             # Verify all start conditions are met
-            start_conditions = self.conditions.get(ResourceAction.START, [])
             for (group, state, time) in start_conditions:
+                # Uncomment for debug
+                #unmet = []
+                #for guid in group:
+                #    rm = self.ec.get_resource(guid)
+                #    unmet.append((guid, rm._state))
+                #
+                #self.debug("---- WAITED STATES ---- %s" % unmet )
+
                 reschedule, delay = self._needs_reschedule(group, state, time)
                 if reschedule:
                     break
@@ -483,7 +494,7 @@ class ResourceManager(object):
 
         """
         reschedule = False
-        delay = _reschedule_delay 
+        delay = reschedule_delay 
 
         ## evaluate if set conditions are met
 
@@ -553,3 +564,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("NEPI_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
+
+