ticket attributes seem to be empty; but we can fetch the slice_hrn from gidObject...
[sfa.git] / sfa / server / sfa-clean-peer-records.py
index 358aee2..80dbc23 100644 (file)
@@ -4,14 +4,15 @@ import sys
 import os
 import traceback
 from sfa.util.namespace import *
 import os
 import traceback
 from sfa.util.namespace import *
-from sfa.util.genitable import GeniTable
-from sfa.plc.api import GeniAPI
+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.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
+import sfa.util.xmlrpcprotocol as xmlrpcprotocol 
 import socket
 
 def main():
 import socket
 
 def main():
@@ -31,28 +32,48 @@ 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)
-    sfa_api = GeniAPI(key_file = key_file, cert_file = cert_file, interface='registry')
+    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)
     credential = sfa_api.getCredential()
 
     # get peer registries
     registries = Registries(sfa_api)
-
+    tree = prefixTree()
+    tree.load(registries.keys())
+    
     # get local peer records
     # get local peer records
-    table = GeniTable()
+    table = SfaTable()
     peer_records = table.find({'~peer_authority': None})
     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)
+                records = registries[registry_hrn].resolve(credential, target_hrns)
+                found_records.extend([record['hrn'] for record in records])
             except ServerException:
                 # an exception will be thrown if the record doenst exist
                 # if so remove the record from the local registry
             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)
+                continue
             except:
             except:
+                # this deosnt necessarily mean the records dont exist
+                # lets give them the benefit of the doubt here (for now)
+                found_records.extend(target_hrns)
                 traceback.print_exc()
                 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()