Code cleanup. Setting resource state through specific functions
[nepi.git] / src / nepi / execution / resource.py
index 3882523..2d738c5 100644 (file)
@@ -200,7 +200,9 @@ class ResourceManager(Logger):
         # the resource instance gets a copy of all traces
         self._trcs = copy.deepcopy(self._traces)
 
-        self._state = ResourceState.NEW
+        # Each resource is placed on a deployment group by the EC
+        # during deployment
+        self.deployment_group = None
 
         self._start_time = None
         self._stop_time = None
@@ -211,6 +213,8 @@ class ResourceManager(Logger):
         self._finish_time = None
         self._failed_time = None
 
+        self._state = ResourceState.NEW
+
     @property
     def guid(self):
         """ Returns the global unique identifier of the RM """
@@ -314,9 +318,8 @@ class ResourceManager(Logger):
         This  method is resposible for selecting an individual resource
         matching user requirements.
         This method should be redefined when necessary in child classes.
-        """ 
-        self._discover_time = tnow()
-        self._state = ResourceState.DISCOVERED
+        """
+        self.set_discovered()
 
     def provision(self):
         """ Performs resource provisioning.
@@ -325,9 +328,8 @@ class ResourceManager(Logger):
         After this method has been successfully invoked, the resource
         should be acccesible/controllable by the RM.
         This method should be redefined when necessary in child classes.
-        """ 
-        self._provision_time = tnow()
-        self._state = ResourceState.PROVISIONED
+        """
+        self.set_provisioned()
 
     def start(self):
         """ Starts the resource.
@@ -335,12 +337,11 @@ class ResourceManager(Logger):
         There is no generic start behavior for all resources.
         This method should be redefined when necessary in child classes.
         """
-        if not self._state in [ResourceState.READY, ResourceState.STOPPED]:
+        if not self.state in [ResourceState.READY, ResourceState.STOPPED]:
             self.error("Wrong state %s for start" % self.state)
             return
 
-        self._start_time = tnow()
-        self._state = ResourceState.STARTED
+        self.set_started()
 
     def stop(self):
         """ Stops the resource.
@@ -348,12 +349,31 @@ class ResourceManager(Logger):
         There is no generic stop behavior for all resources.
         This method should be redefined when necessary in child classes.
         """
-        if not self._state in [ResourceState.STARTED]:
+        if not self.state in [ResourceState.STARTED]:
             self.error("Wrong state %s for stop" % self.state)
             return
+        
+        self.set_stopped()
 
-        self._stop_time = tnow()
-        self._state = ResourceState.STOPPED
+    def deploy(self):
+        """ Execute all steps required for the RM to reach the state READY
+
+        """
+        if self.state > ResourceState.READY:
+            self.error("Wrong state %s for deploy" % self.state)
+            return
+
+        self.debug("----- READY ---- ")
+        self.set_ready()
+
+    def release(self):
+        self.set_released()
+
+    def finish(self):
+        self.set_finished()
+    def fail(self):
+        self.set_failed()
 
     def set(self, name, value):
         """ Set the value of the attribute
@@ -376,7 +396,7 @@ class ResourceManager(Logger):
         attr = self._attrs[name]
         return attr.value
 
-    def register_trace(self, name):
+    def enable_trace(self, name):
         """ Explicitly enable trace generation
 
         :param name: Name of the trace
@@ -384,7 +404,16 @@ class ResourceManager(Logger):
         """
         trace = self._trcs[name]
         trace.enabled = True
+    
+    def trace_enabled(self, name):
+        """Returns True if trace is enables 
 
+        :param name: Name of the trace
+        :type name: str
+        """
+        trace = self._trcs[name]
+        return trace.enabled
     def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0):
         """ Get information on collected trace
 
@@ -475,9 +504,10 @@ class ResourceManager(Logger):
         :return: list of guid
         """
         connected = []
+        rclass = ResourceFactory.get_resource_type(rtype)
         for guid in self.connections:
             rm = self.ec.get_resource(guid)
-            if not rtype or rm.rtype() == rtype:
+            if not rtype or isinstance(rm, rclass):
                 connected.append(rm)
         return connected
 
@@ -643,39 +673,6 @@ class ResourceManager(Logger):
             self.debug(" ----- STOPPING ---- ") 
             self.stop()
 
-    def deploy(self):
-        """ Execute all steps required for the RM to reach the state READY
-
-        """
-        if self._state > ResourceState.READY:
-            self.error("Wrong state %s for deploy" % self.state)
-            return
-
-        self.debug("----- READY ---- ")
-        self._ready_time = tnow()
-        self._state = ResourceState.READY
-
-    def release(self):
-        """Release any resources used by this RM
-
-        """
-        self._release_time = tnow()
-        self._state = ResourceState.RELEASED
-
-    def finish(self):
-        """ Mark ResourceManager as FINISHED
-
-        """
-        self._finish_time = tnow()
-        self._state = ResourceState.FINISHED
-
-    def fail(self):
-        """ Mark ResourceManager as FAILED
-
-        """
-        self._failed_time = tnow()
-        self._state = ResourceState.FAILED
-
     def connect(self, guid):
         """ Performs actions that need to be taken upon associating RMs.
         This method should be redefined when necessary in child classes.
@@ -700,6 +697,46 @@ class ResourceManager(Logger):
         """
         # TODO: Validate!
         return True
+    
+    def set_started(self):
+        """ Mark ResourceManager as STARTED """
+        self._start_time = tnow()
+        self._state = ResourceState.STARTED
+        
+    def set_stopped(self):
+        """ Mark ResourceManager as STOPPED """
+        self._stop_time = tnow()
+        self._state = ResourceState.STOPPED
+
+    def set_ready(self):
+        """ Mark ResourceManager as READY """
+        self._ready_time = tnow()
+        self._state = ResourceState.READY
+
+    def set_released(self):
+        """ Mark ResourceManager as REALEASED """
+        self._release_time = tnow()
+        self._state = ResourceState.RELEASED
+
+    def set_finished(self):
+        """ Mark ResourceManager as FINISHED """
+        self._finish_time = tnow()
+        self._state = ResourceState.FINISHED
+
+    def set_failed(self):
+        """ Mark ResourceManager as FAILED """
+        self._failed_time = tnow()
+        self._state = ResourceState.FAILED
+
+    def set_discovered(self):
+        """ Mark ResourceManager as DISCOVERED """
+        self._discover_time = tnow()
+        self._state = ResourceState.DISCOVERED
+
+    def set_provisioned(self):
+        """ Mark ResourceManager as PROVISIONED """
+        self._provision_time = tnow()
+        self._state = ResourceState.PROVISIONED
 
 class ResourceFactory(object):
     _resource_types = dict()
@@ -709,6 +746,11 @@ class ResourceFactory(object):
         """Return the type of the Class"""
         return cls._resource_types
 
+    @classmethod
+    def get_resource_type(cls, rtype):
+        """Return the type of the Class"""
+        return cls._resource_types.get(rtype)
+
     @classmethod
     def register_type(cls, rclass):
         """Register a new Ressource Manager"""
@@ -723,13 +765,14 @@ class ResourceFactory(object):
 def populate_factory():
     """Register all the possible RM that exists in the current version of Nepi.
     """
-    for rclass in find_types():
-        ResourceFactory.register_type(rclass)
+    # Once the factory is populated, don't repopulate
+    if not ResourceFactory.resource_types():
+        for rclass in find_types():
+            ResourceFactory.register_type(rclass)
 
 def find_types():
     """Look into the different folders to find all the 
     availables Resources Managers
-
     """
     search_path = os.environ.get("NEPI_SEARCH_PATH", "")
     search_path = set(search_path.split(" "))
@@ -741,10 +784,15 @@ def find_types():
 
     types = []
 
-    for importer, modname, ispkg in pkgutil.walk_packages(search_path):
+    for importer, modname, ispkg in pkgutil.walk_packages(search_path, 
+            prefix = "nepi.resources."):
+
         loader = importer.find_module(modname)
+        
         try:
-            module = loader.load_module(loader.fullname)
+            # Notice: Repeated calls to load_module will act as a reload of teh module
+            module = loader.load_module(modname)
+
             for attrname in dir(module):
                 if attrname.startswith("_"):
                     continue
@@ -764,7 +812,7 @@ def find_types():
             import logging
             err = traceback.format_exc()
             logger = logging.getLogger("Resource.find_types()")
-            logger.error("Error while lading Resource Managers %s" % err)
+            logger.error("Error while loading Resource Managers %s" % err)
 
     return types