cosmetic
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Thu, 10 Jun 2010 17:13:26 +0000 (17:13 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Thu, 10 Jun 2010 17:13:26 +0000 (17:13 +0000)
accounts.py
controller.py
nodemanager.py
plugins/reservation.py
slivermanager.py

index 5bd9b60..2afa333 100644 (file)
@@ -46,7 +46,9 @@ create_sem = threading.Semaphore(1)
 destroy_sem = threading.Semaphore(1)
 
 def register_class(acct_class):
-    """Call once for each account class.  This method adds the class to the dictionaries used to look up account classes by shell and type."""
+    """Call once for each account class. This method adds the class
+to the dictionaries used to look up account classes by shell and
+type."""
     shell_acct_class[acct_class.SHELL] = acct_class
     type_acct_class[acct_class.TYPE] = acct_class
 
index ab8e521..feca5e9 100644 (file)
@@ -4,12 +4,13 @@
 """Delegate accounts are used to provide secure access to the XMLRPC API.  
 They are normal Unix accounts with a shell that tunnels XMLRPC requests to the API server."""
 
-import accounts
-import logger
-import tools
 from pwd import getpwnam
 from grp import getgrnam
 
+import logger
+import tools
+import accounts
+
 class Controller(accounts.Account):
     SHELL = '/usr/bin/forward_api_calls'  # tunneling shell
     TYPE = 'controller.Controller'
index 11be5f9..aca670d 100755 (executable)
@@ -183,7 +183,8 @@ class NodeManager:
             try:
                 other_pid = tools.pid_file()
                 if other_pid != None:
-                    print """There might be another instance of the node manager running as pid %d.  If this is not the case, please remove the pid file %s""" % (other_pid, tools.PID_FILE)
+                    print """There might be another instance of the node manager running as pid %d.
+If this is not the case, please remove the pid file %s. -- exiting""" % (other_pid, tools.PID_FILE)
                     return
             except OSError, err:
                 print "Warning while writing PID file:", err
@@ -250,5 +251,5 @@ def run():
 if __name__ == '__main__':
     run()
 else:
-    # This is for debugging purposes.  Open a copy of Python and import nm
+    # This is for debugging purposes.  Open a copy of Python and import nodemanager
     tools.as_daemon_thread(run)
index ddb974b..d5fdde6 100644 (file)
@@ -64,7 +64,7 @@ class reservation:
 
     def clear_timer (self,timestamp):
         round=self.round_time(timestamp)
-        if self.timers.has_key(round):
+        if round in self.timers:
             timer=self.timers[round]
             timer.cancel()
             del self.timers[round]
@@ -80,7 +80,7 @@ class reservation:
         # forget about past events
         if timestamp < now: return
         round=self.round_time(timestamp)
-        if self.timers.has_key(round): return
+        if round in self.timers: return
         def this_closure ():
             self.round_time_callback (round)
         timer=threading.Timer(timestamp-now,this_closure)
@@ -91,8 +91,27 @@ class reservation:
         now=time.time()
         round_now=self.round_time(now)
         logger.log('reservation.round_time_callback now=%f round_now=%d arg=%d...'%(now,round_now,time_arg))
-        leases_text="leases=%r"%self.data['leases']
-        logger.log(leases_text)
+        leases=self.data.leases
+        if leases:
+            logger.verbose('Listing leases beg')
+            for lease in leases:
+                logger.verbose("lease=%r"%lease)
+            logger.verbose('Listing leases end')
+        for lease in leases:
+            if lease['t_until']==round_now:
+                logger.log('Suspending slice %s - ending lease %d'%(lease['name'],lease['lease_id']))
+                self.suspend_slice (lease['name'])
+        for lease in leases:
+            if lease['t_from']==round_now:
+                logger.log('Starting slice %s - starting lease %d'%(lease['name'],lease['lease_id']))
+                self.restart_slice (lease['name'])
+
+
+    def suspend_slice(self, slicename):
+        logger.log('reservation.suspend_slice, slice %s, to be written'%slicename)
+                
+    def restart_slice(self, slicename):
+        logger.log('reservation.restart_slice, slice %s, to be written'%slicename)
 
     def show_time (self, timestamp):
         return time.strftime ("%Y-%m-%d %H:%M %Z",time.gmtime(timestamp))
index 56f2c48..2122865 100644 (file)
@@ -10,20 +10,20 @@ also to make inter-sliver resource loans.  The sliver manager is also
 responsible for handling delegation accounts.
 """
 
-priority=10
-
 import string,re
 
 import logger
-import accounts
 import api, api_calls
 import database
+import accounts
 import controller
 import sliver_vs
 
 try: from bwlimit import bwmin, bwmax
 except ImportError: bwmin, bwmax = 8, 1000*1000*1000
 
+priority=10
+
 
 DEFAULT_ALLOCATION = {
     'enabled': 1,
@@ -82,7 +82,7 @@ def GetSlivers(data, config = None, plc=None, fullupdate=True):
             if network['is_primary'] and network['bwlimit'] is not None:
                 DEFAULT_ALLOCATION['net_max_rate'] = network['bwlimit'] / 1000
 
-    # Take intscripts (global) returned by API, make dict
+    # Take initscripts (global) returned by API, make dict
     if 'initscripts' not in data:
         logger.log_missing_data("slivermanager.GetSlivers",'initscripts')
         return
@@ -97,9 +97,9 @@ def GetSlivers(data, config = None, plc=None, fullupdate=True):
         rec.setdefault('timestamp', data['timestamp'])
 
         # convert attributes field to a proper dict
-        attr_dict = {}
-        for attr in rec.pop('attributes'): attr_dict[attr['tagname']] = attr['value']
-        rec.setdefault("attributes", attr_dict)
+        attributes = {}
+        for attr in rec.pop('attributes'): attributes[attr['tagname']] = attr['value']
+        rec.setdefault("attributes", attributes)
 
         # squash keys
         keys = rec.pop('keys')
@@ -109,37 +109,37 @@ def GetSlivers(data, config = None, plc=None, fullupdate=True):
         ## instantiation here, but i suppose its the same thing when you think about it. -FA
         # Handle nm-controller here
         if rec['instantiation'].lower() == 'nm-controller':
-            rec.setdefault('type', attr_dict.get('type', 'controller.Controller'))
+            rec.setdefault('type', attributes.get('type', 'controller.Controller'))
         else:
-            rec.setdefault('type', attr_dict.get('type', 'sliver.VServer'))
+            rec.setdefault('type', attributes.get('type', 'sliver.VServer'))
 
         # set the vserver reference.  If none, set to default.
-        rec.setdefault('vref', attr_dict.get('vref', 'default'))
+        rec.setdefault('vref', attributes.get('vref', 'default'))
 
         # set initscripts.  first check if exists, if not, leave empty.
-        is_name = attr_dict.get('initscript')
+        is_name = attributes.get('initscript')
         if is_name is not None and is_name in initscripts:
             rec['initscript'] = initscripts[is_name]
         else:
             rec['initscript'] = ''
 
         # set delegations, if none, set empty
-        rec.setdefault('delegations', attr_dict.get("delegations", []))
+        rec.setdefault('delegations', attributes.get("delegations", []))
 
         # extract the implied rspec
         rspec = {}
         rec['rspec'] = rspec
-        for resname, default_amt in DEFAULT_ALLOCATION.iteritems():
+        for resname, default_amount in DEFAULT_ALLOCATION.iteritems():
             try:
-                t = type(default_amt)
-                amt = t.__new__(t, attr_dict[resname])
-            except (KeyError, ValueError): amt = default_amt
+                t = type(default_amount)
+                amt = t.__new__(t, attributes[resname])
+            except (KeyError, ValueError): amt = default_amount
             rspec[resname] = amt
 
         # add in sysctl attributes into the rspec
-        for key in attr_dict.keys():
+        for key in attributes.keys():
             if key.find("sysctl.") == 0:
-                rspec[key] = attr_dict[key]
+                rspec[key] = attributes[key]
 
         database.db.deliver_record(rec)
     if fullupdate: database.db.set_min_timestamp(data['timestamp'])
@@ -151,8 +151,8 @@ def deliver_ticket(data):
     return GetSlivers(data, fullupdate=False)
 
 def start(options, config):
-    for resname, default_amt in sliver_vs.DEFAULT_ALLOCATION.iteritems():
-        DEFAULT_ALLOCATION[resname]=default_amt
+    for resname, default_amount in sliver_vs.DEFAULT_ALLOCATION.iteritems():
+        DEFAULT_ALLOCATION[resname]=default_amount
         
     accounts.register_class(sliver_vs.Sliver_VS)
     accounts.register_class(controller.Controller)