renamed persistentobjs into model
[sfa.git] / sfa / managers / registry_manager.py
index ef00d9c..79ac91c 100644 (file)
@@ -18,7 +18,7 @@ from sfa.trust.credential import Credential
 from sfa.trust.certificate import Certificate, Keypair, convert_public_key
 from sfa.trust.gid import create_uuid
 
-from sfa.storage.persistentobjs import RegRecord
+from sfa.storage.model import make_record,RegRecord
 from sfa.storage.alchemy import dbsession
 
 class RegistryManager:
@@ -52,7 +52,7 @@ class RegistryManager:
         # get record info
         record=dbsession.query(RegRecord).filter_by(type=type,hrn=hrn).first()
         if not record:
-            raise RecordNotFound(hrn)
+            raise RecordNotFound("hrn=%s, type=%s"%(hrn,type))
     
         # verify_cancreate_credential requires that the member lists
         # (researchers, pis, etc) be filled in
@@ -98,13 +98,13 @@ class RegistryManager:
         return new_cred.save_to_string(save_parents=True)
     
     
-    def Resolve(self, api, xrns, intype=None, full=True):
+    def Resolve(self, api, xrns, type=None, full=True):
     
         if not isinstance(xrns, types.ListType):
             xrns = [xrns]
             # try to infer type if not set and we get a single input
-            if not intype:
-                intype = Xrn(xrns).get_type()
+            if not type:
+                type = Xrn(xrns).get_type()
         hrns = [urn_to_hrn(xrn)[0] for xrn in xrns] 
 
         # load all known registry names into a prefix tree and attempt to find
@@ -136,26 +136,29 @@ class RegistryManager:
                 credential = api.getCredential()
                 interface = api.registries[registry_hrn]
                 server_proxy = api.server_proxy(interface, credential)
-                peer_records = server_proxy.Resolve(xrns, credential,intype)
+                peer_records = server_proxy.Resolve(xrns, credential,type)
                 # pass foreign records as-is
+                # previous code used to read
+                # records.extend([SfaRecord(dict=record).as_dict() for record in peer_records])
+                # not sure why the records coming through xmlrpc had to be processed at all
                 records.extend(peer_records)
     
         # try resolving the remaining unfound records at the local registry
         local_hrns = list ( set(hrns).difference([record['hrn'] for record in records]) )
         # 
         local_records = dbsession.query(RegRecord).filter(RegRecord.hrn.in_(local_hrns))
-        if intype:
-            local_records = local_records.filter_by(type=intype)
+        if type:
+            local_records = local_records.filter_by(type=type)
         local_records=local_records.all()
+        logger.info("Resolve: local_records=%s (type=%s)"%(local_records,type))
         local_dicts = [ record.__dict__ for record in local_records ]
         
         if full:
             # in full mode we get as much info as we can, which involves contacting the 
             # testbed for getting implementation details about the record
-            for record in local_dicts: logger.info("resolve augment %s"%record)
             self.driver.augment_records_with_testbed_info(local_dicts)
-#            # also we fill the 'url' field for known authorities
-#            # used to be in the driver code, sounds like a poorman thing though
+            # also we fill the 'url' field for known authorities
+            # used to be in the driver code, sounds like a poorman thing though
             def solve_neighbour_url (record):
                 if not record.type.startswith('authority'): return 
                 hrn=record.hrn
@@ -168,7 +171,7 @@ class RegistryManager:
         # convert local record objects to dicts for xmlrpc
         # xxx somehow here calling dict(record) issues a weird error
         # however record.todict() seems to work fine
-#        records.extend( [ dict(record) for record in local_records ] )
+        # records.extend( [ dict(record) for record in local_records ] )
         records.extend( [ record.todict() for record in local_records ] )    
         if not records:
             raise RecordNotFound(str(hrns))
@@ -196,6 +199,7 @@ class RegistryManager:
             interface = api.registries[registry_hrn]
             server_proxy = api.server_proxy(interface, credential)
             record_list = server_proxy.List(xrn, credential)
+            # same as above, no need to process what comes from through xmlrpc
             # pass foreign records as-is
             record_dicts = record_list
         
@@ -261,7 +265,8 @@ class RegistryManager:
             raise ExistingRecord(hrn)
            
         assert ('type' in record_dict)
-        record = RegRecord(dict=record_dict)
+        # returns the right type of RegRecord according to type in record
+        record = make_record(dict=record_dict)
         record.just_created()
         record.authority = get_authority(record.hrn)
         auth_info = api.auth.get_auth_info(record.authority)
@@ -311,11 +316,10 @@ class RegistryManager:
         # make sure the record exists
         record = dbsession.query(RegRecord).filter_by(type=type,hrn=hrn).first()
         if not record:
-            raise RecordNotFound(hrn)
+            raise RecordNotFound("hrn=%s, type=%s"%(hrn,type))
         record.just_updated()
     
         # validate the type
-        # xxx might be simpler to just try to commit as this is a constraint in the db
         if type not in ['authority', 'slice', 'node', 'user']:
             raise UnknownSfaType(type) 
 
@@ -366,6 +370,9 @@ class RegistryManager:
             raise RecordNotFound(msg)
 
         type = record.type
+        if type not in ['slice', 'user', 'node', 'authority'] :
+            raise UnknownSfaType(type)
+
         credential = api.getCredential()
         registries = api.registries
     
@@ -385,7 +392,7 @@ class RegistryManager:
             logger.warning("driver.remove failed")
 
         # delete from sfa db
-        del record
+        dbsession.delete(record)
         dbsession.commit()
     
         return 1