trying out the hint from github issue
[plcapi.git] / PLC / Peers.py
index b2cb738..bab43f6 100644 (file)
@@ -1,30 +1,31 @@
-# $Id$
-# $URL$
 #
 # Thierry Parmentelat - INRIA
 #
 # Thierry Parmentelat - INRIA
-# 
+#
 
 import re
 from types import StringTypes
 
 import re
 from types import StringTypes
+import traceback
 from urlparse import urlparse
 
 from urlparse import urlparse
 
+import PLC.Auth
+from PLC.Debug import log
 from PLC.Faults import *
 from PLC.Faults import *
+from PLC.Namespace import hostname_to_hrn
 from PLC.Parameter import Parameter, Mixed
 from PLC.Filter import Filter
 from PLC.Table import Row, Table
 from PLC.Parameter import Parameter, Mixed
 from PLC.Filter import Filter
 from PLC.Table import Row, Table
-import PLC.Auth
-
 from PLC.Sites import Site, Sites
 from PLC.Persons import Person, Persons
 from PLC.Keys import Key, Keys
 from PLC.Nodes import Node, Nodes
 from PLC.TagTypes import TagType, TagTypes
 from PLC.Sites import Site, Sites
 from PLC.Persons import Person, Persons
 from PLC.Keys import Key, Keys
 from PLC.Nodes import Node, Nodes
 from PLC.TagTypes import TagType, TagTypes
+from PLC.NodeTags import NodeTag, NodeTags
 from PLC.SliceTags import SliceTag, SliceTags
 from PLC.Slices import Slice, Slices
 
 class Peer(Row):
     """
 from PLC.SliceTags import SliceTag, SliceTags
 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
     """
 
     See the Row class for more details
     """
 
@@ -45,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"),
         '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):
 
     def validate_peername(self, peername):
         if not len(peername):
@@ -68,8 +69,8 @@ class Peer(Row):
             raise PLCInvalidArgument, "Peer URL scheme must be https"
         if path[-1] != '/':
             raise PLCInvalidArgument, "Peer URL should end with /"
             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):
         """
 
     def delete(self, commit = True):
         """
@@ -108,7 +109,7 @@ class Peer(Row):
         """
         Unassociate a site with this peer.
         """
         """
         Unassociate a site with this peer.
         """
-        
+
         remove = Row.remove_object(Site, 'peer_site')
         remove(self, site, commit)
 
         remove = Row.remove_object(Site, 'peer_site')
         remove(self, site, commit)
 
@@ -123,12 +124,12 @@ class Peer(Row):
              'person_id': person['person_id'],
              'peer_person_id': peer_person_id},
             commit = commit)
              '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.
         """
     def remove_person(self, person, commit = True):
         """
         Unassociate a site with this peer.
         """
-    
+
         remove = Row.remove_object(Person, 'peer_person')
         remove(self, person, commit)
 
         remove = Row.remove_object(Person, 'peer_person')
         remove(self, person, commit)
 
@@ -148,7 +149,7 @@ class Peer(Row):
         """
         Unassociate a key with this peer.
         """
         """
         Unassociate a key with this peer.
         """
-    
+
         remove = Row.remove_object(Key, 'peer_key')
         remove(self, key, commit)
 
         remove = Row.remove_object(Key, 'peer_key')
         remove(self, key, commit)
 
@@ -164,13 +165,35 @@ class Peer(Row):
              'peer_node_id': peer_node_id},
             commit = commit)
 
              'peer_node_id': peer_node_id},
             commit = commit)
 
+        sites = Sites(self.api, node['site_id'], ['login_base'])
+        site = sites[0]
+        login_base = site['login_base']
+        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:
+            print >> log, "WARNING: (beg) could not find out hrn on hostname=%s"%node['hostname']
+            traceback.print_exc(5,file=log)
+            print >> log, "WARNING: (end) could not find out hrn on hostname=%s"%node['hostname']
+
     def remove_node(self, node, commit = True):
         """
         Unassociate a node with this peer.
         """
     def remove_node(self, node, commit = True):
         """
         Unassociate a node with this peer.
         """
-    
+
         remove = Row.remove_object(Node, 'peer_node')
         remove(self, node, commit)
         remove = Row.remove_object(Node, 'peer_node')
         remove(self, node, commit)
+        # 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]
+        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)
 
     def add_slice(self, slice, peer_slice_id, commit = True):
         """
 
     def add_slice(self, slice, peer_slice_id, commit = True):
         """
@@ -256,14 +279,14 @@ class Peer(Row):
             raise AttributeError, "type object 'Peer' has no attribute '%s'" % attr
 
 class Peers (Table):
             raise AttributeError, "type object 'Peer' has no attribute '%s'" % attr
 
 class Peers (Table):
-    """ 
+    """
     Maps to the peers table in the database
     """
     Maps to the peers table in the database
     """
-    
+
     def __init__ (self, api, peer_filter = None, columns = None):
         Table.__init__(self, api, Peer, columns)
 
     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:
               ", ".join(self.columns)
 
         if peer_filter is not None:
@@ -276,5 +299,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, 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)