support for negation with fields starting with ~
[plcapi.git] / PLC / ForeignNodes.py
1 #
2 # Thierry Parmentelat - INRIA
3
4 import time
5
6 from types import StringTypes
7
8 from PLC.Table import Row, Table
9 from PLC.Parameter import Parameter
10 from PLC.Filter import Filter
11
12 class ForeignNode (Row) :
13     """
14     This object stores information about nodes hosted on 
15     other peering instances of myplc
16     """
17
18     table_name = 'nodes'
19     primary_key = 'node_id'
20
21     fields = {
22         'node_id': Parameter (int, "Node Id"),
23         'hostname': Parameter (str, "Node name"),
24         'peer_id': Parameter (str, "Peer id"),
25         'boot_state' : Parameter (str, "Boot state, see Node"),
26         'model' : Parameter (str,"Model, see Node"),
27         'version' : Parameter (str,"Version, see Node"),
28         'date_created': Parameter(int, "Creation time, see Node"),
29         'last_updated': Parameter(int, "Update time, see Node"),
30         'slice_ids': Parameter([int], "List of slices on this node"),
31         }
32
33     def __init__(self,api,fields={},uptodate=True):
34         Row.__init__(self,api,fields)
35         self.uptodate=uptodate
36
37     def validate_date_created(self,timestamp):
38         return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
39
40     def validate_last_updated(self,timestamp):
41         return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
42
43     def purge_peer_node (self,commit=True):
44         sql = "DELETE FROM peer_node WHERE node_id=%d"%self['node_id']
45         self.api.db.do(sql)
46         if commit:
47             self.api.db.commit()
48
49     def delete (self, commit=True):
50         """
51         Delete existing foreign node.
52         """
53         self.purge_peer_node()
54         self['deleted']=True
55         self.sync(commit)
56         
57 class ForeignNodes (Table):
58     def __init__ (self, api, foreign_node_filter = None, columns = None):
59         Table.__init__(self, api, ForeignNode, columns)
60
61         sql = ""
62         sql += "SELECT %s FROM view_foreign_nodes " % ", ".join(self.columns)
63         sql += "WHERE deleted IS False "
64               
65         if foreign_node_filter is not None:
66             if isinstance(foreign_node_filter, (list, tuple, set)):
67                 # Separate the list into integers and strings
68                 ints = filter(lambda x: isinstance(x, (int, long)), foreign_node_filter)
69                 strs = filter(lambda x: isinstance(x, StringTypes), foreign_node_filter)
70                 foreign_node_filter = Filter(ForeignNode.fields, {'node_id': ints, 'hostname': strs})
71                 sql += " AND (%s)" % foreign_node_filter.sql(api, "OR")
72             elif isinstance(foreign_node_filter, dict):
73                 foreign_node_filter = Filter(ForeignNode.fields, foreign_node_filter)
74                 sql += " AND (%s)" % foreign_node_filter.sql(api, "AND")
75
76         self.selectall(sql)
77