this version uses the first release of Cache.py
[plcapi.git] / PLC / Peers.py
1 #
2 # Thierry Parmentelat - INRIA
3
4
5 import re
6 from types import StringTypes
7
8 from PLC.Faults import *
9 from PLC.Parameter import Parameter
10 from PLC.Filter import Filter
11 from PLC.Table import Row, Table
12
13 from PLC.Nodes import Nodes,Node
14 from PLC.Slices import Slices,Slice
15
16 class Peer (Row):
17     """
18     Stores the list of peering PLCs in the peers table. 
19     See the Row class for more details
20     """
21
22     table_name = 'peers'
23     primary_key = 'peer_id'
24     fields = {
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"),
31         }
32
33     def validate_peer_url (self, url):
34         """
35         Validate URL, checks it looks like https 
36         """
37         invalid_url = PLCInvalidArgument("Invalid URL")
38         if not re.compile ("^https://.*$").match(url) : 
39             raise invalid_url
40         return url
41
42     def delete (self, commit=True):
43         """
44         Delete peer
45         """
46         
47         assert 'peer_id' in self
48
49         # remove nodes depending on this peer
50         for foreign_node in Nodes (self.api, self['node_ids']):
51             foreign_node.delete(commit)
52
53         # remove the peer
54         self['deleted'] = True
55         self.sync(commit)
56
57 class Peers (Table):
58     """ 
59     Maps to the peers table in the database
60     """
61     
62     def __init__ (self, api, peer_filter = None, columns = None):
63         Table.__init__(self, api, Peer, columns)
64
65         sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \
66               ", ".join(self.columns)
67
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")
78
79         self.selectall(sql)