Better with the file concerned, slabslices.py
authorSandrine Avakian <sandrine.avakian@inria.fr>
Wed, 17 Oct 2012 13:46:32 +0000 (15:46 +0200)
committerSandrine Avakian <sandrine.avakian@inria.fr>
Wed, 17 Oct 2012 13:46:32 +0000 (15:46 +0200)
sfa/senslab/slabslices.py

index 4c6322b..447b9c9 100644 (file)
@@ -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