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