2 # Thierry Parmentelat - INRIA
7 from types import StringTypes
9 from PLC.Faults import *
10 from PLC.Parameter import Parameter
11 from PLC.Filter import Filter
12 from PLC.Table import Row, Table
16 Stores the list of peering PLCs in the peers table.
17 See the Row class for more details
21 primary_key = 'peer_id'
23 'peer_id' : Parameter (int, "Peer identifier"),
24 'peername' : Parameter (str, "Peer name"),
25 'peer_url' : Parameter (str, "Peer API url"),
26 'person_id' : Parameter (int, "Person_id of the account storing credentials - temporary"),
27 'node_ids' : Parameter ([int], "This peer's nodes ids")
30 def validate_peer_url (self, url):
32 Validate URL, checks it looks like https
34 invalid_url = PLCInvalidArgument("Invalid URL")
35 if not re.compile ("^https://.*$").match(url) :
39 def delete (self, commit=True):
44 assert 'peer_id' in self
46 self['deleted'] = True
51 Maps to the peers table in the database
54 def __init__ (self, api, peer_filter = None):
55 Table.__init__(self, api, Peer)
57 sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \
58 ", ".join(Peer.fields)
60 if peer_filter is not None:
61 if isinstance(peer_filter, list):
62 # Separate the list into integers and strings
63 ints = filter(lambda x: isinstance(x, (int, long)), peer_filter)
64 strs = filter(lambda x: isinstance(x, StringTypes), peer_filter)
65 peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs})
66 sql += " AND (%s)" % peer_filter.sql(api, "OR")
67 elif isinstance(peer_filter, dict):
68 peer_filter = Filter(Peer.fields, peer_filter)
69 sql += " AND (%s)" % peer_filter.sql(api, "AND")