X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmethods%2Fregister_peer_object.py;h=42ef2408d614f653bc575812818c586f8132c938;hb=f97c73f11e336387e67232925e7fc408f24db48e;hp=c3a78e91acfc72a868327c341c1e640338e44262;hpb=8426706dd5e396986c2f2423570fffc1f32e467c;p=sfa.git diff --git a/sfa/methods/register_peer_object.py b/sfa/methods/register_peer_object.py index c3a78e91..42ef2408 100644 --- a/sfa/methods/register_peer_object.py +++ b/sfa/methods/register_peer_object.py @@ -1,29 +1,20 @@ -### $Id: register.py 15001 2009-09-11 20:18:54Z tmack $ -### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/register.py $ -from sfa.trust.certificate import Keypair, convert_public_key -from sfa.trust.gid import * - -from sfa.util.faults import * -from sfa.util.misc import * +from sfa.util.faults import SfaInvalidArgument +from sfa.util.xrn import get_authority from sfa.util.method import Method from sfa.util.parameter import Parameter, Mixed -from sfa.util.record import GeniRecord -from sfa.util.genitable import GeniTable -from sfa.util.debug import log -from sfa.trust.auth import Auth -from sfa.trust.gid import create_uuid +from sfa.util.record import SfaRecord +from sfa.util.table import SfaTable from sfa.trust.credential import Credential class register_peer_object(Method): """ Register a peer object with the registry. In addition to being stored in the - Geni database, the appropriate records will also be created in the + SFA database, the appropriate records will also be created in the PLC databases @param cred credential string @param record_dict dictionary containing record fields - @return gid string representation """ @@ -31,35 +22,44 @@ class register_peer_object(Method): accepts = [ Parameter(str, "Credential string"), - Parameter(dict, "Record dictionary containing record fields") + Parameter(dict, "Record dictionary containing record fields"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) ] returns = Parameter(int, "1 if successful") - def call(self, cred, record_dict, caller_cred=None): - self.api.auth.check(cred, "register") - if caller_cred==None: - caller_cred=cred - + def call(self, cred, record_dict, origin_hrn=None): + user_cred = Credential(string=cred) + #log the call - self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, Credential(string=caller_cred).get_gid_caller().get_hrn(), None, self.name)) + if not origin_hrn: + origin_hrn = user_cred.get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, None, self.name)) + + # validate the cred + self.api.auth.check(cred, "register") # make sure this is a peer record if 'peer_authority' not in record_dict or \ not record_dict['peer_authority']: - raise GeniInvalidArgument, "peer_authority must be specified" + raise SfaInvalidArgument, "peer_authority must be specified" - record = GeniRecord(dict = record_dict) + record = SfaRecord(dict = record_dict) type, hrn, peer_authority = record['type'], record['hrn'], record['peer_authority'] record['authority'] = get_authority(record['hrn']) # verify permissions self.api.auth.verify_cred_is_me(cred) # check if record already exists - table = GeniTable() + table = SfaTable() existing_records = table.find({'type': type, 'hrn': hrn, 'peer_authority': peer_authority}) if existing_records: - return 1 - record_id = table.insert(record) + for existing_record in existing_records: + if existing_record['pointer'] != record['pointer']: + record['record_id'] = existing_record['record_id'] + table.update(record) + else: + record_id = table.insert(record) return 1