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
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):
"""
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()
"""
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()
"""
reschedule = False
- delay = _reschedule_delay
+ delay = reschedule_delay
# check state and time elapsed on all RMs
for guid in group:
"""
reschedule = False
- delay = _reschedule_delay
+ delay = reschedule_delay
## evaluate if set conditions are met
"""
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
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):
"""
reschedule = False
- delay = _reschedule_delay
+ delay = reschedule_delay
## evaluate if set conditions are met
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, [])
"""
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
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
+
+