#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