X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Freservation.py;h=985f45eae5915c5f0a7732c03e873d80a566f5ed;hb=08d6f2b70b86a10b222a5afe80945598296196ad;hp=5d3a5208b5c6a2a2bf43994e405a7242eeb1d24a;hpb=f72a39f3429cee1778a355387e205a9f19c35680;p=nodemanager.git diff --git a/plugins/reservation.py b/plugins/reservation.py index 5d3a520..985f45e 100644 --- a/plugins/reservation.py +++ b/plugins/reservation.py @@ -12,6 +12,7 @@ import threading import logger import accounts +import database # there is an implicit assumption that this triggers after slicemanager priority = 45 @@ -19,7 +20,7 @@ priority = 45 # this instructs nodemanager that we want to use the latest known data in case the plc link is down persistent_data = True -# of course things would be simpler if node manager was to create one instance of the plugins +# of course things would be simpler if node manager was to create one instance of the plugins # instead of blindly caling functions in the module... ############################## @@ -29,8 +30,8 @@ def Singleton (klass,*args,**kwds): klass._instance=klass(*args,**kwds) return klass._instance -def start(options, conf): - return Singleton(reservation).start(options,conf) +def start(): + return Singleton(reservation).start() def GetSlivers(data, conf = None, plc = None): return Singleton(reservation).GetSlivers(data, conf, plc) @@ -46,21 +47,21 @@ class reservation: self.data = None # this is a dict mapping a raounded timestamp to the corr. Timer object self.timers = {} - + #################### - def start(self,options,conf): + def start(self): logger.log("reservation: plugin performing dummy start...") - # this method is entirely about making sure that we have events scheduled + # this method is entirely about making sure that we have events scheduled # at the intervals where there is a lease that starts or ends def GetSlivers (self, data, conf=None, plc=None): - + # check we're using a compliant GetSlivers - if 'reservation_policy' not in data: + if 'reservation_policy' not in data: logger.log_missing_data("reservation.GetSlivers",'reservation_policy') return reservation_policy=data['reservation_policy'] - if 'leases' not in data: + if 'leases' not in data: logger.log_missing_data("reservation.GetSlivers",'leases') return @@ -77,7 +78,7 @@ class reservation: # at this point we have reservation_policy in ['lease_or_idle','lease_or_shared'] # we make no difference for now logger.verbose('reservation.GetSlivers : reservable node -- listing timers ') - + self.sync_timers_from_leases() if reservation.debug: self.list_timers() @@ -128,7 +129,7 @@ class reservation: self.timers[round]=timer timer.start() - + @staticmethod def time_printable (timestamp): return time.strftime ("%Y-%m-%d %H:%M UTC",time.gmtime(timestamp)) @@ -184,10 +185,24 @@ class reservation: else: logger.log("reservation.granularity_callback: mmh, the sliver is unexpectedly not running, starting it...") self.restart_slice(slicename) + return # otherwise things are simple - if ending_lease: self.suspend_slice (ending_lease['name']) - if starting_lease: self.restart_slice (starting_lease['name']) + if ending_lease: + self.suspend_slice (ending_lease['name']) + if not starting_lease: + logger.log("'lease_or_shared' is xxx todo - would restart to shared mode") + # only lease_or_idle available : we freeze the box + self.suspend_all_slices() + else: + self.restart_slice(starting_lease['name']) + return + + # no ending, just one starting + logger.log("'lease_or_shared' is xxx todo - would stop shared mode") + # in lease_or_idle, all it takes is restart the sliver + self.restart_slice (starting_lease['name']) + return def debug_box(self,message,slicename=None): if reservation.debug: @@ -195,14 +210,14 @@ class reservation: logger.log_call( ['/usr/sbin/vserver-stat', ] ) if slicename: logger.log_call ( ['/usr/sbin/vserver',slicename,'status', ]) - + def is_running (self, slicename): try: return accounts.get(slicename).is_running() except: return False - # quick an d dirty - this does not obey the accounts/sliver_vs/controller hierarchy + # quick an d dirty - this does not obey the accounts/sliver_vs/controller hierarchy def suspend_slice(self, slicename): logger.log('reservation: Suspending slice %s'%(slicename)) self.debug_box('before suspending',slicename) @@ -214,21 +229,31 @@ class reservation: logger.log_exc("reservation.suspend_slice: Could not stop slice %s through its worker"%slicename) # we hope the status line won't return anything self.debug_box('after suspending',slicename) - + + def suspend_all_slices (self): + for sliver in self.data['slivers']: + # is this a system sliver ? + system_slice=False + for d in sliver['attributes']: + if d['tagname']=='system' and d['value'] : system_slice=True + if not system_slice: + self.suspend_slice(sliver['name']) + def restart_slice(self, slicename): logger.log('reservation: Restarting slice %s'%(slicename)) self.debug_box('before restarting',slicename) worker=accounts.get(slicename) try: # dig in self.data to retrieve corresponding rec - slivers = [ sliver for sliver in self.data.slivers if sliver['name']==slicename ] + slivers = [ sliver for sliver in self.data['slivers'] if sliver['name']==slicename ] sliver=slivers[0] - - # + record=database.db.get(slicename) + record['enabled']=True + # logger.verbose("reservation: Located worker object %r"%worker) - worker.start(rec) + logger.verbose("reservation: Located record at the db %r"%record) + worker.start(record) except: logger.log_exc("reservation.restart_slice: Could not start slice %s through its worker"%slicename) # we hope the status line won't return anything self.debug_box('after restarting',slicename) -