From 0b55e122a86da84ac10f54c3e990b166eb7139ab Mon Sep 17 00:00:00 2001
From: Thierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Date: Fri, 25 Jun 2010 16:30:36 +0000
Subject: [PATCH] first working code for reservations

---
 accounts.py    | 24 +++++++++++++++++++++---
 nodemanager.py | 11 -----------
 2 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/accounts.py b/accounts.py
index a9461d1..59ecedb 100644
--- a/accounts.py
+++ b/accounts.py
@@ -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):
diff --git a/nodemanager.py b/nodemanager.py
index 09bb3bb..899bd64 100755
--- a/nodemanager.py
+++ b/nodemanager.py
@@ -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)
-- 
2.47.0