#
import re
-
from types import StringTypes
from PLC.Faults import *
from PLC.Parameter import Parameter
+from PLC.Filter import Filter
from PLC.Table import Row, Table
+from PLC.Nodes import Nodes,Node
+from PLC.Slices import Slices,Slice
+
class Peer (Row):
"""
Stores the list of peering PLCs in the peers table.
'peer_id' : Parameter (int, "Peer identifier"),
'peername' : Parameter (str, "Peer name"),
'peer_url' : Parameter (str, "Peer API url"),
- 'person_id' : Parameter (int, "person_id of the account used to log there"),
- 'foreign_node_ids' : Parameter ([int], "doc")
+ 'person_id' : Parameter (int, "Person_id of the account storing credentials - temporary"),
+ 'node_ids' : Parameter ([int], "This peer's nodes ids"),
+ 'slice_ids' : Parameter ([int], "This peer's slices ids"),
}
def validate_peer_url (self, url):
assert 'peer_id' in self
+ # remove nodes depending on this peer
+ for foreign_node in Nodes (self.api, self['node_ids']):
+ foreign_node.delete(commit)
+
+ # remove the peer
self['deleted'] = True
self.sync(commit)
Maps to the peers table in the database
"""
- def __init__ (self, api, peer_id_or_peername_list = None):
- self.api = api
-
- sql="SELECT %s FROM view_peers WHERE deleted IS False" % \
- ", ".join(Peer.fields)
- if peer_id_or_peername_list:
- peer_ids = [x for x in peer_id_or_peername_list if isinstance(x, (int, long))]
- peernames = [x for x in peer_id_or_peername_list if isinstance(x, StringTypes)]
- sql += " AND (False"
- if peer_ids:
- sql += " OR peer_id in (%s)"% ", ".join([str(i) for i in peer_ids])
- if peernames:
- sql += " OR peername in (%s)"% ". ".join(api.db.quote(peernames)).lower()
- sql += ")"
-
- rows = self.api.db.selectall(sql)
+ def __init__ (self, api, peer_filter = None, columns = None):
+ Table.__init__(self, api, Peer, columns)
- for row in rows:
- self[row['peer_id']] = peer = Peer(api,row)
- for aggregate in ['foreign_node_ids']:
- if not peer.has_key(aggregate) or peer[aggregate] is None:
- peer[aggregate] = []
- else:
- peer[aggregate] = map(int, peer[aggregate].split(','))
+ sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \
+ ", ".join(self.columns)
+ if peer_filter is not None:
+ if isinstance(peer_filter, (list, tuple, set)):
+ # Separate the list into integers and strings
+ ints = filter(lambda x: isinstance(x, (int, long)), peer_filter)
+ strs = filter(lambda x: isinstance(x, StringTypes), peer_filter)
+ peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs})
+ sql += " AND (%s)" % peer_filter.sql(api, "OR")
+ elif isinstance(peer_filter, dict):
+ peer_filter = Filter(Peer.fields, peer_filter)
+ sql += " AND (%s)" % peer_filter.sql(api, "AND")
+ self.selectall(sql)