X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=nodemanager.py;h=7e7dd9dfde38013fced2c633e723346e23caa1bd;hb=f19982a5dd0065e1a6edfb55a93e29a7139ea05a;hp=92b77ae14ea9bb0ccdf51ffcd06baa8e1c3230ee;hpb=778e85877046779bd1a623edb6d4c1f5743bee01;p=nodemanager.git diff --git a/nodemanager.py b/nodemanager.py index 92b77ae..7e7dd9d 100755 --- a/nodemanager.py +++ b/nodemanager.py @@ -1,8 +1,5 @@ #!/usr/bin/python # -# $Id$ -# $URL$ -# # Useful information can be found at https://svn.planet-lab.org/wiki/NodeManager # @@ -18,16 +15,16 @@ import xmlrpclib import socket import os import sys -import resource import glob import pickle +import random +import resource import logger import tools from config import Config from plcapi import PLCAPI -import random class NodeManager: @@ -51,8 +48,6 @@ class NodeManager: parser = optparse.OptionParser() parser.add_option('-d', '--daemon', action='store_true', dest='daemon', default=False, help='run daemonized') - parser.add_option('-s', '--startup', action='store_true', dest='startup', default=False, - help='run all sliver startup scripts') parser.add_option('-f', '--config', action='store', dest='config', default='/etc/planetlab/plc_config', help='PLC configuration file') parser.add_option('-k', '--session', action='store', dest='session', default='/etc/planetlab/session', @@ -79,7 +74,10 @@ class NodeManager: # Deal with plugins directory if os.path.exists(self.options.path): sys.path.append(self.options.path) - plugins = [ os.path.split(os.path.splitext(x)[0])[1] for x in glob.glob( os.path.join(self.options.path,'*.py') ) ] + plugins = [ os.path.split(os.path.splitext(x)[0])[1] + for x in glob.glob( os.path.join(self.options.path,'*.py') ) + if not x.endswith("/__init__.py") + ] self.modules += plugins if self.options.user_module: assert self.options.user_module in self.modules @@ -97,8 +95,6 @@ class NodeManager: self.getPLCDefaults(data, config) # tweak the 'vref' attribute from GetSliceFamily self.setSliversVref (data) - # check leases and adjust the 'alive' field in slivers - self.adjustReservedSlivers (data) # dump it too, so it can be retrieved later in case of comm. failure self.dumpSlivers(data) # log it for debug purposes, no matter what verbose is @@ -112,8 +108,6 @@ class NodeManager: data = {} # for modules that request it though the 'persistent_data' property last_data=self.loadSlivers() - # adjust again with current time - self.adjustReservedSlivers (data) # Invoke GetSlivers() functions from the callback modules for module in self.loaded_modules: logger.verbose('nodemanager: triggering %s.GetSlivers'%module.__name__) @@ -162,13 +156,6 @@ class NodeManager: except: logger.log_exc("nodemanager: Could not overwrite 'vref' attribute from 'GetSliceFamily'",name=sliver['name']) - def adjustReservedSlivers (self, data): - """ - On reservable nodes, tweak the 'alive' field to instruct cyclic loop - about what to do with slivers. - """ - pass - def dumpSlivers (self, slivers): f = open(NodeManager.DB_FILE, "w") logger.log ("nodemanager: saving successfully fetched GetSlivers in %s" % NodeManager.DB_FILE) @@ -212,10 +199,19 @@ If this is not the case, please remove the pid file %s. -- exiting""" % (other_p try: m = __import__(module) logger.verbose("nodemanager: triggering %s.start"%m.__name__) - m.start(self.options, config) + m.start() self.loaded_modules.append(m) except ImportError, err: - print "Warning while loading module %s:" % module, err + logger.log_exc ("ERROR while loading module %s - skipping:" % module) + # if we fail to load any of these, it's really no need to go on any further + if module in NodeManager.core_modules: + logger.log("FATAL : failed to load core module %s"%module) + except AttributeError, err: + # triggered when module doesn't have a 'start' method + logger.log_exc ("ERROR while starting module %s - skipping:" % module) + # if we fail to load any of these, it's really no need to go on any further + if module in NodeManager.core_modules: + logger.log("FATAL : failed to start core module %s"%module) # sort on priority (lower first) def sort_module_priority (m1,m2): @@ -254,10 +250,13 @@ If this is not the case, please remove the pid file %s. -- exiting""" % (other_p while True: # Main nodemanager Loop + work_beg=time.time() logger.log('nodemanager: mainloop - calling GetSlivers - period=%d random=%d'%(iperiod,irandom)) self.GetSlivers(config, plc) delay=iperiod + random.randrange(0,irandom) - logger.log('nodemanager: mainloop - sleeping for %d s'%delay) + work_end=time.time() + work_duration=int(work_end-work_beg) + logger.log('nodemanager: mainloop has worked for %s s - sleeping for %d s'%(work_duration,delay)) time.sleep(delay) except: logger.log_exc("nodemanager: failed in run")