# 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
self._finish_time = None
self._failed_time = None
+ self._state = ResourceState.NEW
+
@property
def guid(self):
""" Returns the global unique identifier of the RM """
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.
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.
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.
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
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
"""
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
: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
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.
"""
# 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()
"""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"""
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(" "))
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
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