an attempt to get more feedback from a node that fails to boot
[plcapi.git] / PLC / LeaseFilter.py
index b66d6a4..df91409 100644 (file)
@@ -2,9 +2,10 @@
 # Thierry Parmentelat -- INRIA
 #
 # Utilities for filtering on leases
-#
 
-from types import StringTypes
+import time
+import calendar
+
 from PLC.Faults import *
 from PLC.Filter import Filter
 from PLC.Parameter import Parameter, Mixed
@@ -36,6 +37,13 @@ class LeaseFilter (Filter):
                 str,  "str_timestamp: leases alive after at that time"),
             Parameter(
                 tuple, "timeslot: the leases alive during this timeslot")),
+        ########## macros
+        # {'day' : 0} : all leases from today and on
+        # {'day' : 1} : all leases today (localtime at the myplc)
+        # {'day' : 2} : all leases today and tomorrow (localtime at the myplc)
+        # etc..
+        'day': Parameter(int, "clip on a number of days from today and on;"
+                         " 0 means no limit in the future"),
     }
 
     def __init__(self, fields={}, filter={},
@@ -74,7 +82,7 @@ class LeaseFilter (Filter):
 
     # hooks for the local fields
     def sql_alive(self, alive):
-        if isinstance(alive, int) or isinstance(alive, StringTypes):
+        if isinstance(alive, int) or isinstance(alive, str):
             # the lease is alive at that time if from <= alive <= until
             alive = LeaseFilter.quote(alive)
             return LeaseFilter.sql_time_in_range(alive, 't_from', 't_until')
@@ -88,7 +96,7 @@ class LeaseFilter (Filter):
                                      .format(alive))
 
     def sql_clip(self, clip):
-        if isinstance(clip, int) or isinstance(clip, StringTypes):
+        if isinstance(clip, int) or isinstance(clip, str):
             start = LeaseFilter.quote(clip)
             return LeaseFilter.sql_timeslot_after('t_from', 't_until', start)
         elif isinstance(clip, tuple):
@@ -100,14 +108,33 @@ class LeaseFilter (Filter):
             raise PLCInvalidArgument("LeaseFilter: clip field {}"
                                      .format(clip))
 
+    # the whole key to implementing day is to compute today's beginning
+    def today_start(self):
+        # a struct_time
+        st = time.localtime()
+        seconds_today = st.tm_hour * 3600 + st.tm_min * 60 + st.tm_sec
+        return int(time.time()) - seconds_today
+
     # supersede the generic Filter 'sql' method
     def sql(self, api, join_with="AND"):
+        # implement 'day' as a clip
+        if 'day' in self:
+            if 'clip' in self:
+                raise PLCInvalidArgument("LeaseFilter cannot have both 'clip' and 'day'")
+            today = self.today_start()
+            nb_days = self['day']
+            if nb_days == 0:
+                self['clip'] = today
+            else:
+                self['clip'] = (today, today + nb_days * 24 * 3600)
+            del self['day']
+
         # preserve locally what belongs to us, hide it from the superclass
         # self.local is a dict    local_key : user_value
         # self.negation is a dict  local_key : string
         self.local = {}
         self.negation = {}
-        for (k, v) in LeaseFilter.local_fields.items():
+        for (k, v) in list(LeaseFilter.local_fields.items()):
             if k in self:
                 self.local[k] = self[k]
                 del self[k]
@@ -118,7 +145,7 @@ class LeaseFilter (Filter):
                 self.negation[k] = "NOT "
         # run the generic filtering code
         (where_part, clip_part) = Filter.sql(self, api, join_with)
-        for (k, v) in self.local.items():
+        for (k, v) in list(self.local.items()):
             try:
                 # locate hook function associated with key
                 method = LeaseFilter.__dict__['sql_' + k]
@@ -126,7 +153,7 @@ class LeaseFilter (Filter):
                               .format(self.join_with,
                                       self.negation[k],
                                       method(self, self.local[k]))
-            except Exception, e:
+            except Exception as e:
                 raise PLCInvalidArgument(
                     "LeaseFilter: something wrong with filter"
                     "key {}, val was {} -- {}".format(k, v, e))