- re-enable return_fields specification
[plcapi.git] / PLC / ForeignNodes.py
1 #
2 # Thierry Parmentelat - INRIA
3
4
5 from types import StringTypes
6
7 from PLC.Table import Row, Table
8 from PLC.Parameter import Parameter
9 from PLC.Filter import Filter
10
11 class ForeignNode (Row) :
12     """
13     This object stores information about nodes hosted on 
14     other peering instances of myplc
15     """
16
17     table_name = 'nodes'
18     primary_key = 'node_id'
19
20     fields = {
21         'node_id': Parameter (int, "Node Id"),
22         'hostname': Parameter (str, "Node name"),
23         'peer_id': Parameter (str, "Peer id"),
24         'boot_state' : Parameter (str, "Boot state, see Node"),
25         'model' : Parameter (str,"Model, see Node"),
26         'version' : Parameter (str,"Version, see Node"),
27         'date_created': Parameter(int, "Creation time, see Node"),
28         'last_updated': Parameter(int, "Update time, see Node"),
29         }
30
31     def __init__(self,api,fields={},uptodate=True):
32         Row.__init__(self,api,fields)
33         self.uptodate=uptodate
34
35     def delete (self, commit=True):
36         """
37         Delete existing foreign node.
38         """
39         print 'in ForeignNode::delete',self
40         self['deleted']=True
41         self.sync(commit)
42         
43
44 class ForeignNodes (Table):
45     def __init__ (self, api, foreign_node_filter = None, columns = None):
46         Table.__init__(self, api, ForeignNode, columns)
47
48         sql = "SELECT %s FROM view_foreign_nodes WHERE deleted IS False" % \
49               ", ".join(self.columns)
50
51         if foreign_node_filter is not None:
52             if isinstance(foreign_node_filter, (list, tuple, set)):
53                 # Separate the list into integers and strings
54                 ints = filter(lambda x: isinstance(x, (int, long)), foreign_node_filter)
55                 strs = filter(lambda x: isinstance(x, StringTypes), foreign_node_filter)
56                 foreign_node_filter = Filter(ForeignNode.fields, {'node_id': ints, 'hostname': strs})
57                 sql += " AND (%s)" % foreign_node_filter.sql(api, "OR")
58             elif isinstance(foreign_node_filter, dict):
59                 foreign_node_filter = Filter(ForeignNode.fields, foreign_node_filter)
60                 sql += " AND (%s)" % foreign_node_filter.sql(api, "AND")
61
62         self.selectall(sql)