X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=nodemanager.py;h=d0bd7fbc87e7ba5af9540eb7e06aae2bb12a5732;hb=44e352eb6f5b0e1706234df9ade2f475fc75d9b7;hp=899bd64033c12354c5cd6df9e8aec249e8bea650;hpb=0b55e122a86da84ac10f54c3e990b166eb7139ab;p=nodemanager.git diff --git a/nodemanager.py b/nodemanager.py index 899bd64..d0bd7fb 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: @@ -40,11 +37,11 @@ class NodeManager: # NOTE: modules listed here will also be loaded in this order # once loaded, they get re-ordered after their priority (lower comes first) # for determining the runtime order - core_modules=['net', 'conf_files', 'slivermanager', 'bwmon'] + core_modules = ['net', 'conf_files', 'slivermanager', 'bwmon'] - default_period=600 - default_random=301 - default_priority=100 + default_period = 600 + default_random = 301 + default_priority = 100 def __init__ (self): @@ -77,11 +74,14 @@ 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 - self.modules=[self.options.user_module] + self.modules = [self.options.user_module] logger.verbose('nodemanager: Running single module %s'%self.options.user_module) @@ -100,23 +100,25 @@ class NodeManager: # log it for debug purposes, no matter what verbose is logger.log_slivers(data) logger.verbose("nodemanager: Sync w/ PLC done") - last_data=data + last_data = data except: logger.log_exc("nodemanager: failed in GetSlivers") # XXX So some modules can at least boostrap. logger.log("nodemanager: Can't contact PLC to GetSlivers(). Continuing.") data = {} # for modules that request it though the 'persistent_data' property - last_data=self.loadSlivers() + last_data = self.loadSlivers() # Invoke GetSlivers() functions from the callback modules for module in self.loaded_modules: logger.verbose('nodemanager: triggering %s.GetSlivers'%module.__name__) try: callback = getattr(module, 'GetSlivers') - module_data=data + module_data = data if getattr(module,'persistent_data',False): - module_data=last_data + module_data = last_data callback(data, config, plc) + except SystemExit as e: + sys.exit(e) except: logger.log_exc("nodemanager: GetSlivers failed to run callback for module %r"%module) @@ -126,7 +128,7 @@ class NodeManager: Get PLC wide defaults from _default system slice. Adds them to config class. """ for slice in data.get('slivers'): - if slice['name'] == config.PLC_SLICE_PREFIX+"_default": + if slice['name'] == config.PLC_SLICE_PREFIX + "_default": attr_dict = {} for attr in slice.get('attributes'): attr_dict[attr['tagname']] = attr['value'] if len(attr_dict): @@ -147,14 +149,15 @@ class NodeManager: # It is safe to override the attributes with this, as this method has the right logic for sliver in data.get('slivers'): try: - slicefamily=sliver.get('GetSliceFamily') + slicefamily = sliver.get('GetSliceFamily') for att in sliver['attributes']: - if att['tagname']=='vref': - att['value']=slicefamily + if att['tagname'] == 'vref': + att['value'] = slicefamily continue sliver['attributes'].append({ 'tagname':'vref','value':slicefamily}) except: - logger.log_exc("nodemanager: Could not overwrite 'vref' attribute from 'GetSliceFamily'",name=sliver['name']) + logger.log_exc("nodemanager: Could not overwrite 'vref' attribute from 'GetSliceFamily'", + name=sliver['name']) def dumpSlivers (self, slivers): f = open(NodeManager.DB_FILE, "w") @@ -174,12 +177,17 @@ class NodeManager: return {} def run(self): + # make sure to create /etc/planetlab/virt so others can read that + # used e.g. in vsys-scripts's sliceip + tools.get_node_virt() try: - if self.options.daemon: tools.daemon() + if self.options.daemon: + tools.daemon() # set log level if (self.options.verbose): logger.set_level(logger.LOG_VERBOSE) + tools.init_signals() # Load /etc/planetlab/plc_config config = Config(self.options.config) @@ -198,14 +206,19 @@ If this is not the case, please remove the pid file %s. -- exiting""" % (other_p for module in self.modules: try: m = __import__(module) - logger.verbose("nodemanager: triggering %s.start"%m.__name__) - m.start(self.options, config) + logger.verbose("nodemanager: triggering %s.start" % m.__name__) + try: m.start() + except: logger.log("WARNING: module %s did not start") self.loaded_modules.append(m) - except ImportError, err: - print "Warning while loading module %s:" % module, err + except: + if module not in NodeManager.core_modules: + logger.log_exc ("ERROR while loading module %s - skipped" % module) + else: + logger.log("FATAL : failed to start core module %s"%module) + sys.exit(1) # sort on priority (lower first) - def sort_module_priority (m1,m2): + def sort_module_priority (m1, m2): return getattr(m1,'priority',NodeManager.default_priority) - getattr(m2,'priority',NodeManager.default_priority) self.loaded_modules.sort(sort_module_priority) @@ -221,8 +234,8 @@ If this is not the case, please remove the pid file %s. -- exiting""" % (other_p # get random periods - iperiod=int(self.options.period) - irandom=int(self.options.random) + iperiod = int(self.options.period) + irandom = int(self.options.random) # Initialize XML-RPC client plc = PLCAPI(config.plc_api_uri, config.cacert, session, timeout=iperiod/2) @@ -241,12 +254,18 @@ 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) + delay = iperiod + random.randrange(0,irandom) + 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") + except SystemExit: + pass + except: + logger.log_exc("nodemanager: failed in run") def run(): logger.log("======================================== Entering nodemanager.py")