--- /dev/null
+#
+# Functions for interacting with the leases table in the database
+#
+# $Id$
+# $URL$
+# Thierry Parmentelat -- INRIA
+#
+
+from datetime import datetime
+
+from PLC.Faults import *
+from PLC.Parameter import Parameter, Mixed
+from PLC.Filter import Filter
+from PLC.Table import Row, Table
+from PLC.Nodes import Node, Nodes
+from PLC.Slices import Slice, Slices
+from PLC.LeaseFilter import LeaseFilter
+from PLC.Timestamp import Timestamp
+
+class Lease(Row):
+ """
+ Representation of a row in the leases table. To use, optionally
+ instantiate with a dict of values. Update as you would a
+ dict. Commit to the database with sync().
+ """
+
+ table_name = 'leases'
+ primary_key = 'lease_id'
+ join_tables = [ ]
+ fields = {
+ # native
+ 'lease_id': Parameter(int, "Lease identifier"),
+ 't_from': Timestamp.Parameter("timeslot start"),
+ 't_until': Timestamp.Parameter("timeslot end"),
+ 'node_id': Node.fields['node_id'],
+ 'slice_id': Slice.fields['slice_id'],
+
+ # derived
+ 'hostname': Node.fields['hostname'],
+ 'node_type': Node.fields['node_type'],
+ 'name': Slice.fields['name'],
+ 'site_id': Slice.fields['site_id'],
+ 'duration': Parameter(int, "duration in seconds"),
+ 'expired' : Parameter(bool, "time slot is over"),
+ }
+
+ related_fields = { }
+
+ # leases do not have arbitrary boundaries
+ # f_from and t_until are rounded to this period of time
+ # initial model is one hour
+ granularity = 60*60
+
+ def validate_time (self, timestamp, round_up):
+ # convert to long
+ timestamp = Timestamp.cast_long(timestamp)
+ # the trick for rounding up rather than down
+ if round_up: timestamp += (Lease.granularity-1)
+ # round down
+ timestamp = (timestamp/Lease.granularity) * Lease.granularity
+ # return a SQL string
+ return Timestamp.sql_validate_utc(timestamp)
+
+ # round UP
+ def validate_t_from(self,timestamp):
+ return self.validate_time (timestamp, round_up=True)
+ # round DOWN
+ def validate_t_until (self, timestamp):
+ return self.validate_time (timestamp, round_up=False)
+
+class Leases(Table):
+ """
+ Representation of row(s) from the leases table in the
+ database.
+ """
+
+ def __init__(self, api, lease_filter = None, columns = None):
+ Table.__init__(self, api, Lease, columns)
+
+ # the view that we're selecting upon: start with view_leases
+ view = "view_leases"
+ sql = "SELECT %s FROM %s WHERE true" % (", ".join(self.columns.keys()),view)
+
+
+ if lease_filter is not None:
+
+ if isinstance (lease_filter, int):
+ lease_filter = Filter (Lease.fields, {'lease_id': lease_filter})
+ elif isinstance(lease_filter, (list, tuple, set)):
+ lease_filter = Filter(Lease.fields, {'lease_id': lease_filter})
+ elif isinstance(lease_filter, dict):
+ lease_filter = LeaseFilter(Lease.fields, lease_filter)
+ else:
+ raise PLCInvalidArgument, "Wrong lease filter %r"%lease_filter
+ sql += " AND (%s) %s" % lease_filter.sql(api)
+
+ self.selectall(sql)