first working code for reservations
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Fri, 25 Jun 2010 16:30:36 +0000 (16:30 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Fri, 25 Jun 2010 16:30:36 +0000 (16:30 +0000)
accounts.py
nodemanager.py

index a9461d1..59ecedb 100644 (file)
@@ -142,9 +142,24 @@ If still valid, check if running and configure/start if not."""
             finally: create_sem.release()
         if not isinstance(self._acct, next_class): self._acct = next_class(rec)
         logger.verbose("accounts.ensure_created: %s, running=%r"%(self.name,self.is_running()))
-        if not self.is_running() or next_class != curr_class:
-            self.start(rec)
-        else: self._acct.configure(rec)
+
+        # reservation_alive is set on reervable nodes, and its value is a boolean
+        if 'reservation_alive' in rec:
+            # reservable nodes
+            if rec['reservation_alive']:
+                # this sliver has the lease, it is safe to start it
+                if not self.is_running(): self.start(rec)
+                else: self.configure(rec)
+            else:
+                # not having the lease, do not start it
+                self.configure(rec)
+        # usual nodes - preserve old code
+        # xxx it's not clear what to do when a sliver changes type/class
+        # in a reservable node
+        else:
+            if not self.is_running() or next_class != curr_class:
+                self.start(rec)
+            else: self.configure(rec)
 
     def ensure_destroyed(self): self._destroy(self._get_class())
 
@@ -152,6 +167,9 @@ If still valid, check if running and configure/start if not."""
         self._acct.configure(rec)
         self._acct.start(delay=d)
 
+    def configure(self, rec):
+        self._acct.configure(rec)
+
     def stop(self): self._acct.stop()
 
     def is_running(self):
index 09bb3bb..899bd64 100755 (executable)
@@ -95,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
@@ -110,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__)
@@ -160,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)