First draft for leases
[plcapi.git] / PLC / Leases.py
1 #
2 # Functions for interacting with the leases table in the database
3 #
4 # $Id$
5 # $URL$
6 # Thierry Parmentelat -- INRIA
7 #
8
9 from datetime import datetime
10
11 from PLC.Faults import *
12 from PLC.Parameter import Parameter, Mixed
13 from PLC.Filter import Filter
14 from PLC.Table import Row, Table
15 from PLC.Nodes import Node, Nodes
16 from PLC.Slices import Slice, Slices
17 from PLC.LeaseFilter import LeaseFilter
18 from PLC.Timestamp import Timestamp
19
20 class Lease(Row):
21     """
22     Representation of a row in the leases table. To use, optionally
23     instantiate with a dict of values. Update as you would a
24     dict. Commit to the database with sync().
25     """
26
27     table_name = 'leases'
28     primary_key = 'lease_id'
29     join_tables = [ ]
30     fields = {
31         # native
32         'lease_id': Parameter(int, "Lease identifier"),
33         't_from': Timestamp.Parameter("timeslot start"),
34         't_until': Timestamp.Parameter("timeslot end"),
35         'node_id': Node.fields['node_id'],
36         'slice_id': Slice.fields['slice_id'],
37
38         # derived
39         'hostname': Node.fields['hostname'],
40         'node_type': Node.fields['node_type'],
41         'name': Slice.fields['name'],
42         'site_id': Slice.fields['site_id'],
43         'duration': Parameter(int, "duration in seconds"),
44         'expired' : Parameter(bool, "time slot is over"),
45         }
46
47     related_fields = { }
48
49     # leases do not have arbitrary boundaries
50     # f_from and t_until are rounded to this period of time
51     # initial model is one hour
52     granularity = 60*60
53
54     def validate_time (self, timestamp, round_up):
55         # convert to long
56         timestamp = Timestamp.cast_long(timestamp)
57         # the trick for rounding up rather than down
58         if round_up: timestamp += (Lease.granularity-1)
59         # round down
60         timestamp = (timestamp/Lease.granularity) * Lease.granularity
61         # return a SQL string
62         return Timestamp.sql_validate_utc(timestamp)
63
64     # round UP 
65     def validate_t_from(self,timestamp):
66         return self.validate_time (timestamp, round_up=True)
67     # round DOWN 
68     def validate_t_until (self, timestamp):
69         return self.validate_time (timestamp, round_up=False)
70
71 class Leases(Table):
72     """
73     Representation of row(s) from the leases table in the
74     database.
75     """
76
77     def __init__(self, api, lease_filter = None, columns = None):
78         Table.__init__(self, api, Lease, columns)
79
80         # the view that we're selecting upon: start with view_leases
81         view = "view_leases"
82         sql = "SELECT %s FROM %s WHERE true" % (", ".join(self.columns.keys()),view)
83
84
85         if lease_filter is not None:
86
87             if isinstance (lease_filter, int):
88                 lease_filter = Filter (Lease.fields, {'lease_id': lease_filter})
89             elif isinstance(lease_filter, (list, tuple, set)):
90                 lease_filter = Filter(Lease.fields, {'lease_id': lease_filter})
91             elif isinstance(lease_filter, dict):
92                 lease_filter = LeaseFilter(Lease.fields, lease_filter)
93             else:
94                 raise PLCInvalidArgument, "Wrong lease filter %r"%lease_filter
95             sql += " AND (%s) %s" % lease_filter.sql(api)
96
97         self.selectall(sql)