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
 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.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():
 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)
     # 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)
     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})
     # 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:
             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()
             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()
 if __name__ == '__main__':
     main()