git://git.onelab.eu
/
nepi.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Adding data progressing functions for CCN
[nepi.git]
/
src
/
nepi
/
execution
/
resource.py
diff --git
a/src/nepi/execution/resource.py
b/src/nepi/execution/resource.py
index
61ba806
..
0f75e9a
100644
(file)
--- a/
src/nepi/execution/resource.py
+++ b/
src/nepi/execution/resource.py
@@
-31,7
+31,7
@@
import sys
import threading
import weakref
import threading
import weakref
-reschedule_delay = "
1
s"
+reschedule_delay = "
0.5
s"
class ResourceAction:
""" Action that a user can order to a Resource Manager
class ResourceAction:
""" Action that a user can order to a Resource Manager
@@
-113,11
+113,13
@@
def failtrap(func):
try:
return func(self, *args, **kwargs)
except:
try:
return func(self, *args, **kwargs)
except:
+ self.fail()
+
import traceback
err = traceback.format_exc()
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
raise
return wrapped
@@
-274,7
+276,6
@@
class ResourceManager(Logger):
"""
return copy.deepcopy(cls._attributes[name])
"""
return copy.deepcopy(cls._attributes[name])
-
@classmethod
def get_traces(cls):
""" Returns a copy of the traces
@classmethod
def get_traces(cls):
""" Returns a copy of the traces
@@
-353,7
+354,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
# 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
self._release_lock = threading.Lock()
@property
@@
-561,11
+562,14
@@
class ResourceManager(Logger):
try:
self.do_release()
except:
try:
self.do_release()
except:
+ self.set_released()
+
import traceback
err = traceback.format_exc()
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.
def fail(self):
""" Sets the RM to state FAILED.
@@
-598,8
+602,12
@@
class ResourceManager(Logger):
:rtype: str
"""
attr = self._attrs[name]
: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)
if attr.has_flag(Flags.Global):
self.warning( "Attribute %s is global. Use get_global instead." % name)
+ """
return attr.value
return attr.value
@@
-612,7
+620,7
@@
class ResourceManager(Logger):
:rtype: str
"""
attr = self._attrs[name]
: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'
def has_flag(self, name, flag):
""" Returns true if the attribute has the flag 'flag'
@@
-746,6
+754,18
@@
class ResourceManager(Logger):
connected.append(rm)
return connected
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
@failtrap
def _needs_reschedule(self, group, state, time):
""" Internal method that verify if 'time' has elapsed since
@@
-877,12
+897,12
@@
class ResourceManager(Logger):
# Verify all start conditions are met
for (group, state, time) in start_conditions:
# Uncomment for debug
# 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:
reschedule, delay = self._needs_reschedule(group, state, time)
if reschedule:
@@
-942,6
+962,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]:
# 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:
reschedule = True
self.debug("---- RESCHEDULING DEPLOY ---- state %s " % self.state )
else:
@@
-1014,50
+1035,62
@@
class ResourceManager(Logger):
def do_fail(self):
self.set_failed()
def do_fail(self):
self.set_failed()
+ self.ec.inform_failure(self.guid)
- def set_started(self):
+ def set_started(self
, time = None
):
""" Mark ResourceManager as STARTED """
""" Mark ResourceManager as STARTED """
- self.set_state(ResourceState.STARTED, "_start_time")
+ self.set_state(ResourceState.STARTED, "_start_time"
, time
)
self.debug("----- STARTED ---- ")
self.debug("----- STARTED ---- ")
- def set_stopped(self):
+ def set_stopped(self
, time = None
):
""" Mark ResourceManager as STOPPED """
""" Mark ResourceManager as STOPPED """
- self.set_state(ResourceState.STOPPED, "_stop_time")
+ self.set_state(ResourceState.STOPPED, "_stop_time"
, time
)
self.debug("----- STOPPED ---- ")
self.debug("----- STOPPED ---- ")
- def set_ready(self):
+ def set_ready(self
, time = None
):
""" Mark ResourceManager as READY """
""" Mark ResourceManager as READY """
- self.set_state(ResourceState.READY, "_ready_time")
+ self.set_state(ResourceState.READY, "_ready_time"
, time
)
self.debug("----- READY ---- ")
self.debug("----- READY ---- ")
- def set_released(self):
+ def set_released(self
, time = None
):
""" Mark ResourceManager as REALEASED """
""" Mark ResourceManager as REALEASED """
- self.set_state(ResourceState.RELEASED, "_release_time")
- self.debug("----- RELEASED ---- ")
+ self.set_state(ResourceState.RELEASED, "_release_time", time)
- def set_failed(self):
+ 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 """
""" Mark ResourceManager as FAILED """
- self.set_state(ResourceState.FAILED, "_failed_time")
- self.debug("----- FAILED ---- ")
+ self.set_state(ResourceState.FAILED, "_failed_time", time)
+
+ msg = " %s guid %d ----- FAILED ----- " % (self._rtype, self.guid)
+ logger = Logger(self._rtype)
+ logger.debug(msg)
- def set_discovered(self):
+ def set_discovered(self
, time = None
):
""" Mark ResourceManager as DISCOVERED """
""" Mark ResourceManager as DISCOVERED """
- self.set_state(ResourceState.DISCOVERED, "_discover_time")
+ self.set_state(ResourceState.DISCOVERED, "_discover_time"
, time
)
self.debug("----- DISCOVERED ---- ")
self.debug("----- DISCOVERED ---- ")
- def set_provisioned(self):
+ def set_provisioned(self
, time = None
):
""" Mark ResourceManager as PROVISIONED """
""" Mark ResourceManager as PROVISIONED """
- self.set_state(ResourceState.PROVISIONED, "_provision_time")
+ self.set_state(ResourceState.PROVISIONED, "_provision_time"
, time
)
self.debug("----- PROVISIONED ---- ")
self.debug("----- PROVISIONED ---- ")
- def set_state(self, state, state_time_attr):
+ def set_state(self, state, state_time_attr
, time = None
):
""" Set the state of the RM while keeping a trace of the time """
# Ensure that RM state will not change after released
if self._state == ResourceState.RELEASED:
return
""" Set the state of the RM while keeping a trace of the time """
# Ensure that RM state will not change after released
if self._state == ResourceState.RELEASED:
return
-
- setattr(self, state_time_attr, tnow())
+
+ time = time or tnow()
+ self.set_state_time(state, state_time_attr, time)
+
+ def set_state_time(self, state, state_time_attr, time):
+ """ Set the time for the RM state change """
+ setattr(self, state_time_attr, time)
self._state = state
class ResourceFactory(object):
self._state = state
class ResourceFactory(object):
@@
-1085,7
+1118,7
@@
class ResourceFactory(object):
return rclass(ec, guid)
def populate_factory():
return rclass(ec, guid)
def populate_factory():
- """
Register all the possible RM that exists in the current version of Nepi.
+ """
Find and rgister all available RMs
"""
# Once the factory is populated, don't repopulate
if not ResourceFactory.resource_types():
"""
# Once the factory is populated, don't repopulate
if not ResourceFactory.resource_types():