selection on foreign nodes : either on id or hostname, undoes selection on peername
[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
10 class ForeignNode (Row) :
11     """
12     This object stores information about nodes hosted on 
13     other peering instances of myplc
14     """
15
16     table_name = 'foreign_nodes'
17     primary_key = 'foreign_node_id'
18
19     fields = {
20         'foreign_node_id': Parameter (int, "Foreign Node Id"),
21         'hostname': Parameter (str, "Node name"),
22         'boot_state' : Parameter (str, "Boot state"),
23         'peer_id': Parameter (str, "Peer id"),
24         }
25
26     def __init__(self,api,fields={},uptodate=True):
27         Row.__init__(self,api,fields)
28         self.uptodate=uptodate
29
30 class ForeignNodes (Table):
31
32     def __init__ (self, api, foreign_node_id_or_hostname_list=None):
33
34         self.api=api
35
36         sql =""
37         sql += "SELECT %s FROM foreign_nodes " % ", ".join(ForeignNode.fields)
38         sql += "WHERE foreign_nodes.deleted IS False " 
39
40         if foreign_node_id_or_hostname_list:
41             foreign_node_id_list = [ str(x) for x in foreign_node_id_or_hostname_list 
42                                      if isinstance(x, (int,long))]
43             hostname_list = [ x for x in foreign_node_id_or_hostname_list
44                               if isinstance(x, StringTypes)]
45             sql += " AND (False"
46             if foreign_node_id_list:
47                 sql += " OR foreign_node_id in (%s)" % ", ".join(foreign_node_id_list)
48             if hostname_list:
49                 ## figure how to retrieve peer_id from the hostname(s)
50                 sql += " OR hostname IN (%s)" % ", ".join(api.db.quote(hostname_list))
51             sql += ")"
52
53         rows = self.api.db.selectall (sql)
54
55         for row in rows:
56             self[row['hostname']] = ForeignNode (api,row)
57
58
59