fix coresched locating cgroup and reduce verbosity
[nodemanager.git] / nodemanager.py
index 899bd64..0d3009d 100755 (executable)
@@ -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:
@@ -77,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
@@ -117,6 +117,8 @@ class NodeManager:
                 if getattr(module,'persistent_data',False):
                     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)
 
@@ -174,12 +176,16 @@ 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()
 
             # 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)
@@ -199,10 +205,15 @@ 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)
+                    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):
@@ -241,12 +252,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)
+                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")