for federation : Peers and ForeignNodes
[plcapi.git] / PLC / Peers.py
1 import re
2
3 from types import StringTypes
4
5 from PLC.Faults import *
6 from PLC.Parameter import Parameter
7 from PLC.Table import Row, Table
8
9 class Peer (Row):
10     """
11     Stores the list of peering PLCs in the peers table. 
12     See the Row class for more details
13     """
14
15     table_name = 'peers'
16     primary_key = 'peer_id'
17     fields = {
18         'peer_id' : Parameter (int, "Peer identifier"),
19         'peername' : Parameter (str, "Peer name"),
20         'peer_url' : Parameter (str, "Peer API url"),
21         'person_id' : Parameter (int, "person_id of the account used to log there"),
22         'foreign_node_ids' : Parameter ([int], "doc")
23         }
24
25     def validate_peer_url (self, url):
26         """
27         Validate URL, checks it looks like https 
28         """
29         invalid_url = PLCInvalidArgument("Invalid URL")
30         if not re.compile ("^https://.*$").match(url) : 
31             raise invalid_url
32         return url
33
34     def delete (self, commit=True):
35         """
36         Delete peer
37         """
38         
39         assert 'peer_id' in self
40
41         self['deleted'] = True
42         self.sync(commit)
43
44 class Peers (Table):
45     """ 
46     Maps to the peers table in the database
47     """
48     
49     def __init__ (self, api, peer_id_or_peername_list = None):
50         self.api = api
51
52         sql="SELECT %s FROM view_peers WHERE deleted IS False" % \
53             ", ".join(Peer.fields)
54         if peer_id_or_peername_list:
55             peer_ids = [x for x in peer_id_or_peername_list if isinstance(x, (int, long))]
56             peernames = [x for x in peer_id_or_peername_list if isinstance(x, StringTypes)]
57             sql += " AND (False"
58             if peer_ids:
59                 sql += " OR peer_id in (%s)"% ", ".join([str(i) for i in peer_ids])
60             if peernames:
61                 sql += " OR peername in (%s)"% ". ".join(api.db.quote(peernames)).lower()
62             sql += ")"
63
64         rows = self.api.db.selectall(sql)
65
66         for row in rows:
67             self[row['peer_id']] = peer = Peer(api,row)
68             for aggregate in ['foreign_node_ids']:
69                 if not peer.has_key(aggregate) or peer[aggregate] is None:
70                     peer[aggregate] = []
71                 else:
72                     peer[aggregate] = map(int, peer[aggregate].split(','))
73
74