Skip to content
Snippets Groups Projects
Commit af92b332 authored by Sabine Schröder's avatar Sabine Schröder
Browse files

get actual job status for jobs that are not already finished or aborted

parent 221864e2
Branches
No related tags found
No related merge requests found
......@@ -616,6 +616,59 @@ def create_description_content(language_id):
)
def get_job_status(jobid, convoc_status_dict):
base_url = f"{UNICORE_BASE}JURECA/rest/core"
# Authentification/Authorization
credentials = uc_credentials.UsernamePassword(UNICORE_USER, UNICORE_PASSWORD)
client = uc_client.Client(credentials, base_url)
# query status of ecflow jobs
executable = "ecflow_client"
environment = [ "PYTHONPATH=$PYTHONPATH:/p/project/cjicg21/jicg2126/ecflow/ecFlow-5.11.0-Source/lib/python3.8/site-packages/ecflow",
"PATH=$PATH:/p/project/cjicg21/jicg2126/ecflow/ecFlow-5.11.0-Source/bin/",
"ECFLOW_DIR=/p/project/cjicg21/jicg2126/ecflow/ecFlow-5.11.0-Source",
"ECF_HOST=jrlogin05.jureca",
"ECF_PORT=4960" ]
arguments = [ f"--query dstate /{jobid}" ]
job_description = {"Executable": executable,
"Job type": "ON_LOGIN_NODE",
"Environment": environment,
"Arguments": arguments, }
job = client.new_job(job_description)
# let's wait while the job is still running
job.poll()
working_dir = job.working_dir
stdout_content = working_dir.stat("stdout").raw().readlines()
new_status = stdout_content[0].decode('utf-8').strip()
# translate response from UNICORE to controlled vocabulary
if new_status == 'complete':
new_status_code = convoc_status_dict['finished']
elif new_status == 'active':
new_status_code = convoc_status_dict['active']
elif new_status == 'queued':
new_status_code = convoc_status_dict['waiting']
elif new_status == 'aborted':
new_status_code = convoc_status_dict['aborted']
else:
new_status_code = -1
return new_status_code
def change_status_of_job(jobid, new_status):
conn = sqlite3.connect(DATA_PATH.joinpath('destine_de370c_users.db'))
cur = conn.cursor()
cur.execute(f"UPDATE jobs SET status={new_status} WHERE id='{jobid}'")
conn.commit()
conn.close()
def get_my_jobs_from_db(user_id=None, language_id=0):
data_from_db = []
if user_id:
......@@ -623,16 +676,27 @@ def get_my_jobs_from_db(user_id=None, language_id=0):
cur = conn.cursor()
cur.execute(f"SELECT application, status, start_date, forecast_length, region, species, metric, emis_scen, creation_date, id FROM jobs WHERE user_id={user_id}")
data_rows_from_db = cur.fetchall()
cur.execute("SELECT job_status, id FROM convoc_status")
convoc_status_from_db = cur.fetchall()
conn.close()
convoc_status_dict = dict(convoc_status_from_db)
# if status != 'finished':
# use /p/project/cjicg21/schroeder5/Destine_AQ/SCRIPTS/ECFLOW/query_status.bash jobnr
# to determine the actual status
# ==> there should be a refresh, whenever this tab is reloaded!
for job in data_rows_from_db:
job_status = job[1]
if (job_status == convoc_status_dict['active']) or (job_status == convoc_status_dict['waiting']):
new_status = get_job_status(job[9].upper(), convoc_status_dict)
if job_status != new_status:
change_status_of_job(job[9], new_status)
job_status = new_status
data_from_db.append({guitr.jobs_columns[language_id][0]: guitr.application_text[language_id][job[0]],
guitr.jobs_columns[language_id][1]: guitr.status_text[language_id][job[1]],
guitr.jobs_columns[language_id][1]: guitr.status_text[language_id][job_status],
guitr.jobs_columns[language_id][2]: dt.datetime.strptime(job[2],'%Y-%m-%d %H:%M').strftime(guitr.date_format2[language_id]),
guitr.jobs_columns[language_id][3]: "{} {}{}".format(job[3], guitr.day_label[language_id], guitr.day_plural_label[language_id] if job[3] > 1 else ""),
guitr.jobs_columns[language_id][4]: guitr.region_text[language_id][job[4]],
......@@ -881,7 +945,6 @@ def eurad_im_job_run(run_button, region, startdate, forecast_length, user_dict):
new_job_dict['metric'] = None
# EURAD-IM does not have any emission scenario
new_job_dict['emis_scen'] = None
create_db_job_entry(user_id, new_job_dict)
# submit job
base_url = f"{UNICORE_BASE}JURECA/rest/core"
......@@ -890,6 +953,13 @@ def eurad_im_job_run(run_button, region, startdate, forecast_length, user_dict):
job_description = {'Executable': "/p/project/cjicg21/schroeder5/Destine_AQ/start_destine_demonstrator.sh", "Job type": "ON_LOGIN_NODE", 'Arguments':[jobnr, "0"], }
job = client.new_job(job_description)
# let's wait while the job is still running
# otherwise, the job status will not be able to be determined
job.poll()
# now create job in db (otherwise the status cannot be determined!)
create_db_job_entry(user_id, new_job_dict)
# return updated values
retval = ctx.triggered_id == "eurad_im_open"
return retval,\
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment