From 3f5da98bfa888a0a5b6d1e32f6acb002abac4d24 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Tue, 29 Nov 2011 10:20:06 +0100 Subject: [PATCH] bugfix - had to undo an attempt to optimize the calls to augment_records_with_testbed_info - this makes the current implementation very slow but until we manage or cache relationships in the sfa db we're stuck --- sfa/managers/registry_manager.py | 19 +++++++++++++++---- sfa/plc/pldriver.py | 13 ++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/sfa/managers/registry_manager.py b/sfa/managers/registry_manager.py index da0b127b..a1b7b1af 100644 --- a/sfa/managers/registry_manager.py +++ b/sfa/managers/registry_manager.py @@ -55,6 +55,7 @@ class RegistryManager: # verify_cancreate_credential requires that the member lists # (researchers, pis, etc) be filled in + 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'])) @@ -211,10 +212,20 @@ 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 @@ -280,8 +291,8 @@ class RegistryManager: record['record_id'] = record_id # update membership for researchers, pis, owners, operators - self.update_relation(record, 'researcher', record.get('researcher'), 'user') - + self.update_relations (record, record) + return record.get_gid_object().save_to_string(save_parents=True) def Update(self, api, record_dict): @@ -329,7 +340,7 @@ class RegistryManager: table.update(record) # update membership for researchers, pis, owners, operators - self.update_relation(record, 'researcher', new_record.get('researcher'), 'user') + self.update_relations (record, new_record) return 1 diff --git a/sfa/plc/pldriver.py b/sfa/plc/pldriver.py index 834661b3..74db778d 100644 --- a/sfa/plc/pldriver.py +++ b/sfa/plc/pldriver.py @@ -45,14 +45,14 @@ class PlDriver (Driver, PlShell): ########## disabled users def is_enabled (self, record): - self.fill_record_info(record, deep=False) + # the incoming record was augmented already, so 'enabled' should be set if record['type'] == 'user': return record['enabled'] # only users can be disabled return True def augment_records_with_testbed_info (self, sfa_records): - return self.fill_record_info (sfa_records, deep=True) + return self.fill_record_info (sfa_records) ########## def register (self, sfa_record, hrn, pub_key): @@ -236,7 +236,7 @@ class PlDriver (Driver, PlShell): return pl_record #################### - def fill_record_info(self, records, deep=False): + def fill_record_info(self, records): """ Given a (list of) SFA record, fill in the PLC specific and SFA specific fields in the record. @@ -245,9 +245,8 @@ class PlDriver (Driver, PlShell): records = [records] self.fill_record_pl_info(records) - if deep: - self.fill_record_hrns(records) - self.fill_record_sfa_info(records) + self.fill_record_hrns(records) + self.fill_record_sfa_info(records) return records def fill_record_pl_info(self, records): @@ -502,7 +501,7 @@ class PlDriver (Driver, PlShell): #################### # plcapi works by changes, compute what needs to be added/deleted def update_relation (self, subject_type, target_type, subject_id, target_ids): - # hard-wire the code for slice/user for now + # hard-wire the code for slice/user for now, could be smarter if needed if subject_type =='slice' and target_type == 'user': subject=self.GetSlices (subject_id)[0] current_target_ids = subject['person_ids'] -- 2.43.0