self._failed_testbeds = set()
self._started_time = None
self._stopped_time = None
-
+
self._logger = logging.getLogger('nepi.core.execute')
-
+ level = logging.ERROR
+ if os.environ.get("NEPI_CONTROLLER_LOGLEVEL",
+ DC.ERROR_LEVEL) == DC.DEBUG_LEVEL:
+ level = logging.DEBUG
+ self._logger.setLevel(level)
+
if experiment_xml is None and root_dir is not None:
# Recover
self.load_experiment_xml()
def steps_to_configure(self, allowed_guids):
# perform setup in parallel for all test beds,
# wait for all threads to finish
+
+ self._logger.debug("ExperimentController: Starting parallel do_setup")
self._parallel([testbed.do_setup
for guid,testbed in self._testbeds.iteritems()
if guid in allowed_guids])
# perform create-connect in parallel, wait
# (internal connections only)
+ self._logger.debug("ExperimentController: Starting parallel do_create")
self._parallel([testbed.do_create
for guid,testbed in self._testbeds.iteritems()
if guid in allowed_guids])
+ self._logger.debug("ExperimentController: Starting parallel do_connect_init")
self._parallel([testbed.do_connect_init
for guid,testbed in self._testbeds.iteritems()
if guid in allowed_guids])
+ self._logger.debug("ExperimentController: Starting parallel do_connect_fin")
self._parallel([testbed.do_connect_compl
for guid,testbed in self._testbeds.iteritems()
if guid in allowed_guids])
+ self._logger.debug("ExperimentController: Starting parallel do_preconfigure")
self._parallel([testbed.do_preconfigure
for guid,testbed in self._testbeds.iteritems()
if guid in allowed_guids])
steps_to_configure(self, to_restart)
+ self._logger.debug("ExperimentController: Resolving netreffed testbeds")
if self._netreffed_testbeds:
# initally resolve netrefs
self.do_netrefs(data, fail_if_undefined=False)
all_restart = [ self._testbeds[guid] for guid in all_restart ]
# final netref step, fail if anything's left unresolved
+ self._logger.debug("ExperimentController: Resolving do_netrefs")
self.do_netrefs(data, fail_if_undefined=False)
# Only now, that netref dependencies have been solve, it is safe to
# perform do_configure in parallel for al testbeds
# (it's internal configuration for each)
+ self._logger.debug("ExperimentController: Starting parallel do_configure")
self._parallel([testbed.do_configure
for testbed in all_restart])
#time.sleep(60)
# cross-connect (cannot be done in parallel)
+ self._logger.debug("ExperimentController: Starting cross-connect")
for guid, testbed in self._testbeds.iteritems():
cross_data = self._get_cross_data(guid)
testbed.do_cross_connect_init(cross_data)
self._clear_caches()
# Last chance to configure (parallel on all testbeds)
+ self._logger.debug("ExperimentController: Starting parallel do_prestart")
self._parallel([testbed.do_prestart
for testbed in all_restart])
self.persist_execute_xml()
# start experiment (parallel start on all testbeds)
+ self._logger.debug("ExperimentController: Starting parallel do_start")
self._parallel([testbed.start
for testbed in all_restart])
# perform the action on all elements, in parallel if so requested
if runner:
- logger.debug("Starting parallel %s", action)
+ logger.debug("TesbedController: Starting parallel %s", action)
runner.start()
for guid in guids[factory_id]:
if runner:
- logger.debug("Scheduling %s on %s", action, guid)
+ logger.debug("TestbedController: Scheduling %s on %s", action, guid)
runner.put(perform_action, guid)
else:
- logger.debug("Performing %s on %s", action, guid)
+ logger.debug("TestbedController: Performing %s on %s", action, guid)
perform_action(guid)
# sync
if poststep:
for guid in guids[factory_id]:
if runner:
- logger.debug("Scheduling post-%s on %s", action, guid)
+ logger.debug("TestbedController: Scheduling post-%s on %s", action, guid)
runner.put(poststep, self, guid)
else:
- logger.debug("Performing post-%s on %s", action, guid)
+ logger.debug("TestbedController: Performing post-%s on %s", action, guid)
poststep(self, guid)
# sync
if runner:
runner.join()
- logger.debug("Finished parallel %s", action)
+ logger.debug("TestbedController: Finished parallel %s", action)
@staticmethod
def do_poststep_preconfigure(self, guid):
cross_connector_type_name,
True)
if connect_code:
+ self._logger.debug("Cross-connect: guid: %d, connect_code: %s " % (
+ guid, repr(connect_code)))
elem_cross_data = cross_data[cross_testbed_guid][cross_guid]
connect_code(self, guid, elem_cross_data)
raise exctyp,exval,exctrace
else:
raise RuntimeError, "Failed to setup application"
+ else:
+ self._logger.info("Setup ready: %s", self)
else:
self.setup()
def to_server_log_level(log_level):
return (
- server.DEBUG_LEVEL
+ DC.DEBUG_LEVEL
if log_level == DC.DEBUG_LEVEL
- else server.ERROR_LEVEL
+ else DC.ERROR_LEVEL
)
def get_access_config_params(access_config):
else access_config.get_attribute_value(DC.DEPLOYMENT_MODE)
launch = True if not access_config \
else not access_config.get_attribute_value(DC.RECOVER)
+ log_level = DC.ERROR_LEVEL if not access_config \
+ else access_config.get_attribute_value(DC.LOG_LEVEL)
+ os.environ["NEPI_CONTROLLER_LOGLEVEL"] = log_level
+
if not mode or mode == DC.MODE_SINGLE_PROCESS:
from nepi.core.execute import ExperimentController
STOP_MSG = "STOP"
-ERROR_LEVEL = 0
-DEBUG_LEVEL = 1
TRACE = os.environ.get("NEPI_TRACE", "false").lower() in ("true", "1", "on")
if hasattr(os, "devnull"):
return rv
class Server(object):
- def __init__(self, root_dir = ".", log_level = ERROR_LEVEL, environment_setup = ""):
+ def __init__(self, root_dir = ".", log_level = DC.ERROR_LEVEL, environment_setup = ""):
self._root_dir = root_dir
self._stop = False
self._ctrl_sock = None
return 1
def post_daemonize(self):
+ os.environ["NEPI_CONTROLLER_LOGLEVEL"] = self._log_level
# QT, for some strange reason, redefines the SIGCHILD handler to write
# a \0 to a fd (lets say fileno 'x'), when ever a SIGCHILD is received.
# Server dameonization closes all file descriptors from fileno '3',
try:
msg = self.recv_msg(conn)
except socket.timeout, e:
- self.log_error()
+ self.log_error("SERVER recv_msg: connection timedout ")
break
if not msg:
return text
def log_debug(self, text):
- if self._log_level == DEBUG_LEVEL:
+ if self._log_level == DC.DEBUG_LEVEL:
date = time.strftime("%Y-%m-%d %H:%M:%S")
sys.stderr.write("DEBUG: %s\n%s\n" % (date, text))