2 # the nodes standing on peer plc's
7 from types import StringTypes
9 from PLC.Table import Row, Table
10 from PLC.Parameter import Parameter
12 class ForeignNode (Row) :
14 This object stores information about nodes hosted on
15 other peering instances of myplc
18 table_name = 'foreign_nodes'
19 primary_key = 'foreign_node_id'
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"),
28 def __init__(self,api,fields={},uptodate=True):
29 Row.__init__(self,api,fields)
30 self.uptodate=uptodate
32 class ForeignNodes (Table):
34 def __init__ (self, api, foreign_node_id_or_peername_list=None):
38 # must qualify fields because peer_id otherwise gets ambiguous
39 fields = ["foreign_nodes.%s"%x for x in ForeignNode.fields]
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 "
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)]
50 if foreign_node_id_list:
51 sql += " OR foreign_node_id in (%s)" % ", ".join([str(i) for i in foreign_node_id_list])
53 ## figure how to retrieve peer_id from the peername(s)
54 sql += " OR peername IN (%s)" % ", ".join(api.db.quote(peername_list))
57 rows = self.api.db.selectall (sql)
60 self[row['hostname']] = ForeignNode (api,row)