X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Fregistry_manager.py;h=c24c1f51b1f261b029e44fbedcd46ca9b64aa132;hb=1cc8e9613cab8b5b22478de369f259e591c54e6d;hp=898fac3af8d13a4d5f88df83a1908056efeb1500;hpb=e0e3b09aa39ec0f078cf007927bfd4e9573a1211;p=sfa.git diff --git a/sfa/managers/registry_manager.py b/sfa/managers/registry_manager.py index 898fac3a..c24c1f51 100644 --- a/sfa/managers/registry_manager.py +++ b/sfa/managers/registry_manager.py @@ -18,8 +18,11 @@ from sfa.trust.certificate import Certificate, Keypair, convert_public_key from sfa.trust.gid import create_uuid from sfa.storage.model import make_record, RegRecord, RegAuthority, RegUser, RegSlice, RegKey, \ - augment_with_related_hrns + augment_with_sfa_builtins from sfa.storage.alchemy import dbsession +### the types that we need to exclude from sqlobjects before being able to dump +# them on the xmlrpc wire +from sqlalchemy.orm.collections import InstrumentedList class RegistryManager: @@ -43,7 +46,13 @@ class RegistryManager: hrn = urn_to_hrn(xrn)[0] else: hrn, type = urn_to_hrn(xrn) - + + # Slivers don't have credentials but users should be able to + # specify a sliver xrn and receive the slice's credential + if type == 'sliver' or '-' in Xrn(hrn).leaf: + slice_xrn = self.driver.sliver_to_slice_xrn(hrn) + hrn = slice_xrn.hrn + # Is this a root or sub authority auth_hrn = api.auth.get_authority(hrn) if not auth_hrn or hrn == api.config.SFA_INTERFACE_HRN: @@ -139,7 +148,7 @@ class RegistryManager: server_proxy = api.server_proxy(interface, credential) # should propagate the details flag but that's not supported in the xmlrpc interface yet #peer_records = server_proxy.Resolve(xrns, credential,type, details=details) - peer_records = server_proxy.Resolve(xrns, credential,type) + peer_records = server_proxy.Resolve(xrns, credential) # pass foreign records as-is # previous code used to read # records.extend([SfaRecord(dict=record).as_dict() for record in peer_records]) @@ -155,7 +164,7 @@ class RegistryManager: local_records=local_records.all() for local_record in local_records: - augment_with_related_hrns (local_record) + augment_with_sfa_builtins (local_record) logger.info("Resolve, (details=%s,type=%s) local_records=%s "%(details,type,local_records)) local_dicts = [ record.__dict__ for record in local_records ] @@ -179,7 +188,7 @@ class RegistryManager: # 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( [ record.todict(exclude_type=RegRecord) for record in local_records ] ) + records.extend( [ record.todict(exclude_types=[InstrumentedList]) for record in local_records ] ) if not records: raise RecordNotFound(str(hrns)) @@ -212,6 +221,7 @@ class RegistryManager: record_dicts = record_list # if we still have not found the record yet, try the local registry +# logger.debug("before trying local records, %d foreign records"% len(record_dicts)) if not record_dicts: recursive = False if ('recursive' in options and options['recursive']): @@ -223,11 +233,14 @@ class RegistryManager: if not api.auth.hierarchy.auth_exists(hrn): raise MissingAuthority(hrn) if recursive: - records = dbsession.query(RegRecord).filter(RegRecord.hrn.startswith(hrn)) + records = dbsession.query(RegRecord).filter(RegRecord.hrn.startswith(hrn)).all() +# logger.debug("recursive mode, found %d local records"%(len(records))) else: - records = dbsession.query(RegRecord).filter_by(authority=hrn) - for record in records: augment_with_related_hrns (record) - record_dicts=[ record.todict(exclude_type=RegRecord) for record in records ] + records = dbsession.query(RegRecord).filter_by(authority=hrn).all() +# logger.debug("non recursive mode, found %d local records"%(len(records))) + # so that sfi list can show more than plain names... + for record in records: augment_with_sfa_builtins (record) + record_dicts=[ record.todict(exclude_types=[InstrumentedList]) for record in records ] return record_dicts @@ -360,7 +373,7 @@ class RegistryManager: # is there a change in keys ? new_key=None if type=='user': - if getattr(new_key,'keys',None): + if getattr(new_record,'keys',None): new_key=new_record.keys if isinstance (new_key,types.ListType): new_key=new_key[0] @@ -373,8 +386,6 @@ class RegistryManager: urn = hrn_to_urn(hrn,type) gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey) gid = gid_object.save_to_string(save_parents=True) - record.gid = gid - dsession.commit() # xxx should do side effects from new_record to record # not too sure how to do that @@ -384,12 +395,10 @@ class RegistryManager: if isinstance (record, RegSlice): researcher_hrns = getattr(new_record,'researcher',None) if researcher_hrns is not None: record.update_researchers (researcher_hrns) - dbsession.commit() elif isinstance (record, RegAuthority): pi_hrns = getattr(new_record,'pi',None) if pi_hrns is not None: record.update_pis (pi_hrns) - dbsession.commit() # update the PLC information that was specified with the record # xxx oddly enough, without this useless statement, @@ -397,9 +406,16 @@ class RegistryManager: # anyway the driver should receive an object # (and then extract __dict__ itself if needed) print "DO NOT REMOVE ME before driver.update, record=%s"%record - if not self.driver.update (record.__dict__, new_record.__dict__, hrn, new_key): - logger.warning("driver.update failed") - + new_key_pointer = -1 + try: + (pointer, new_key_pointer) = self.driver.update (record.__dict__, new_record.__dict__, hrn, new_key) + except: + pass + if new_key and new_key_pointer: + record.reg_keys=[ RegKey (new_key, new_key_pointer)] + record.gid = gid + + dbsession.commit() # update membership for researchers, pis, owners, operators self.update_driver_relations (record, new_record)