359e1bc49b7413508029ed6696b1d302cc18d491
[sfa.git] / sfa / methods / register_peer_object.py
1 ### $Id: register.py 15001 2009-09-11 20:18:54Z tmack $
2 ### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/register.py $
3
4 from sfa.trust.certificate import Keypair, convert_public_key
5 from sfa.trust.gid import *
6
7 from sfa.util.faults import *
8 from sfa.util.misc import *
9 from sfa.util.method import Method
10 from sfa.util.parameter import Parameter, Mixed
11 from sfa.util.record import GeniRecord
12 from sfa.util.genitable import GeniTable
13 from sfa.util.debug import log
14 from sfa.trust.auth import Auth
15 from sfa.trust.gid import create_uuid
16 from sfa.trust.credential import Credential
17
18 class register_peer_object(Method):
19     """
20     Register a peer object with the registry. In addition to being stored in the
21     Geni database, the appropriate records will also be created in the
22     PLC databases
23     
24     @param cred credential string
25     @param record_dict dictionary containing record fields
26     
27     @return gid string representation
28     """
29
30     interfaces = ['registry']
31     
32     accepts = [
33         Parameter(str, "Credential string"),
34         Parameter(dict, "Record dictionary containing record fields"),
35         Mixed(Parameter(str, "Request hash"),
36               Parameter(None, "Request hash not specified"))
37         ]
38
39     returns = Parameter(int, "1 if successful")
40     
41     def call(self, cred, record_dict, request_hash=None, caller_cred=None):
42         self.api.auth.authenticateCred(cred, [cred], request_hash)
43         self.api.auth.check(cred, "register")
44         if caller_cred==None:
45                 caller_cred=cred
46                 
47         #log the call
48         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))
49
50         # make sure this is a peer record
51         if 'peer_authority' not in record_dict or \
52            not record_dict['peer_authority']: 
53             raise GeniInvalidArgument, "peer_authority must be specified" 
54
55         record = GeniRecord(dict = record_dict)
56         type, hrn, peer_authority = record['type'], record['hrn'], record['peer_authority']
57         record['authority'] = get_authority(record['hrn'])
58         # verify permissions
59         self.api.auth.verify_cred_is_me(cred)
60
61         # check if record already exists
62         table = GeniTable()
63         existing_records = table.find({'type': type, 'hrn': hrn, 'peer_authority': peer_authority})
64         if existing_records:
65             for existing_record in existing_records:
66                 if existing_record['pointer'] != record['pointer']:
67                     record['record_id'] = existing_record['record_id']
68                     table.update(record)
69             return 1
70         record_id = table.insert(record)
71  
72         return 1