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