reslove multiple records at once
authorTony Mack <tmack@cs.princeton.edu>
Tue, 12 Jan 2010 02:40:21 +0000 (02:40 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Tue, 12 Jan 2010 02:40:21 +0000 (02:40 +0000)
sfa/server/sfa-clean-peer-records.py

index 5c13335..18e13e3 100644 (file)
@@ -5,13 +5,14 @@ import os
 import traceback
 from sfa.util.namespace import *
 from sfa.util.table import SfaTable
+from sfa.util.prefixTree import prefixTree
 from sfa.plc.api import SfaAPI
 from sfa.util.config import Config
 from sfa.trust.certificate import Keypair
 from sfa.trust.hierarchy import Hierarchy
 from sfa.util.report import trace, error
 from sfa.server.registry import Registries
-from sfa.util.xmlrpcprotocol import xmlrpcprotocol, ServerException
+from sfa.util.xmlrpcprotocol import *
 import socket
 
 def main():
@@ -31,28 +32,41 @@ def main():
     # and a valid credential
     authority = config.SFA_INTERFACE_HRN
     url = 'http://%s:%s/' %(config.SFA_REGISTRY_HOST, config.SFA_REGISTRY_PORT)
-    registry = xmlrpcprotocol.get_server((url, key_file, cert_file)
+    registry = xmlrpcprotocol.get_server(url, key_file, cert_file)
     sfa_api = SfaAPI(key_file = key_file, cert_file = cert_file, interface='registry')
     credential = sfa_api.getCredential()
 
     # get peer registries
     registries = Registries(sfa_api)
-
+    tree = prefixTree()
+    tree.load(registries.keys())
+    
     # get local peer records
     table = SfaTable()
     peer_records = table.find({'~peer_authority': None})
-    for peer_record in peer_records:
-        peer_auth = peer_record['peer_authority']
-        if peer_auth in registries:
+    found_records = []
+    hrn_dict = {}
+    for record in peer_records:
+        registry_hrn = tree.best_match(record['hrn'])
+        if registry_hrn not in hrn_dict:
+            hrn_dict[registry_hrn] = []
+        hrn_dict[registry_hrn].append(record['hrn'])
+
+    # attempt to resolve the record at the authoritative interface 
+    for registry_hrn in hrn_dict:
+        if registry_hrn in registries:
+            records = []
+            target_hrns = hrn_dict[registry_hrn]    
             try:
-                peer_record_hrn = peer_record['hrn']
-                arg_list = [credential, peer_record_hrn]
-                records = registries[peer_auth].resolve(credential, peer_record_hrn)
-            except ServerException:
-                # an exception will be thrown if the record doenst exist
-                # if so remove the record from the local registry
-                registries[sfa_api.hrn].remove_peer_object(credential, peer_record)
+                records = registries[registry_hrn].resolve(credential, target_hrns)
+                found_records.extend([record['hrn'] for record in records])
             except:
                 traceback.print_exc()
+
+    # remove what wasnt found 
+    for peer_record in peer_records:
+        if peer_record['hrn'] not in found_records:
+            registries[sfa_api.hrn].remove(credential, peer_record)
+                
 if __name__ == '__main__':
     main()