X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmethods%2Fregister.py;h=8ba41693fb1667d859a2b8160b4d481881955660;hb=407a285d643f968a033ba059443dac32bd41afd0;hp=ef4f18679e69e9c10260443b6d283fd5c1909fb1;hpb=4284551e5c8addb77138ca24eeeb88ee73be689e;p=sfa.git diff --git a/sfa/methods/register.py b/sfa/methods/register.py index ef4f1867..8ba41693 100644 --- a/sfa/methods/register.py +++ b/sfa/methods/register.py @@ -50,7 +50,8 @@ class register(Method): uuid = create_uuid() pkey = Keypair(create=True) if 'key' in record and record['key']: - pkey = convert_public_key(record['key']) + for key in record['key']: + pkey = convert_public_key(key) gid_object = self.api.auth.hierarchy.create_gid(name, uuid, pkey) gid = gid_object.save_to_string(save_parents=True) @@ -62,7 +63,7 @@ class register(Method): if existing_records: raise ExistingRecord(name) - if type in ["authority", "sa", "ma"]: + if type in ["authority"]: # update the tree if not self.api.auth.hierarchy.auth_exists(name): self.api.auth.hierarchy.create_auth(name) @@ -76,28 +77,31 @@ class register(Method): gid = auth_info.get_gid_object() record.set_gid(gid.save_to_string(save_parents=True)) - # if registering a sa, see if a ma already exists - # if registering a ma, see if a sa already exists - if type in ["authority", "sa", "ma"]: - other_rec = table.resolve("authority", record.get_name()) - - if other_rec: - print >> log, "linking ma and sa to the same plc site" - pointer = other_rec[0].get_pointer() - else: - pl_record = self.api.geni_fields_to_pl_fields(type, name, record) - print >> log, "adding site with fields", pl_record + pl_record = self.api.geni_fields_to_pl_fields(type, name, record) + sites = self.api.plshell.GetSites(self.api.plauth, [pl_record['login_base']]) + if not sites: pointer = self.api.plshell.AddSite(self.api.plauth, pl_record) + else: + pointer = sites[0]['site_id'] record.set_pointer(pointer) elif (type == "slice"): pl_record = self.api.geni_fields_to_pl_fields(type, name, record) - pointer = self.api.plshell.AddSlice(self.api.plauth, pl_record) + slices = self.api.plshell.GetSlices(self.api.plauth, [pl_record['name']]) + if not slices: + pointer = self.api.plshell.AddSlice(self.api.plauth, pl_record) + else: + pointer = slices[0]['slice_id'] record.set_pointer(pointer) elif (type == "user"): - pointer = self.api.plshell.AddPerson(self.api.plauth, dict(record)) + persons = self.api.plshell.GetPersons(self.api.plauth, [record['email']]) + if not persons: + pointer = self.api.plshell.AddPerson(self.api.plauth, dict(record)) + else: + pointer = persons[0]['person_id'] + if 'enabled' in record and record['enabled']: self.api.plshell.UpdatePerson(self.api.plauth, pointer, {'enabled': record['enabled']}) login_base = get_leaf(auth_info.hrn) @@ -107,19 +111,28 @@ class register(Method): record.set_pointer(pointer) # Add the user's key - if record['key']: - self.api.plshell.AddPersonKey(self.api.plauth, pointer, {'key_type' : 'ssh', 'key' : record['key']}) + if 'key' in record and record['key']: + for key in record['key']: + self.api.plshell.AddPersonKey(self.api.plauth, pointer, {'key_type' : 'ssh', 'key' : key}) elif (type == "node"): pl_record = self.api.geni_fields_to_pl_fields(type, name, record) login_base = hrn_to_pl_login_base(auth_name) - pointer = self.api.plshell.AddNode(self.api.plauth, login_base, pl_record) + nodes = self.api.plshell.GetNodes(self.api.plauth, [pl_record['hostname']]) + if not nodes: + pointer = self.api.plshell.AddNode(self.api.plauth, login_base, pl_record) + else: + pointer = nodes[0]['node_id'] record.set_pointer(pointer) else: raise UnknownGeniType(type) - table.insert(record) + # SFA upcalls may exist in PLCAPI and they could have already added the + # record for us. Lets check if the record already exists + existing_records = table.resolve(type, name) + if not existing_records: + table.insert(record) # update membership for researchers, pis, owners, operators self.api.update_membership(None, record)