federation in progress - associate a local slice to a foreign node
[plcapi.git] / PLC / Peers.py
1 #
2 # Thierry Parmentelat - INRIA
3
4
5 import re
6
7 from types import StringTypes
8
9 from PLC.Faults import *
10 from PLC.Parameter import Parameter
11 from PLC.Table import Row, Table
12
13 class Peer (Row):
14     """
15     Stores the list of peering PLCs in the peers table. 
16     See the Row class for more details
17     """
18
19     table_name = 'peers'
20     primary_key = 'peer_id'
21     fields = {
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 storing credentials - temporary"),
26         'node_ids' : Parameter ([int], "This peer's nodes ids")
27         }
28
29     def validate_peer_url (self, url):
30         """
31         Validate URL, checks it looks like https 
32         """
33         invalid_url = PLCInvalidArgument("Invalid URL")
34         if not re.compile ("^https://.*$").match(url) : 
35             raise invalid_url
36         return url
37
38     def delete (self, commit=True):
39         """
40         Delete peer
41         """
42         
43         assert 'peer_id' in self
44
45         self['deleted'] = True
46         self.sync(commit)
47
48 class Peers (Table):
49     """ 
50     Maps to the peers table in the database
51     """
52     
53     def __init__ (self, api, peer_id_or_peername_list = None):
54         self.api = api
55
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)]
61             sql += " AND (False"
62             if peer_ids:
63                 sql += " OR peer_id in (%s)"% ", ".join([str(i) for i in peer_ids])
64             if peernames:
65                 sql += " OR peername in (%s)"% ". ".join(api.db.quote(peernames)).lower()
66             sql += ")"
67
68         rows = self.api.db.selectall(sql)
69
70         for row in rows:
71             self[row['peer_id']] = peer = Peer(api,row)
72             for aggregate in ['node_ids']:
73                 if not peer.has_key(aggregate) or peer[aggregate] is None:
74                     peer[aggregate] = []
75                 else:
76                     peer[aggregate] = map(int, peer[aggregate].split(','))
77
78