X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmanagers%2Fregistry_manager.py;h=d29aafef745d7233a4ed9b7e0c4b4bf31901691f;hb=b6de9285a970eccb9658a0078c49f76fb11af7cd;hp=3fcc516886041bc1de08a326512cf7e69556dd24;hpb=b2eb0c60203a994080d1c1850b0011b8df0ddc24;p=sfa.git diff --git a/sfa/managers/registry_manager.py b/sfa/managers/registry_manager.py index 3fcc5168..d29aafef 100644 --- a/sfa/managers/registry_manager.py +++ b/sfa/managers/registry_manager.py @@ -8,8 +8,6 @@ import commands from sfa.util.faults import RecordNotFound, AccountNotEnabled, PermissionError, MissingAuthority, \ UnknownSfaType, ExistingRecord, NonExistingRecord from sfa.util.prefixTree import prefixTree -from sfa.util.record import SfaRecord -from sfa.util.table import SfaTable from sfa.util.xrn import Xrn, get_authority, hrn_to_urn, urn_to_hrn from sfa.util.plxrn import hrn_to_pl_login_base from sfa.util.version import version_core @@ -20,13 +18,16 @@ 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.record import SfaRecord +from sfa.storage.table import SfaTable + class RegistryManager: - def __init__ (self): pass + def __init__ (self, config): pass # The GENI GetVersion call - def GetVersion(self, api): - peers = dict ( [ (hrn,interface._ServerProxy__host) for (hrn,interface) in api.registries.iteritems() + def GetVersion(self, api, options): + peers = dict ( [ (hrn,interface.get_url()) for (hrn,interface) in api.registries.iteritems() if hrn != api.hrn]) xrn=Xrn(api.hrn) return version_core({'interface':'registry', @@ -55,7 +56,8 @@ class RegistryManager: # verify_cancreate_credential requires that the member lists # (researchers, pis, etc) be filled in - if not self.driver.is_enabled_entity (record): + self.driver.augment_records_with_testbed_info (record) + if not self.driver.is_enabled (record): raise AccountNotEnabled(": PlanetLab account %s is not enabled. Please contact your site PI" %(record['email'])) # get the callers gid @@ -141,7 +143,7 @@ class RegistryManager: 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 - self.driver.fill_record_info(local_records) + self.driver.augment_records_with_testbed_info(local_records) # 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): @@ -211,7 +213,33 @@ class RegistryManager: pkey = certificate.get_pubkey() gid = api.auth.hierarchy.create_gid(xrn, create_uuid(), pkey) return gid.save_to_string(save_parents=True) + + #################### + # utility for handling relationships among the SFA objects + # given that the SFA db does not handle this sort of relationsships + # it will rely on side-effects in the testbed to keep this persistent + + # subject_record describes the subject of the relationships + # ref_record contains the target values for the various relationships we need to manage + # (to begin with, this is just the slice x person relationship) + def update_relations (self, subject_record, ref_record): + type=subject_record['type'] + if type=='slice': + self.update_relation(subject_record, 'researcher', ref_record.get('researcher'), 'user') + + # field_key is the name of one field in the record, typically 'researcher' for a 'slice' record + # hrns is the list of hrns that should be linked to the subject from now on + # target_type would be e.g. 'user' in the 'slice' x 'researcher' example + def update_relation (self, sfa_record, field_key, hrns, target_type): + # locate the linked objects in our db + subject_type=sfa_record['type'] + subject_id=sfa_record['pointer'] + table = SfaTable() + link_sfa_records = table.find ({'type':target_type, 'hrn': hrns}) + link_ids = [ rec.get('pointer') for rec in link_sfa_records ] + self.driver.update_relation (subject_type, target_type, subject_id, link_ids) + def Register(self, api, record): hrn, type = record['hrn'], record['type'] @@ -255,8 +283,7 @@ class RegistryManager: gid = auth_info.get_gid_object() record.set_gid(gid.save_to_string(save_parents=True)) - # update testbed-specific data f needed - logger.info("Getting driver from manager=%s"%self) + # update testbed-specific data if needed pointer = self.driver.register (record, hrn, pub_key) record.set_pointer(pointer) @@ -264,8 +291,8 @@ class RegistryManager: record['record_id'] = record_id # update membership for researchers, pis, owners, operators - self.driver.update_membership(None, record) - + self.update_relations (record, record) + return record.get_gid_object().save_to_string(save_parents=True) def Update(self, api, record_dict): @@ -297,10 +324,6 @@ class RegistryManager: if isinstance (new_key,types.ListType): new_key=new_key[0] - # Update_membership needs the membership lists in the existing record - # filled in, so it can see if members were added or removed - self.driver.fill_record_info(record) - # update the PLC information that was specified with the record if not self.driver.update (record, new_record, hrn, new_key): logger.warning("driver.update failed") @@ -317,7 +340,7 @@ class RegistryManager: table.update(record) # update membership for researchers, pis, owners, operators - self.driver.update_membership(record, new_record) + self.update_relations (record, new_record) return 1