def analyzeProfile(fileLocation= None): metadata = MetaData() myDBDesign = DBDesign() hostDB = myDBDesign.HostDBDesign(metadata) applicationDB = myDBDesign.ApplicationDesign(metadata) appProfileDB = myDBDesign.AppProfileDBDesign(metadata) gridTaskDesignDB = myDBDesign.GridTaskDBDesign(metadata) metadata.create_all(base.engine) print("Starting connection with GridWay metascheduler") ExecutionManager.initGridSession() print("Connection stablished") #load application myApp = base.Session.query(Application).order_by(Application.id.desc()).first() base.tmpExecutionFolder = base.tmpExecutionFolder + "/" + str(myApp.id) + "/" myTasks = base.Session.query(GridTask).filter(GridTask.applicationID==myApp.id) for task in myTasks: ExecutionManager.updateGridTaskStatus(task) finishedTasks = [gridTask for gridTask in myTasks if gridTask.status=="DONE"] for gridTask in finishedTasks: if gridTask.type == "applicationProfiling": myApp.updateInfoAfterProfiling(gridTask) print ("") print("Closing conection with GridWay metascheduler") ExecutionManager.exitGridSession() print("Connection closed")
def execute(self): while True: # update status of tasks being executed print("---") print("date:" + str(datetime.now())) print("") print("CHECKING FOR GRID CERTIFICATE") if not InformationManager.checkForValidCertificates(): print("Could not find a valid certificate") print("Finishing execution now :(") break # =================================================================== # print ("PRINCICIPIO DE EXECUTE") # for task in self.infrastructureTasks: # print ("Task " + task.gwID + "has hosttype " + str(task.host.__class__)) # # # =================================================================== print("") print("UPDATING INFRASTRUCTURE STATUS") for gridTask in self.infrastructureTasks: ExecutionManager.updateGridTaskStatus(gridTask) finishedTasks = [gridTask for gridTask in self.infrastructureTasks if gridTask.status == "DONE"] for gridTask in finishedTasks: if gridTask.type == "hostProfiling": self.myInfrastructure.updateInfoAfterProfiling(gridTask) # and update gridTask status ExecutionManager.removeTaskFromGW(gridTask) self.infrastructureTasks.remove(gridTask) self.myInfrastructure.updateStatus(self.infrastructureTasks) print("") print("CREATING INFRASTRUCTURE TASKS") self.executeInfrastructureTasks() # =================================================================== # print ("FILNAL DE EXECUTE") # for task in self.infrastructureTasks: # print ("Task " + task.gwID + "has hosttype " + str(task.host.__class__)) # =================================================================== print("UPDATE APPLICATION STATUS") for gridTask in self.applicationTasks: ExecutionManager.updateGridTaskStatus(gridTask) # estoe s una chapuza totalTasks = self.infrastructureTasks + self.applicationTasks self.myInfrastructure.updateStatus(totalTasks) # process recently finishedTasks finishedTasks = [gridTask for gridTask in self.applicationTasks if gridTask.status == "DONE"] for gridTask in finishedTasks: if gridTask.type == "applicationProfiling": self.myApplication.updateInfoAfterProfiling(gridTask) elif gridTask.type == "applicationExecution": self.myApplication.updateInfoAfterExecution(gridTask) # and update gridTask status ExecutionManager.removeTaskFromGW(gridTask) self.applicationTasks.remove(gridTask) # check for execution finish if self.myApplication.remainingSamples <= 0: print("Starting the exit of execution loop") # TODO: poner en los hosts que el máximo de host total es el maximo del total y del maximoThisTime self.myApplication.finished = 1 base.Session.add(self.myApplication) print("Application marked as finished") print("") print("Storing information about available hosts on remote sites") for host in self.myInfrastructure.hosts: host.maxSlotCount = max(host.maxSlotCount, host.maxSlotCountThisTime) base.Session.add(host) print("") print("Removing finished tasks from gridWay") # esto es discutible, # ahora, si una tarea de profiling ha llegado hasta el final de la ejecución sin ser completada, la marco como fallida # esto perjudica a los sitios que tienen un tiempo enorme de respuesta # lo contrario hace que si un sitio no contesta se siga considerando pendiente de profiling hasta el infinito for gridTask in self.applicationTasks: ExecutionManager.removeTaskFromGW(gridTask) if gridTask.type == "hostProfiling": self.myInfrastructure.updateInfoAfterProfiling(gridTask) try: base.Session.commit() except: base.Session.rollback() print("Lost connection with database, not storing anything!") print("Exiting execution loop") break print("") print("CREATING NEW EXECUTION TASKS") # =================================================================== # self.myInfrastructure.showHosts() # =================================================================== applicationExecutionTasks = self.mySchedulingAlgorithm.createApplicationTasks( self.myInfrastructure, self.myApplication, self.applicationTasks ) for gridTask in applicationExecutionTasks: ExecutionManager.submit(gridTask) self.applicationTasks.append(gridTask) base.Session.add(gridTask) try: base.Session.commit() except: base.Session.rollback() print("Lost connection with database, not storing anything!") print("...") sleep(15)