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
11 Update an object in the registry. Currently, this only updates the
12 PLC information associated with the record. The Geni fields (name, type,
15 @param cred credential string specifying rights of the caller
16 @param record a record dictionary to be updated
18 @return 1 if successful, faults otherwise
21 interfaces = ['registry']
24 Parameter(str, "Credential string"),
25 Parameter(dict, "Record dictionary to be updated")
28 returns = Parameter(int, "1 if successful")
30 def call(self, cred, record_dict):
31 self.api.auth.check(cred, "update")
32 record = GeniRecord(dict = record_dict)
33 type = record.get_type()
34 self.api.auth.verify_object_permission(record.get_name())
35 auth_name = self.api.auth.get_authority(record.get_name())
37 auth_name = record.get_name()
38 table = self.api.auth.get_auth_table(auth_name)
40 # make sure the record exists
41 existing_record_list = table.resolve(type, record.get_name())
42 if not existing_record_list:
43 raise RecordNotFound(record.get_name())
44 existing_record = existing_record_list[0]
46 # Update_membership needs the membership lists in the existing record
47 # filled in, so it can see if members were added or removed
48 self.api.fill_record_info(existing_record)
50 # Use the pointer from the existing record, not the one that the user
51 # gave us. This prevents the user from inserting a forged pointer
52 pointer = existing_record.get_pointer()
54 # update the PLC information that was specified with the record
56 if (type == "authority"):
57 self.api.plshell.UpdateSite(self.api.plauth, pointer, record)
60 self.api.plshell.UpdateSlice(self.api.plauth, pointer, record)
63 # SMBAKER: UpdatePerson only allows a limited set of fields to be
64 # updated. Ideally we should have a more generic way of doing
65 # this. I copied the field names from UpdatePerson.py...
68 for key in all_fields.keys():
69 if key in ['first_name', 'last_name', 'title', 'email',
70 'password', 'phone', 'url', 'bio', 'accepted_aup',
72 update_fields[key] = all_fields[key]
73 self.api.plshell.UpdatePerson(self.api.plauth, pointer, update_fields)
76 self.api.plshell.UpdateNode(self.api.plauth, pointer, record)
79 raise UnknownGeniType(type)
81 # update membership for researchers, pis, owners, operators
82 self.api.update_membership(existing_record, record)