X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fiotlab%2Fiotlabslices.py;fp=sfa%2Fsenslab%2Fslabslices.py;h=e449b213671de336f5dcd5e6082dbc9377ded4a0;hb=b0995f45712c5ea9dd26fdf0c4347ccba2d77fce;hp=aa45e591ec6700eaa7e1bad07e2cbc309d72db6e;hpb=459c7cb13e96793bc4622bc167422442c0cd7ba0;p=sfa.git diff --git a/sfa/senslab/slabslices.py b/sfa/iotlab/iotlabslices.py similarity index 74% rename from sfa/senslab/slabslices.py rename to sfa/iotlab/iotlabslices.py index aa45e591..e449b213 100644 --- a/sfa/senslab/slabslices.py +++ b/sfa/iotlab/iotlabslices.py @@ -4,53 +4,53 @@ from sfa.util.sfalogging import logger MAXINT = 2L**31-1 -class SlabSlices: +class IotlabSlices: rspec_to_slice_tag = {'max_rate':'net_max_rate'} - - + + def __init__(self, driver): """ Get the reference to the driver here. """ self.driver = driver - - + + def get_peer(self, xrn): """ Find the authority of a resources based on its xrn. - If the authority is Senslab (local) return None, - Otherwise, look up in the DB if Senslab is federated with this site - authority and returns its DB record if it is the case, + If the authority is Iotlab (local) return None, + Otherwise, look up in the DB if Iotlab is federated with this site + authority and returns its DB record if it is the case, """ hrn, hrn_type = urn_to_hrn(xrn) - #Does this slice belong to a local site or a peer senslab site? + #Does this slice belong to a local site or a peer iotlab site? peer = None - + # get this slice's authority (site) slice_authority = get_authority(hrn) - #Senslab stuff + #Iotlab stuff #This slice belongs to the current site - if slice_authority == self.driver.slab_api.root_auth: + if slice_authority == self.driver.iotlab_api.root_auth: site_authority = slice_authority return None - + site_authority = get_authority(slice_authority).lower() # get this site's authority (sfa root authority or sub authority) - logger.debug("SLABSLICES \ get_peer slice_authority %s \ + logger.debug("IOTLABSLICES \ get_peer slice_authority %s \ site_authority %s hrn %s" %(slice_authority, \ site_authority, hrn)) - - + + # check if we are already peered with this site_authority #if so find the peer record - peers = self.driver.slab_api.GetPeers(peer_filter = site_authority) + peers = self.driver.iotlab_api.GetPeers(peer_filter = site_authority) for peer_record in peers: - + if site_authority == peer_record.hrn: peer = peer_record - logger.debug(" SLABSLICES \tget_peer peer %s " %(peer)) + logger.debug(" IOTLABSLICES \tget_peer peer %s " %(peer)) return peer def get_sfa_peer(self, xrn): @@ -66,66 +66,66 @@ class SlabSlices: return sfa_peer - + def verify_slice_leases(self, sfa_slice, requested_jobs_dict, peer): - """ + """ Compare requested leases with the leases already scheduled/ running in OAR. If necessary, delete and recreate modified leases, - and delete no longer requested ones. - + and delete no longer requested ones. + :param sfa_slice: sfa slice record :param requested_jobs_dict: dictionary of requested leases :param peer: sfa peer - + :type sfa_slice: dict - :type requested_jobs_dict: dict + :type requested_jobs_dict: dict :type peer: - :return: leases list of dictionary + :return: leases list of dictionary :rtype: list - + """ - logger.debug("SLABSLICES verify_slice_leases sfa_slice %s \ + logger.debug("IOTLABSLICES verify_slice_leases sfa_slice %s \ "%( sfa_slice)) - #First get the list of current leases from OAR - leases = self.driver.slab_api.GetLeases({'name':sfa_slice['hrn']}) - logger.debug("SLABSLICES verify_slice_leases requested_jobs_dict %s \ + #First get the list of current leases from OAR + leases = self.driver.iotlab_api.GetLeases({'name':sfa_slice['hrn']}) + logger.debug("IOTLABSLICES verify_slice_leases requested_jobs_dict %s \ leases %s "%(requested_jobs_dict, leases )) - + current_nodes_reserved_by_start_time = {} requested_nodes_by_start_time = {} leases_by_start_time = {} reschedule_jobs_dict = {} - - #Create reduced dictionary with key start_time and value + + #Create reduced dictionary with key start_time and value # the list of nodes #-for the leases already registered by OAR first # then for the new leases requested by the user - + #Leases already scheduled/running in OAR for lease in leases : current_nodes_reserved_by_start_time[lease['t_from']] = \ lease['reserved_nodes'] leases_by_start_time[lease['t_from']] = lease - + #First remove job whose duration is too short for job in requested_jobs_dict.values(): - if job['duration'] < self.driver.slab_api.GetLeaseGranularity(): + if job['duration'] < self.driver.iotlab_api.GetLeaseGranularity(): del requested_jobs_dict[job['start_time']] - - #Requested jobs + + #Requested jobs for start_time in requested_jobs_dict: requested_nodes_by_start_time[int(start_time)] = \ - requested_jobs_dict[start_time]['hostname'] + requested_jobs_dict[start_time]['hostname'] #Check if there is any difference between the leases already - #registered in OAR and the requested jobs. + #registered in OAR and the requested jobs. #Difference could be: #-Lease deleted in the requested jobs #-Added/removed nodes - #-Newly added lease + #-Newly added lease - logger.debug("SLABSLICES verify_slice_leases \ + logger.debug("IOTLABSLICES verify_slice_leases \ requested_nodes_by_start_time %s \ "%(requested_nodes_by_start_time )) #Find all deleted leases @@ -136,17 +136,17 @@ class SlabSlices: for start_time in start_time_list] - + #Find added or removed nodes in exisiting leases - for start_time in requested_nodes_by_start_time: - logger.debug("SLABSLICES verify_slice_leases start_time %s \ + for start_time in requested_nodes_by_start_time: + logger.debug("IOTLABSLICES verify_slice_leases start_time %s \ "%( start_time)) if start_time in current_nodes_reserved_by_start_time: - + if requested_nodes_by_start_time[start_time] == \ current_nodes_reserved_by_start_time[start_time]: continue - + else: update_node_set = \ set(requested_nodes_by_start_time[start_time]) @@ -162,46 +162,46 @@ class SlabSlices: removed_nodes = \ old_nodes_set.difference(\ requested_nodes_by_start_time[start_time]) - logger.debug("SLABSLICES verify_slice_leases \ + logger.debug("IOTLABSLICES verify_slice_leases \ shared_nodes %s added_nodes %s removed_nodes %s"\ %(shared_nodes, added_nodes,removed_nodes )) - #If the lease is modified, delete it before + #If the lease is modified, delete it before #creating it again. #Add the deleted lease job id in the list - #WARNING :rescheduling does not work if there is already - # 2 running/scheduled jobs because deleting a job + #WARNING :rescheduling does not work if there is already + # 2 running/scheduled jobs because deleting a job #takes time SA 18/10/2012 if added_nodes or removed_nodes: deleted_leases.append(\ leases_by_start_time[start_time]['lease_id']) - #Reschedule the job + #Reschedule the job if added_nodes or shared_nodes: reschedule_jobs_dict[str(start_time)] = \ requested_jobs_dict[str(start_time)] - else: + else: #New lease - + job = requested_jobs_dict[str(start_time)] - logger.debug("SLABSLICES \ + logger.debug("IOTLABSLICES \ NEWLEASE slice %s job %s"\ - %(sfa_slice, job)) - self.driver.slab_api.AddLeases(job['hostname'], \ + %(sfa_slice, job)) + self.driver.iotlab_api.AddLeases(job['hostname'], \ sfa_slice, int(job['start_time']), \ int(job['duration'])) #Deleted leases are the ones with lease id not declared in the Rspec if deleted_leases: - self.driver.slab_api.DeleteLeases(deleted_leases, sfa_slice['hrn']) - logger.debug("SLABSLICES \ + self.driver.iotlab_api.DeleteLeases(deleted_leases, sfa_slice['hrn']) + logger.debug("IOTLABSLICES \ verify_slice_leases slice %s deleted_leases %s"\ %(sfa_slice, deleted_leases)) - - - if reschedule_jobs_dict : + + + if reschedule_jobs_dict : for start_time in reschedule_jobs_dict: job = reschedule_jobs_dict[start_time] - self.driver.slab_api.AddLeases(job['hostname'], \ + self.driver.iotlab_api.AddLeases(job['hostname'], \ sfa_slice, int(job['start_time']), \ int(job['duration'])) return leases @@ -211,10 +211,10 @@ class SlabSlices: deleted_nodes = [] if 'node_ids' in sfa_slice: - nodes = self.driver.slab_api.GetNodes(sfa_slice['list_node_ids'], \ + nodes = self.driver.iotlab_api.GetNodes(sfa_slice['list_node_ids'], \ ['hostname']) current_slivers = [node['hostname'] for node in nodes] - + # remove nodes not in rspec deleted_nodes = list(set(current_slivers).\ difference(requested_slivers)) @@ -223,22 +223,22 @@ class SlabSlices: #difference(current_slivers)) - logger.debug("SLABSLICES \tverify_slice_nodes slice %s\ + logger.debug("IOTLABSLICES \tverify_slice_nodes slice %s\ \r\n \r\n deleted_nodes %s"\ %(sfa_slice, deleted_nodes)) if deleted_nodes: #Delete the entire experience - self.driver.slab_api.DeleteSliceFromNodes(sfa_slice) + self.driver.iotlab_api.DeleteSliceFromNodes(sfa_slice) #self.driver.DeleteSliceFromNodes(sfa_slice['slice_hrn'], \ #deleted_nodes) return nodes - + def free_egre_key(self): used = set() - for tag in self.driver.slab_api.GetSliceTags({'tagname': 'egre_key'}): + for tag in self.driver.iotlab_api.GetSliceTags({'tagname': 'egre_key'}): used.add(int(tag['value'])) for i in range(1, 256): @@ -250,39 +250,39 @@ class SlabSlices: return str(key) - - - - + + + + def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer): #login_base = slice_hrn.split(".")[0] slicename = slice_hrn - slices_list = self.driver.slab_api.GetSlices(slice_filter = slicename, \ - slice_filter_type = 'slice_hrn') - sfa_slice = None + slices_list = self.driver.iotlab_api.GetSlices(slice_filter = slicename, \ + slice_filter_type = 'slice_hrn') + sfa_slice = None if slices_list: for sl in slices_list: - + logger.debug("SLABSLICE \tverify_slice slicename %s \ slices_list %s sl %s \ slice_record %s"\ %(slicename, slices_list,sl, \ slice_record)) sfa_slice = sl sfa_slice.update(slice_record) - + else: #Search for user in ldap based on email SA 14/11/12 - ldap_user = self.driver.slab_api.ldap.LdapFindUser(\ + ldap_user = self.driver.iotlab_api.ldap.LdapFindUser(\ slice_record['user']) - logger.debug(" SLABSLICES \tverify_slice Oups \ + logger.debug(" IOTLABSLICES \tverify_slice Oups \ slice_record %s sfa_peer %s ldap_user %s"\ %(slice_record, sfa_peer, ldap_user )) #User already registered in ldap, meaning user should be in SFA db - #and hrn = sfa_auth+ uid + #and hrn = sfa_auth+ uid sfa_slice = {'hrn': slicename, - #'url': slice_record.get('url', slice_hrn), + #'url': slice_record.get('url', slice_hrn), #'description': slice_record.get('description', slice_hrn) 'node_list' : [], 'authority' : slice_record['authority'], @@ -292,17 +292,17 @@ class SlabSlices: 'reg-researchers':slice_record['reg-researchers'], #'record_id_slice': slice_record['record_id'], 'peer_authority':str(sfa_peer) - - } - if ldap_user : - hrn = self.driver.slab_api.root_auth +'.'+ ldap_user['uid'] - + + } + if ldap_user : + hrn = self.driver.iotlab_api.root_auth +'.'+ ldap_user['uid'] + user = self.driver.get_user_record(hrn) - - logger.debug(" SLABSLICES \tverify_slice hrn %s USER %s" \ + + logger.debug(" IOTLABSLICES \tverify_slice hrn %s USER %s" \ %(hrn, user)) #sfa_slice = {'slice_hrn': slicename, - ##'url': slice_record.get('url', slice_hrn), + ##'url': slice_record.get('url', slice_hrn), ##'description': slice_record.get('description', slice_hrn) #'node_list' : [], #'authority' : slice_record['authority'], @@ -312,83 +312,83 @@ class SlabSlices: #'reg-researchers':slice_record['reg-researchers'], ##'record_id_slice': slice_record['record_id'], #'peer_authority':str(peer.hrn) - + #} - # add the slice + # add the slice if sfa_slice : - self.driver.slab_api.AddSlice(sfa_slice, user) - + self.driver.iotlab_api.AddSlice(sfa_slice, user) + if peer: sfa_slice['slice_id'] = slice_record['record_id'] - - #slice['slice_id'] = self.driver.slab_api.AddSlice(slice) - logger.debug("SLABSLICES \tverify_slice ADDSLICE OK") + + #slice['slice_id'] = self.driver.iotlab_api.AddSlice(slice) + logger.debug("IOTLABSLICES \tverify_slice ADDSLICE OK") #slice['node_ids']=[] #slice['person_ids'] = [] #if peer: #sfa_slice['peer_slice_id'] = slice_record.get('slice_id', None) # mark this slice as an sfa peer record #if sfa_peer: - #peer_dict = {'type': 'slice', 'hrn': slice_hrn, + #peer_dict = {'type': 'slice', 'hrn': slice_hrn, #'peer_authority': sfa_peer, 'pointer': \ #slice['slice_id']} #self.registry.register_peer_object(self.credential, peer_dict) - - + + return sfa_slice def verify_persons(self, slice_hrn, slice_record, users, peer, sfa_peer, \ options={}): - """ - users is a record list. Records can either be local records - or users records from known and trusted federated sites. - If the user is from another site that senslab doesn't trust yet, - then Resolve will raise an error before getting to create_sliver. """ - #TODO SA 21/08/12 verify_persons Needs review - - logger.debug("SLABSLICES \tverify_persons \tslice_hrn %s \ + users is a record list. Records can either be local records + or users records from known and trusted federated sites. + If the user is from another site that iotlab doesn't trust yet, + then Resolve will raise an error before getting to create_sliver. + """ + #TODO SA 21/08/12 verify_persons Needs review + + logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn %s \ \t slice_record %s\r\n users %s \t peer %s "\ - %( slice_hrn, slice_record, users, peer)) - users_by_id = {} - #users_by_hrn = {} + %( slice_hrn, slice_record, users, peer)) + users_by_id = {} + #users_by_hrn = {} users_by_email = {} #users_dict : dict whose keys can either be the user's hrn or its id. - #Values contains only id and hrn + #Values contains only id and hrn users_dict = {} - + #First create dicts by hrn and id for each user in the user record list: for info in users: - + if 'slice_record' in info : - slice_rec = info['slice_record'] + slice_rec = info['slice_record'] user = slice_rec['user'] - if 'email' in user: + if 'email' in user: users_by_email[user['email']] = user users_dict[user['email']] = user - + #if 'hrn' in user: #users_by_hrn[user['hrn']] = user #users_dict[user['hrn']] = user - + logger.debug( "SLABSLICE.PY \t verify_person \ users_dict %s \r\n user_by_email %s \r\n \ \tusers_by_id %s " \ %(users_dict,users_by_email, users_by_id)) - + existing_user_ids = [] #existing_user_hrns = [] existing_user_emails = [] existing_users = [] - # Check if user is in Senslab LDAP using its hrn. - # Assuming Senslab is centralised : one LDAP for all sites, + # Check if user is in Iotlab LDAP using its hrn. + # Assuming Iotlab is centralised : one LDAP for all sites, # user'as record_id unknown from LDAP # LDAP does not provide users id, therefore we rely on hrns containing # the login of the user. - # If the hrn is not a senslab hrn, the user may not be in LDAP. + # If the hrn is not a iotlab hrn, the user may not be in LDAP. if users_by_email : #Construct the list of filters (list of dicts) for GetPersons @@ -396,96 +396,96 @@ class SlabSlices: for email in users_by_email : filter_user.append (users_by_email[email]) #Check user's in LDAP with GetPersons - #Needed because what if the user has been deleted in LDAP but + #Needed because what if the user has been deleted in LDAP but #is still in SFA? - existing_users = self.driver.slab_api.GetPersons(filter_user) + existing_users = self.driver.iotlab_api.GetPersons(filter_user) logger.debug(" \r\n SLABSLICE.PY \tverify_person filter_user \ %s existing_users %s " \ %(filter_user, existing_users)) - #User's in senslab LDAP + #User's in iotlab LDAP if existing_users: for user in existing_users : users_dict[user['email']].update(user) existing_user_emails.append(\ users_dict[user['email']]['email']) - - - # User from another known trusted federated site. Check - # if a senslab account matching the email has already been created. - else: + + + # User from another known trusted federated site. Check + # if a iotlab account matching the email has already been created. + else: req = 'mail=' if isinstance(users, list): - - req += users[0]['email'] + + req += users[0]['email'] else: req += users['email'] - - ldap_reslt = self.driver.slab_api.ldap.LdapSearch(req) - + + ldap_reslt = self.driver.iotlab_api.ldap.LdapSearch(req) + if ldap_reslt: logger.debug(" SLABSLICE.PY \tverify_person users \ - USER already in Senslab \t ldap_reslt %s \ - "%( ldap_reslt)) + USER already in Iotlab \t ldap_reslt %s \ + "%( ldap_reslt)) existing_users.append(ldap_reslt[1]) - + else: #User not existing in LDAP #TODO SA 21/08/12 raise smthg to add user or add it auto ? #new_record = {} #new_record['pkey'] = users[0]['keys'][0] #new_record['mail'] = users[0]['email'] - + logger.debug(" SLABSLICE.PY \tverify_person users \ not in ldap ...NEW ACCOUNT NEEDED %s \r\n \t \ ldap_reslt %s " %(users, ldap_reslt)) - + requested_user_emails = users_by_email.keys() requested_user_hrns = \ [users_by_email[user]['hrn'] for user in users_by_email] logger.debug("SLABSLICE.PY \tverify_person \ - users_by_email %s " %( users_by_email)) + users_by_email %s " %( users_by_email)) #logger.debug("SLABSLICE.PY \tverify_person \ - #user_by_hrn %s " %( users_by_hrn)) - - + #user_by_hrn %s " %( users_by_hrn)) + + #Check that the user of the slice in the slice record - #matches one of the existing users + #matches one of the existing users try: if slice_record['PI'][0] in requested_user_hrns: #if slice_record['record_id_user'] in requested_user_ids and \ #slice_record['PI'][0] in requested_user_hrns: logger.debug(" SLABSLICE \tverify_person ['PI']\ slice_record %s" %(slice_record)) - + except KeyError: pass - - + + # users to be added, removed or updated - #One user in one senslab slice : there should be no need + #One user in one iotlab slice : there should be no need #to remove/ add any user from/to a slice. - #However a user from SFA which is not registered in Senslab yet + #However a user from SFA which is not registered in Iotlab yet #should be added to the LDAP. added_user_emails = set(requested_user_emails).\ difference(set(existing_user_emails)) - + #self.verify_keys(existing_slice_users, updated_users_list, \ #peer, append) added_persons = [] # add new users - + #requested_user_email is in existing_user_emails if len(added_user_emails) == 0: - + slice_record['login'] = users_dict[requested_user_emails[0]]['uid'] logger.debug(" SLABSLICE \tverify_person QUICK DIRTY %s" \ %(slice_record)) - - + + for added_user_email in added_user_emails: - #hrn, type = urn_to_hrn(added_user['urn']) + #hrn, type = urn_to_hrn(added_user['urn']) added_user = users_dict[added_user_email] logger.debug(" SLABSLICE \r\n \r\n \t THE SECOND verify_person \ added_user %s" %(added_user)) @@ -501,12 +501,12 @@ class SlabSlices: person['email'] = added_user['email'] person['key_ids'] = added_user.get('key_ids', []) #person['urn'] = added_user['urn'] - - #person['person_id'] = self.driver.slab_api.AddPerson(person) - ret = self.driver.slab_api.AddPerson(person) + + #person['person_id'] = self.driver.iotlab_api.AddPerson(person) + ret = self.driver.iotlab_api.AddPerson(person) if type(ret) == int : - person['uid'] = ret - + person['uid'] = ret + logger.debug(" SLABSLICE \r\n \r\n \t THE SECOND verify_person\ personne %s" %(person)) #Update slice_Record with the id now known to LDAP @@ -514,26 +514,26 @@ class SlabSlices: added_persons.append(person) - + return added_persons - + #Unused def verify_keys(self, persons, users, peer, options={}): - # existing keys + # existing keys key_ids = [] for person in persons: key_ids.extend(person['key_ids']) - keylist = self.driver.slab_api.GetKeys(key_ids, ['key_id', 'key']) - + keylist = self.driver.iotlab_api.GetKeys(key_ids, ['key_id', 'key']) + keydict = {} for key in keylist: - keydict[key['key']] = key['key_id'] + keydict[key['key']] = key['key_id'] existing_keys = keydict.keys() - + persondict = {} for person in persons: - persondict[person['email']] = person - + persondict[person['email']] = person + # add new keys requested_keys = [] updated_persons = [] @@ -549,34 +549,33 @@ class SlabSlices: #try: ##if peer: #person = persondict[user['email']] - #self.driver.slab_api.UnBindObjectFromPeer('person', + #self.driver.iotlab_api.UnBindObjectFromPeer('person', #person['person_id'], peer['shortname']) - ret = self.driver.slab_api.AddPersonKey(\ + ret = self.driver.iotlab_api.AddPersonKey(\ user['email'], key) #if peer: #key_index = user_keys.index(key['key']) #remote_key_id = user['key_ids'][key_index] - #self.driver.slab_api.BindObjectToPeer('key', \ + #self.driver.iotlab_api.BindObjectToPeer('key', \ #key['key_id'], peer['shortname'], \ #remote_key_id) - + #finally: #if peer: - #self.driver.slab_api.BindObjectToPeer('person', \ + #self.driver.iotlab_api.BindObjectToPeer('person', \ #person['person_id'], peer['shortname'], \ #user['person_id']) - + # remove old keys (only if we are not appending) append = options.get('append', True) - if append == False: + if append == False: removed_keys = set(existing_keys).difference(requested_keys) for key in removed_keys: #if peer: - #self.driver.slab_api.UnBindObjectFromPeer('key', \ + #self.driver.iotlab_api.UnBindObjectFromPeer('key', \ #key, peer['shortname']) user = users_by_key_string[key] - self.driver.slab_api.DeleteKey(user, key) - + self.driver.iotlab_api.DeleteKey(user, key) + return - \ No newline at end of file