X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FPeers.py;h=c272a2acc15358f8e39419d9f3b89c13ec9f588b;hb=19d4a01ccf66af9e00914351b3eacd5fc880f988;hp=e2f91d59d88c1efc1f102ab06a9b254234060ecc;hpb=a3e1d5cf38dc9000ed735d61a2ae9603e0bfdc9c;p=plcapi.git diff --git a/PLC/Peers.py b/PLC/Peers.py index e2f91d5..c272a2a 100644 --- a/PLC/Peers.py +++ b/PLC/Peers.py @@ -1,14 +1,14 @@ -# $Id$ -# $URL$ # # Thierry Parmentelat - INRIA -# +# import re from types import StringTypes +import traceback from urlparse import urlparse import PLC.Auth +from PLC.Logger import logger from PLC.Faults import * from PLC.Namespace import hostname_to_hrn from PLC.Parameter import Parameter, Mixed @@ -25,7 +25,7 @@ from PLC.Slices import Slice, Slices class Peer(Row): """ - Stores the list of peering PLCs in the peers table. + Stores the list of peering PLCs in the peers table. See the Row class for more details """ @@ -46,7 +46,7 @@ class Peer(Row): 'key_ids': Parameter([int], "List of keys for which this peer is authoritative"), 'node_ids': Parameter([int], "List of nodes for which this peer is authoritative"), 'slice_ids': Parameter([int], "List of slices for which this peer is authoritative"), - } + } def validate_peername(self, peername): if not len(peername): @@ -69,8 +69,8 @@ class Peer(Row): raise PLCInvalidArgument, "Peer URL scheme must be https" if path[-1] != '/': raise PLCInvalidArgument, "Peer URL should end with /" - - return url + + return url def delete(self, commit = True): """ @@ -109,7 +109,7 @@ class Peer(Row): """ Unassociate a site with this peer. """ - + remove = Row.remove_object(Site, 'peer_site') remove(self, site, commit) @@ -124,12 +124,12 @@ class Peer(Row): 'person_id': person['person_id'], 'peer_person_id': peer_person_id}, commit = commit) - + def remove_person(self, person, commit = True): """ Unassociate a site with this peer. """ - + remove = Row.remove_object(Person, 'peer_person') remove(self, person, commit) @@ -149,7 +149,7 @@ class Peer(Row): """ Unassociate a key with this peer. """ - + remove = Row.remove_object(Key, 'peer_key') remove(self, key, commit) @@ -165,23 +165,26 @@ class Peer(Row): 'peer_node_id': peer_node_id}, commit = commit) - # attempt to manually update the 'hrn' tag - root_auth = self['hrn_root'] sites = Sites(self.api, node['site_id'], ['login_base']) site = sites[0] login_base = site['login_base'] - hrn = hostname_to_hrn(root_auth, login_base, node['hostname']) - tags = {'hrn': hrn} - Node(self.api, node).update_tags(tags) + try: + # attempt to manually update the 'hrn' tag with the remote prefix + hrn_root = self['hrn_root'] + hrn = hostname_to_hrn(hrn_root, login_base, node['hostname']) + tags = {'hrn': hrn} + Node(self.api, node).update_tags(tags) + except: + logger.exception("Could not find out hrn on hostname=%s"%node['hostname']) def remove_node(self, node, commit = True): """ Unassociate a node with this peer. """ - + remove = Row.remove_object(Node, 'peer_node') remove(self, node, commit) - # attempt to manually update the 'hrn' tag + # attempt to manually update the 'hrn' tag now that the node is local root_auth = self.api.config.PLC_HRN_ROOT sites = Sites(self.api, node['site_id'], ['login_base']) site = sites[0] @@ -274,14 +277,14 @@ class Peer(Row): raise AttributeError, "type object 'Peer' has no attribute '%s'" % attr class Peers (Table): - """ + """ Maps to the peers table in the database """ - + def __init__ (self, api, peer_filter = None, columns = None): Table.__init__(self, api, Peer, columns) - sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \ + sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \ ", ".join(self.columns) if peer_filter is not None: @@ -294,5 +297,13 @@ class Peers (Table): elif isinstance(peer_filter, dict): peer_filter = Filter(Peer.fields, peer_filter) sql += " AND (%s) %s" % peer_filter.sql(api, "AND") + elif isinstance(peer_filter, (int, long)): + peer_filter = Filter(Peer.fields, {'peer_id': peer_filter}) + sql += " AND (%s) %s" % peer_filter.sql(api, "AND") + elif isinstance(peer_filter, StringTypes): + peer_filter = Filter(Peer.fields, {'peername': peer_filter}) + sql += " AND (%s) %s" % peer_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong peer filter %r"%peer_filter - self.selectall(sql) + self.selectall(sql)