From daff1e38d55c046b867360abbe33ded39be3c4d0 Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Wed, 17 Oct 2012 15:46:32 +0200 Subject: [PATCH] Better with the file concerned, slabslices.py --- sfa/senslab/slabslices.py | 120 ++++++++++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 23 deletions(-) diff --git a/sfa/senslab/slabslices.py b/sfa/senslab/slabslices.py index 4c6322b1..447b9c97 100644 --- a/sfa/senslab/slabslices.py +++ b/sfa/senslab/slabslices.py @@ -142,38 +142,112 @@ class SlabSlices: #leases = self.driver.GetLeases({'name':sfa_slice['name']},\ #['lease_id']) if leases : + current_nodes_reserved_by_start_time = {} + requested_nodes_by_start_time = {} + leases_by_start_time = {} + #Create reduced dictionary with key start_time and value 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 + + #Requested jobs + for start_time in requested_jobs_dict: + requested_nodes_by_start_time[int(start_time)] = requested_jobs_dict[start_time]['hostname'] + + #Check if there is any difference between the leases already + #registered in OAR and the requested jobs. + #Difference could be: + #-Lease deleted in the requested jobs + #-Added/removed nodes + #-Newly added lease + + logger.debug("SLABSLICES verify_slice_leases requested_nodes_by_start_time %s current_nodes_reserved_by_start_time %s " %(requested_nodes_by_start_time,current_nodes_reserved_by_start_time)) + + #Find all deleted leases + start_time_list = list(set(leases_by_start_time.keys()).difference(requested_nodes_by_start_time.keys())) + deleted_leases = [leases_by_start_time[start_time]['lease_id'] for start_time in start_time_list] + + + reschedule = {} + for start_time in requested_nodes_by_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]) + added_nodes = update_node_set.difference(current_nodes_reserved_by_start_time[start_time]) + shared_nodes = update_node_set.intersection(current_nodes_reserved_by_start_time[start_time]) + old_nodes_set = set(current_nodes_reserved_by_start_time[start_time]) + removed_nodes = old_nodes_set.difference(requested_nodes_by_start_time[start_time]) + logger.debug("SLABSLICES 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 creating it again. + #Add the deleted lease job id in the list + if added_nodes or removed_nodes: + deleted_leases.append(leases_by_start_time[start_time]['lease_id']) + #Reschedule the job + if added_nodes or shared_nodes: + reschedule[str(start_time)] = requested_jobs_dict[str(start_time)] + #logger.debug("SLABSLICES verify_slice_leases RESCHEDULE!!!!!") + #job = requested_jobs_dict[str(start_time)] + #self.driver.AddLeases(job['hostname'], \ + #sfa_slice, int(job['start_time']), \ + #int(job['duration'])) + else: + #New lease + logger.debug("SLABSLICES verify_slice_leases NEW LEASE") + job = requested_jobs_dict[str(start_time)] + self.driver.AddLeases(job['hostname'], \ + sfa_slice, int(job['start_time']), \ + int(job['duration'])) + current_leases = [lease['lease_id'] for lease in leases] logger.debug("SLABSLICES verify_slice_leases current_leases %s kept_leases %s requested_jobs_dict %s"\ %(current_leases,kept_leases,requested_jobs_dict)) #Deleted leases are the ones with lease id not declared in the Rspec - deleted_leases = list(set(current_leases).difference(kept_leases)) - - try: - #if peer: - #peer = RegAuyhority object is unsubscriptable - #TODO :UnBindObjectFromPeer Quick and dirty - #auth='senslab2 SA 27/07/12 + #deleted_leases = list(set(current_leases).difference(kept_leases)) + if deleted_leases: + self.driver.DeleteLeases(deleted_leases, sfa_slice['slice_hrn']) + + if reschedule : + for start_time in reschedule : + job = reschedule[start_time] + self.driver.AddLeases(job['hostname'], \ + sfa_slice, int(job['start_time']), \ + int(job['duration'])) + + #try: + ##if peer: + ##peer = RegAuyhority object is unsubscriptable + ##TODO :UnBindObjectFromPeer Quick and dirty + ##auth='senslab2 SA 27/07/12 - #Commented out UnBindObjectFromPeer SA 09/10/12 - #self.driver.UnBindObjectFromPeer('senslab2', 'slice', \ - #sfa_slice['record_id_slice'], peer.hrn) - logger.debug("SLABSLICES verify_slice_leases slice %s deleted_leases %s"\ - %(sfa_slice, deleted_leases)) - self.driver.DeleteLeases(deleted_leases, \ - sfa_slice['name']) + ##Commented out UnBindObjectFromPeer SA 09/10/12 + ##self.driver.UnBindObjectFromPeer('senslab2', 'slice', \ + ##sfa_slice['record_id_slice'], peer.hrn) + #logger.debug("SLABSLICES verify_slice_leases slice %s deleted_leases %s"\ + #%(sfa_slice, deleted_leases)) #self.driver.DeleteLeases(deleted_leases, \ #sfa_slice['name']) + ##self.driver.DeleteLeases(deleted_leases, \ + ##sfa_slice['name']) - #TODO verify_slice_leases: catch other exception? - except KeyError: - logger.log_exc('Failed to remove slice leases') + ##TODO verify_slice_leases: catch other exception? + #except KeyError: + #logger.log_exc('Failed to remove slice leases') - #Add new leases - for start_time in requested_jobs_dict: - job = requested_jobs_dict[start_time] - self.driver.AddLeases(job['hostname'], \ - sfa_slice, int(job['start_time']), \ - int(job['duration'])) + ##Add new leases + #for start_time in requested_jobs_dict: + #job = requested_jobs_dict[start_time] + #self.driver.AddLeases(job['hostname'], \ + #sfa_slice, int(job['start_time']), \ + #int(job['duration'])) return leases -- 2.47.0