2 # Thierry Parmentelat - INRIA
7 from types import StringTypes
9 from PLC.Faults import *
10 from PLC.Parameter import Parameter
11 from PLC.Table import Row, Table
15 Stores the list of peering PLCs in the peers table.
16 See the Row class for more details
20 primary_key = 'peer_id'
22 'peer_id' : Parameter (int, "Peer identifier"),
23 'peername' : Parameter (str, "Peer name"),
24 'peer_url' : Parameter (str, "Peer API url"),
25 'person_id' : Parameter (int, "person_id of the account used to log there"),
26 'foreign_node_ids' : Parameter ([int], "doc")
29 def validate_peer_url (self, url):
31 Validate URL, checks it looks like https
33 invalid_url = PLCInvalidArgument("Invalid URL")
34 if not re.compile ("^https://.*$").match(url) :
38 def delete (self, commit=True):
43 assert 'peer_id' in self
45 self['deleted'] = True
50 Maps to the peers table in the database
53 def __init__ (self, api, peer_id_or_peername_list = None):
56 sql="SELECT %s FROM view_peers WHERE deleted IS False" % \
57 ", ".join(Peer.fields)
58 if peer_id_or_peername_list:
59 peer_ids = [x for x in peer_id_or_peername_list if isinstance(x, (int, long))]
60 peernames = [x for x in peer_id_or_peername_list if isinstance(x, StringTypes)]
63 sql += " OR peer_id in (%s)"% ", ".join([str(i) for i in peer_ids])
65 sql += " OR peername in (%s)"% ". ".join(api.db.quote(peernames)).lower()
68 rows = self.api.db.selectall(sql)
71 self[row['peer_id']] = peer = Peer(api,row)
72 for aggregate in ['foreign_node_ids']:
73 if not peer.has_key(aggregate) or peer[aggregate] is None:
76 peer[aggregate] = map(int, peer[aggregate].split(','))