2 # Thierry Parmentelat - INRIA
6 from types import StringTypes
8 from PLC.Faults import *
9 from PLC.Parameter import Parameter
10 from PLC.Filter import Filter
11 from PLC.Table import Row, Table
13 from PLC.Nodes import Nodes,Node
14 from PLC.Slices import Slices,Slice
18 Stores the list of peering PLCs in the peers table.
19 See the Row class for more details
23 primary_key = 'peer_id'
25 'peer_id' : Parameter (int, "Peer identifier"),
26 'peername' : Parameter (str, "Peer name"),
27 'peer_url' : Parameter (str, "Peer API url"),
28 'person_id' : Parameter (int, "Person_id of the account storing credentials - temporary"),
29 'node_ids' : Parameter ([int], "This peer's nodes ids"),
30 'slice_ids' : Parameter ([int], "This peer's slices ids"),
33 def validate_peer_url (self, url):
35 Validate URL, checks it looks like https
37 invalid_url = PLCInvalidArgument("Invalid URL")
38 if not re.compile ("^https://.*$").match(url) :
42 def delete (self, commit=True):
47 assert 'peer_id' in self
49 # remove nodes depending on this peer
50 for foreign_node in Nodes (self.api, self['node_ids']):
51 foreign_node.delete(commit)
54 self['deleted'] = True
59 Maps to the peers table in the database
62 def __init__ (self, api, peer_filter = None, columns = None):
63 Table.__init__(self, api, Peer, columns)
65 sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \
66 ", ".join(self.columns)
68 if peer_filter is not None:
69 if isinstance(peer_filter, (list, tuple, set)):
70 # Separate the list into integers and strings
71 ints = filter(lambda x: isinstance(x, (int, long)), peer_filter)
72 strs = filter(lambda x: isinstance(x, StringTypes), peer_filter)
73 peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs})
74 sql += " AND (%s)" % peer_filter.sql(api, "OR")
75 elif isinstance(peer_filter, dict):
76 peer_filter = Filter(Peer.fields, peer_filter)
77 sql += " AND (%s)" % peer_filter.sql(api, "AND")