adding user key
[sfa.git] / geni / methods / register.py
1 from geni.util.faults import *
2 from geni.util.excep import *
3 from geni.util.method import Method
4 from geni.util.parameter import Parameter, Mixed
5 from geni.util.auth import Auth
6 from geni.util.record import GeniRecord
7 from geni.util.cert import Keypair, convert_public_key
8 from geni.util.gid import *
9 from geni.util.debug import log
10 from geni.util.misc import *
11
12 class register(Method):
13     """
14     Register an object with the registry. In addition to being stored in the
15     Geni database, the appropriate records will also be created in the
16     PLC databases
17     
18     @param cred credential string
19     @param record_dict dictionary containing record fields
20     
21     @return gid string representation
22     """
23
24     interfaces = ['registry']
25     
26     accepts = [
27         Parameter(str, "Credential string"),
28         Parameter(dict, "Record dictionary containing record fields")
29         ]
30
31     returns = Parameter(int, "String representation of gid object")
32     
33     def call(self, cred, record_dict):
34         self.api.auth.check(cred, "register")
35         record = GeniRecord(dict = record_dict)
36         type = record.get_type()
37         name = record.get_name()
38         self.api.auth.verify_object_permission(name)
39         auth_name = self.api.auth.get_authority(name)
40         auth_info = self.api.auth.get_auth_info(auth_name)
41         table = self.api.auth.get_auth_table(auth_name)
42         
43         # make sure record has a gid
44         if 'gid' not in record:
45             uuid = create_uuid()
46             pkey = Keypair()
47             if 'keys' in record and record['keys']:
48                 pkey = convert_public_key(record['keys'][0])
49                 
50             gid_object = self.api.auth.hierarchy.create_gid(name, uuid, pkey)
51             gid = gid_object.save_to_string(save_parents=True)
52             record['gid'] = gid
53             record.set_gid(gid)
54
55         # check if record already exists
56         existing_records = table.resolve(type, name)
57         if existing_records:
58             raise ExistingRecord(name)
59         
60         if (type == "sa") or (type=="ma"):
61             # update the tree
62             if not self.api.auth.hierarchy.auth_exists(name):
63                 self.api.auth.hierarchy.create_auth(name)
64
65             # authorities are special since they are managed by the registry
66             # rather than by the caller. We create our own GID for the
67             # authority rather than relying on the caller to supply one.
68
69             # get the GID from the newly created authority
70             child_auth_info = self.api.auth.get_auth_info(name)
71             gid = auth_info.get_gid_object()
72             record.set_gid(gid.save_to_string(save_parents=True))
73
74             # if registering a sa, see if a ma already exists
75             # if registering a ma, see if a sa already exists
76             if (type == "sa"):
77                 other_rec = table.resolve("ma", record.get_name())
78             elif (type == "ma"):
79                 other_rec = table.resolve("sa", record.get_name())
80
81             if other_rec:
82                 print >> log, "linking ma and sa to the same plc site"
83                 pointer = other_rec[0].get_pointer()
84             else:
85                 pl_record = self.api.geni_fields_to_pl_fields(type, name, record)
86                 print >> log, "adding site with fields", pl_record
87                 pointer = self.api.plshell.AddSite(self.api.plauth, pl_record)
88
89             record.set_pointer(pointer)
90
91         elif (type == "slice"):
92             pl_record = self.api.geni_fields_to_pl_fields(type, name, record)
93             pointer = self.api.plshell.AddSlice(self.api.plauth, pl_record)
94             record.set_pointer(pointer)
95
96         elif (type == "user"):
97             pointer = self.api.plshell.AddPerson(self.api.plauth, dict(record))
98             if 'enabled' in record and record['enabled']:
99                 self.api.plshell.UpdatePerson(self.api.plauth, pointer, {'enabled': record['enabled']})
100             login_base = get_leaf(auth_info.hrn)
101             self.api.plshell.AddPersonToSite(self.api.plauth, pointer, login_base)
102             # What roles should this user have?
103             self.api.plshell.AddRoleToPerson(self.api.plauth, 'user', pointer) 
104             record.set_pointer(pointer)
105             
106             # Add the user's key
107             if record['keys']:
108                 self.api.plshell.AddPersonKey(self.api.plauth, pointer, {'key_type' : 'ssh', 'key' : record['keys'][0]})
109
110         elif (type == "node"):
111             pl_record = self.api.geni_fields_to_pl_fields(type, name, record)
112             login_base = hrn_to_pl_login_base(auth_name)
113             pointer = self.api.plshell.AddNode(self.api.plauth, login_base, pl_record)
114             record.set_pointer(pointer)
115
116         else:
117             raise UnknownGeniType(type)
118
119         table.insert(record)
120
121         # update membership for researchers, pis, owners, operators
122         self.api.update_membership(None, record)
123
124         return record.get_gid_object().save_to_string(save_parents=True)