def update_jobs(host): """ Run scontrol, parse the output and update the ClusterJobs table. """ print "Parsing scontrol..." scontrol_data, err = host.exec_cmd("scontrol -d -o show job") if err: return ## Clear ClusterJobs that are linked to host ClusterJob.objects.filter(job_host=host).delete() scontrol_split = scontrol_data.split("\n") for job_string in scontrol_split: parsed_job = {} for item in job_string.split(): # print item.lower() partition = item.lower().partition("=") parsed_job[partition[0]] = partition[2] if "jobid" in parsed_job: job_id = parsed_job["jobid"] job_name = parsed_job["name"] job_owner = parsed_job["userid"].split("(")[0] cores = parse_sinfo_number(parsed_job["numcpus"].split("-")[0]) work_dir = parsed_job["workdir"] try: state = parsed_job["jobstate"].capitalize() if state == "Running": state = "Active" if state == "Pending": state = "Idle" except: state = "Unknown" ## Insert job into ClusterJob table. job = ClusterJob( job_id=job_id, job_name=job_name, job_owner=job_owner, job_host=host, n_cores=cores, work_dir=work_dir, state=state, ) job.save()
def update_jobs(host): ''' Run qstat -x, parse the xml output and update the ClusterJobs table. ''' print "Parsing qstat..." qstat_xml, err = host.exec_cmd("qstat -x") if err: return ## Clear ClusterJobs that are linked to host ClusterJob.objects.filter(job_host=host).delete() ## Parse qstat xml output root = ET.fromstring(qstat_xml) for child in root: job_id = child.find("Job_Id").text.split(".")[0] job_name = child.find("Job_Name").text job_owner = child.find("Job_Owner").text.split("@")[0] try: nodes = child.find("Resource_List").find("nodes").text n_nodes = int(nodes.split(':')[0]) except: n_nodes = 1 try: ppn = int(nodes.split(':')[1].split('=')[1]) cores = n_nodes*ppn except: cores = n_nodes ppn = 1 try: work_dir = child.find("init_work_dir").text except: work_dir = "" try: state_tmp = child.find("job_state").text state = "Unknown" if state_tmp == "R": state = "Active" elif state_tmp == "C": state = "Complete" elif state_tmp == "Q": state = "Idle" elif state_tmp == "H": state = "Hold" elif state_tmp == "E": state = "Error" except: state = "Unknown" ## Insert job into ClusterJob table. job = ClusterJob( job_id = job_id, job_name = job_name, job_owner = job_owner, job_host = host, n_cores = cores, work_dir = work_dir, state = state) job.save()