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
9 class register(Method):
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
15 @param cred credential string
16 @param record_dict dictionary containing record fields
18 @return gid string representation
21 interfaces = ['registry']
24 Parameter(str, "Credential string"),
25 Parameter(dict, "Record dictionary containing record fields")
28 returns = Parameter(int, "String representation of gid object")
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)
41 # check if record already exists
42 existing_records = table.resolve(type, name)
44 raise ExistingRecord(name)
46 geni_fields = record.get_geni_info()
47 pl_fields = record.get_pl_info()
49 if (type == "sa") or (type=="ma"):
51 if not self.api.auth.hierarchy.auth_exists(name):
52 self.api.auth.hierarchy.create_auth(name)
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.
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))
63 # if registering a sa, see if a ma already exists
64 # if registering a ma, see if a sa already exists
66 other_rec = table.resolve("ma", record.get_name())
68 other_rec = table.resolve("sa", record.get_name())
71 print >> log, "linking ma and sa to the same plc site"
72 pointer = other_rec[0].get_pointer()
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)
78 record.set_pointer(pointer)
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)
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)
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)
97 raise UnknownGeniType(type)
101 # update membership for researchers, pis, owners, operators
102 self.api.update_membership(None, record)
104 return record.get_gid_object().save_to_string(save_parents=True)