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 *
10 class register(Method):
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
16 @param cred credential string
17 @param record_dict dictionary containing record fields
19 @return gid string representation
22 interfaces = ['registry']
25 Parameter(str, "Credential string"),
26 Parameter(dict, "Record dictionary containing record fields")
29 returns = Parameter(int, "String representation of gid object")
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)
42 # check if record already exists
43 existing_records = table.resolve(type, name)
45 raise ExistingRecord(name)
47 geni_fields = record.get_geni_info()
48 pl_fields = record.get_pl_info()
50 if (type == "sa") or (type=="ma"):
52 if not self.api.auth.hierarchy.auth_exists(name):
53 self.api.auth.hierarchy.create_auth(name)
55 # authorities are special since they are managed by the registry
56 # rather than by the caller. We create our own GID for the
57 # authority rather than relying on the caller to supply one.
59 # get the GID from the newly created authority
60 child_auth_info = self.api.auth.get_auth_info(name)
61 gid = auth_info.get_gid_object()
62 record.set_gid(gid.save_to_string(save_parents=True))
64 # if registering a sa, see if a ma already exists
65 # if registering a ma, see if a sa already exists
67 other_rec = table.resolve("ma", record.get_name())
69 other_rec = table.resolve("sa", record.get_name())
72 print >> log, "linking ma and sa to the same plc site"
73 pointer = other_rec[0].get_pointer()
75 self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
76 print >> log, "adding site with fields", pl_fields
77 pointer = self.api.plshell.AddSite(self.api.plauth, pl_fields)
79 record.set_pointer(pointer)
81 elif (type == "slice"):
82 self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
83 pointer = self.api.plshell.AddSlice(self.api.plauth, pl_fields)
84 record.set_pointer(pointer)
86 elif (type == "user"):
87 self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
88 pointer = self.api.plshell.AddPerson(self.api.plauth, pl_fields)
89 record.set_pointer(pointer)
91 elif (type == "node"):
92 self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
93 #login_base = self.api.hrn_to_pl_login_base(auth_name)
94 login_base = hrn_to_pl_login_base(auth_name)
95 pointer = self.api.plshell.AddNode(self.api.plauth, login_base, pl_fields)
96 record.set_pointer(pointer)
99 raise UnknownGeniType(type)
103 # update membership for researchers, pis, owners, operators
104 self.api.update_membership(None, record)
106 return record.get_gid_object().save_to_string(save_parents=True)