+ self.driver.shell.UpdateSlice(slice_id, {'expires': expires})
+ else:
+ if slice_record:
+ url = slice_record.get('url', slice_hrn)
+ description = slice_record.get('description', slice_hrn)
+ else:
+ url = slice_hrn
+ description = slice_hrn
+ slice = {'name': slice_name,
+ 'url': url,
+ 'description': description,
+ 'hrn': slice_hrn,
+ 'sfa_created': 'True',
+ #'expires': expires,
+ }
+ # add the slice
+ slice_id = self.driver.shell.AddSlice(slice)
+ # plcapi tends to mess with the incoming hrn so let's make sure
+ self.driver.shell.SetSliceHrn(slice_id, slice_hrn)
+ # cannot be set with AddSlice
+ # set the expiration
+ self.driver.shell.UpdateSlice(slice_id, {'expires': expires})
+
+ return self.driver.shell.GetSlices(slice_id)[0]
+
+ # in the following code, we use
+ # 'person' to denote a PLCAPI-like record with typically 'person_id' and 'email'
+ # 'user' to denote an incoming record with typically 'urn' and 'email' - we add 'hrn' in there
+ # 'slice_record': it seems like the first of these 'users' also contains a 'slice_record'
+ # key that holds stuff like 'hrn', 'slice_id', 'authority',...
+ #
+ def create_person_from_user(self, user, site_id):
+ user_hrn = user['hrn']
+ # the value to use if 'user' has no 'email' attached - or if the attached email already exists
+ # typically
+ (auth_hrn, _, leaf) = user_hrn.rpartition('.')
+ # somehow this has backslashes, get rid of them
+ auth_hrn = auth_hrn.replace('\\', '')
+ default_email = "{}@{}.stub".format(leaf, auth_hrn)
+
+ person_record = {
+ # required
+ 'first_name': user.get('first_name', user_hrn),
+ 'last_name': user.get('last_name', user_hrn),
+ 'email': user.get('email', default_email),
+ # our additions
+ 'enabled': True,
+ 'sfa_created': 'True',
+ 'hrn': user_hrn,
+ }
+
+ logger.debug(
+ "about to attempt to AddPerson with {}".format(person_record))
+ try:
+ # the thing is, the PLE db has a limitation on re-using the same e-mail
+ # in the case where people have an account on ple.upmc and then then come
+ # again from onelab.upmc, they will most likely have the same e-mail, and so kaboom..
+ # so we first try with the accurate email
+ person_id = int(self.driver.shell.AddPerson(person_record))
+ except:
+ logger.log_exc("caught during first attempt at AddPerson")
+ # and if that fails we start again with the email based on the hrn,
+ # which this time is unique..
+ person_record['email'] = default_email
+ logger.debug("second chance with email={}".format(
+ person_record['email']))
+ person_id = int(self.driver.shell.AddPerson(person_record))
+ self.driver.shell.AddRoleToPerson('user', person_id)
+ self.driver.shell.AddPersonToSite(person_id, site_id)
+ # plcapi tends to mess with the incoming hrn so let's make sure
+ self.driver.shell.SetPersonHrn(person_id, user_hrn)
+ # also 'enabled':True does not seem to pass through with AddPerson
+ self.driver.shell.UpdatePerson(person_id, {'enabled': True})
+
+ return person_id
+
+ def verify_persons(self, slice_hrn, slice_record, users, sfa_peer, options=None):
+ if options is None:
+ options = {}
+
+ # first we annotate the incoming users arg with a 'hrn' key
+ for user in users:
+ user['hrn'], _ = urn_to_hrn(user['urn'])
+ # this is for retrieving users from a hrn
+ users_by_hrn = {user['hrn']: user for user in users}