for federation : Peers and ForeignNodes
[plcapi.git] / PLC / ForeignNodes.py
1 #
2 # the nodes standing on peer plc's
3 #
4 # Thierry Parmentelat
5
6
7 from types import StringTypes
8
9 from PLC.Table import Row, Table
10 from PLC.Parameter import Parameter
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 = 'foreign_nodes'
19     primary_key = 'foreign_node_id'
20
21     fields = {
22         'foreign_node_id': Parameter (int, "Foreign Node Id"),
23         'hostname': Parameter (str, "Node name"),
24         'boot_state' : Parameter (str, "Boot state"),
25         'peer_id': Parameter (str, "Peer id"),
26         }
27
28     def __init__(self,api,fields={},uptodate=True):
29         Row.__init__(self,api,fields)
30         self.uptodate=uptodate
31
32 class ForeignNodes (Table):
33
34     def __init__ (self, api, foreign_node_id_or_peername_list=None):
35
36         self.api=api
37
38         # must qualify fields because peer_id otherwise gets ambiguous
39         fields = ["foreign_nodes.%s"%x for x in ForeignNode.fields]
40                   
41         sql =""
42         sql += "SELECT %s FROM foreign_nodes, peers " % ", ".join(fields)
43         sql += "WHERE foreign_nodes.peer_id=peers.peer_id "
44         sql += "AND foreign_nodes.deleted IS False " 
45
46         if foreign_node_id_or_peername_list:
47             foreign_node_id_list = [ x for x in foreign_node_id_or_peername_list if isinstance(x, (int,long))]
48             peername_list = [ x for x in foreign_node_id_or_peername_list if isinstance(x, StringTypes)]
49             sql += " AND (False"
50             if foreign_node_id_list:
51                 sql += " OR foreign_node_id in (%s)" % ", ".join([str(i) for i in foreign_node_id_list])
52             if peername_list:
53                 ## figure how to retrieve peer_id from the peername(s)
54                 sql += " OR peername IN (%s)" % ", ".join(api.db.quote(peername_list))
55             sql += ")"
56
57         rows = self.api.db.selectall (sql)
58
59         for row in rows:
60             self[row['hostname']] = ForeignNode (api,row)
61
62
63