X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fexecution%2Fresource.py;h=d868c26251a80f93914f9e80442d32d9917f39ac;hb=ac866efb762875550bdc0c05d693e5eb026f435e;hp=fdae0adef8b010d9243dfbbb7eee90b9facd94f2;hpb=4293501ba94ccc735c923603f273736ca96391dd;p=nepi.git diff --git a/src/nepi/execution/resource.py b/src/nepi/execution/resource.py index fdae0ade..d868c262 100644 --- a/src/nepi/execution/resource.py +++ b/src/nepi/execution/resource.py @@ -31,8 +31,6 @@ import sys import threading import weakref -reschedule_delay = "1s" - class ResourceAction: """ Action that a user can order to a Resource Manager @@ -113,11 +111,13 @@ def failtrap(func): try: return func(self, *args, **kwargs) except: + self.fail() + import traceback err = traceback.format_exc() - self.error(err) - self.debug("SETTING guid %d to state FAILED" % self.guid) - self.fail() + logger = Logger(self._rtype) + logger.error(err) + logger.error("SETTING guid %d to state FAILED" % self.guid) raise return wrapped @@ -140,6 +140,7 @@ class ResourceManager(Logger): _traces = None _help = None _backend = None + _reschedule_delay = "0.5s" @classmethod def _register_attribute(cls, attr): @@ -274,7 +275,6 @@ class ResourceManager(Logger): """ return copy.deepcopy(cls._attributes[name]) - @classmethod def get_traces(cls): """ Returns a copy of the traces @@ -353,7 +353,7 @@ class ResourceManager(Logger): # instance lock to synchronize exclusive state change methods (such # as deploy and release methods), in order to prevent them from being - # executed at the same time + # executed at the same time and corrupt internal resource state self._release_lock = threading.Lock() @property @@ -421,6 +421,11 @@ class ResourceManager(Logger): """ Get the current state of the RM """ return self._state + @property + def reschedule_delay(self): + """ Returns default reschedule delay """ + return self._reschedule_delay + def log_message(self, msg): """ Returns the log message formatted with added information. @@ -561,11 +566,14 @@ class ResourceManager(Logger): try: self.do_release() except: + self.set_released() + import traceback err = traceback.format_exc() - self.error(err) - - self.set_released() + msg = " %s guid %d ----- FAILED TO RELEASE ----- \n %s " % ( + self._rtype, self.guid, err) + logger = Logger(self._rtype) + logger.debug(msg) def fail(self): """ Sets the RM to state FAILED. @@ -598,8 +606,12 @@ class ResourceManager(Logger): :rtype: str """ attr = self._attrs[name] + + """ + A.Q. Commenting due to performance impact if attr.has_flag(Flags.Global): self.warning( "Attribute %s is global. Use get_global instead." % name) + """ return attr.value @@ -612,7 +624,7 @@ class ResourceManager(Logger): :rtype: str """ attr = self._attrs[name] - return attr.has_changed() + return attr.has_changed def has_flag(self, name, flag): """ Returns true if the attribute has the flag 'flag' @@ -746,6 +758,18 @@ class ResourceManager(Logger): connected.append(rm) return connected + def is_rm_instance(self, rtype): + """ Returns True if the RM is instance of 'rtype' + + :param rtype: Type of the RM we look for + :type rtype: str + :return: True|False + """ + rclass = ResourceFactory.get_resource_type(rtype) + if isinstance(self, rclass): + return True + return False + @failtrap def _needs_reschedule(self, group, state, time): """ Internal method that verify if 'time' has elapsed since @@ -764,7 +788,7 @@ class ResourceManager(Logger): """ reschedule = False - delay = reschedule_delay + delay = self.reschedule_delay # check state and time elapsed on all RMs for guid in group: @@ -833,7 +857,7 @@ class ResourceManager(Logger): """ reschedule = False - delay = reschedule_delay + delay = self.reschedule_delay ## evaluate if set conditions are met @@ -858,7 +882,7 @@ class ResourceManager(Logger): #import pdb;pdb.set_trace() reschedule = False - delay = reschedule_delay + delay = self.reschedule_delay ## evaluate if conditions to start are met @@ -877,12 +901,12 @@ class ResourceManager(Logger): # Verify all start conditions are met 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 ) + #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: @@ -900,7 +924,7 @@ class ResourceManager(Logger): """ reschedule = False - delay = reschedule_delay + delay = self.reschedule_delay ## evaluate if conditions to stop are met if self.ec.abort: @@ -933,7 +957,7 @@ class ResourceManager(Logger): """ reschedule = False - delay = reschedule_delay + delay = self.reschedule_delay ## evaluate if conditions to deploy are met if self.ec.abort: @@ -942,6 +966,7 @@ class ResourceManager(Logger): # only can deploy when RM is either NEW, DISCOVERED or PROVISIONED if self.state not in [ResourceState.NEW, ResourceState.DISCOVERED, ResourceState.PROVISIONED]: + #### XXX: A.Q. IT SHOULD FAIL IF DEPLOY IS CALLED IN OTHER STATES! reschedule = True self.debug("---- RESCHEDULING DEPLOY ---- state %s " % self.state ) else: @@ -1014,6 +1039,7 @@ class ResourceManager(Logger): def do_fail(self): self.set_failed() + self.ec.inform_failure(self.guid) def set_started(self, time = None): """ Mark ResourceManager as STARTED """ @@ -1033,12 +1059,18 @@ class ResourceManager(Logger): def set_released(self, time = None): """ Mark ResourceManager as REALEASED """ self.set_state(ResourceState.RELEASED, "_release_time", time) - self.debug("----- RELEASED ---- ") + + msg = " %s guid %d ----- RELEASED ----- " % (self._rtype, self.guid) + logger = Logger(self._rtype) + logger.debug(msg) def set_failed(self, time = None): """ Mark ResourceManager as FAILED """ self.set_state(ResourceState.FAILED, "_failed_time", time) - self.debug("----- FAILED ---- ") + + msg = " %s guid %d ----- FAILED ----- " % (self._rtype, self.guid) + logger = Logger(self._rtype) + logger.debug(msg) def set_discovered(self, time = None): """ Mark ResourceManager as DISCOVERED """