aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-01-22 08:54:29 +0300
committerFrederick Muriuki Muriithi2024-01-22 08:54:29 +0300
commitf875926183e2e26881c3288e2f5c3d8ffe6397b8 (patch)
tree9e1ceb14a61bd5e6351ff5ed706fd3c02e7270bc
parentcdd4dc456e56bb4eb055e1cb7f2518d45fb3bfb9 (diff)
downloadgn-uploader-f875926183e2e26881c3288e2f5c3d8ffe6397b8.tar.gz
UI: Show progress of R/qtl2 bundle processing.
-rw-r--r--qc_app/templates/rqtl2/no-such-job.html13
-rw-r--r--qc_app/templates/rqtl2/rqtl2-job-error.html33
-rw-r--r--qc_app/templates/rqtl2/rqtl2-job-results.html24
-rw-r--r--qc_app/templates/rqtl2/rqtl2-job-status.html24
-rw-r--r--qc_app/upload/rqtl2.py26
-rw-r--r--scripts/process_rqtl2_bundle.py1
-rw-r--r--scripts/worker.py6
7 files changed, 123 insertions, 4 deletions
diff --git a/qc_app/templates/rqtl2/no-such-job.html b/qc_app/templates/rqtl2/no-such-job.html
new file mode 100644
index 0000000..b56980b
--- /dev/null
+++ b/qc_app/templates/rqtl2/no-such-job.html
@@ -0,0 +1,13 @@
+{%extends "base.html"%}
+{%from "flash_messages.html" import flash_messages%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: No Such Job</h2>
+
+<p class="alert-error">No job with ID {{jobid}} was found.</p>
+
+{%endblock%}
diff --git a/qc_app/templates/rqtl2/rqtl2-job-error.html b/qc_app/templates/rqtl2/rqtl2-job-error.html
new file mode 100644
index 0000000..72a334b
--- /dev/null
+++ b/qc_app/templates/rqtl2/rqtl2-job-error.html
@@ -0,0 +1,33 @@
+{%extends "base.html"%}
+{%from "cli-output.html" import cli_output%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: Job Status</h2>
+
+<div class="explainer">
+ <p>The processing of the R/qtl2 bundle you uploaded has failed. We have
+ provided some information below to help you figure out what the problem
+ could be.</p>
+ <p>If you find that you cannot figure out what the problem is on your own,
+ please contact the team running the system for assistance, providing the
+ R/qtl2 bundle you uploaded, and a screenshot of this page.</p>
+</div>
+
+<h4>stdout</h4>
+{{cli_output(job, "stdout")}}
+
+<h4>stderr</h4>
+{{cli_output(job, "stderr")}}
+
+<h4>Log</h4>
+<div class="cli-output">
+ {%for msg in messages%}
+ {{msg}}<br />
+ {%endfor%}
+</div>
+
+{%endblock%}
diff --git a/qc_app/templates/rqtl2/rqtl2-job-results.html b/qc_app/templates/rqtl2/rqtl2-job-results.html
new file mode 100644
index 0000000..4ecd415
--- /dev/null
+++ b/qc_app/templates/rqtl2/rqtl2-job-results.html
@@ -0,0 +1,24 @@
+{%extends "base.html"%}
+{%from "cli-output.html" import cli_output%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: Job Status</h2>
+
+<div class="explainer">
+ <p>The processing of the R/qtl2 bundle you uploaded has completed
+ successfully.</p>
+ <p>You should now be able to use GeneNetwork to run analyses on your data.</p>
+</div>
+
+<h4>Log</h4>
+<div class="cli-output">
+ {%for msg in messages%}
+ {{msg}}<br />
+ {%endfor%}
+</div>
+
+{%endblock%}
diff --git a/qc_app/templates/rqtl2/rqtl2-job-status.html b/qc_app/templates/rqtl2/rqtl2-job-status.html
new file mode 100644
index 0000000..a8bc640
--- /dev/null
+++ b/qc_app/templates/rqtl2/rqtl2-job-status.html
@@ -0,0 +1,24 @@
+{%extends "base.html"%}
+{%from "flash_messages.html" import flash_messages%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block extrameta%}
+<meta http-equiv="refresh" content="3">
+{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: Job Status</h2>
+
+{{job}}
+
+<h4>Log</h4>
+<div class="cli-output">
+ {%for msg in messages%}
+ {{msg}}<br />
+ {%endfor%}
+</div>
+
+{%endblock%}
diff --git a/qc_app/upload/rqtl2.py b/qc_app/upload/rqtl2.py
index 7ba90c2..8a0d8b4 100644
--- a/qc_app/upload/rqtl2.py
+++ b/qc_app/upload/rqtl2.py
@@ -1,9 +1,9 @@
"""Module to handle uploading of R/qtl2 bundles."""
import sys
import json
-from uuid import uuid4
from pathlib import Path
from datetime import date
+from uuid import UUID, uuid4
from zipfile import ZipFile, is_zipfile
from redis import Redis
@@ -581,4 +581,26 @@ def confirm_bundle_details(species_id: int, population_id: int):
redisuri,
f"{app.config['UPLOAD_FOLDER']}/job_errors")
- raise NotImplementedError
+ return redirect(url_for("upload.rqtl2.rqtl2_processing_status",
+ jobid=jobid))
+
+@rqtl2.route("/status/<uuid:jobid>")
+def rqtl2_processing_status(jobid: UUID):
+ """Retrieve the status of the job processing the uploaded R/qtl2 bundle."""
+ with Redis.from_url(app.config["REDIS_URL"], decode_responses=True) as rconn:
+ thejob = jobs.job(rconn, jobid)
+ if not bool(thejob):
+ return render_template("rqtl2/no-such-job.html", jobid=jobid)
+
+ logmessages = rconn.lrange(thejob.get("log-messagelist"), 0, -1) or []
+
+ if thejob["status"] == "error":
+ return render_template(
+ "rqtl2/rqtl2-job-error.html", job=thejob, messages=logmessages)
+ if thejob["status"] == "success":
+ return render_template("rqtl2/rqtl2-job-results.html",
+ job=thejob,
+ messages=logmessages)
+
+ return render_template(
+ "rqtl2/rqtl2-job-status.html", job=thejob, messages=logmessages)
diff --git a/scripts/process_rqtl2_bundle.py b/scripts/process_rqtl2_bundle.py
index 105f787..feb5e19 100644
--- a/scripts/process_rqtl2_bundle.py
+++ b/scripts/process_rqtl2_bundle.py
@@ -59,7 +59,6 @@ def process_bundle(dbconn: mdb.Connection, rconn: Redis, jobid: uuid.UUID) -> in
try:
thejob = parse_job(rconn, jobid)
meta = thejob["bundle-metadata"]
- logger.debug("The metadata: %s", meta)
rconn.hset(str(jobid), "geno-percent", "0")
rconn.hset(str(jobid), "pheno-percent", "0")
diff --git a/scripts/worker.py b/scripts/worker.py
index 13556df..90d83c4 100644
--- a/scripts/worker.py
+++ b/scripts/worker.py
@@ -54,10 +54,14 @@ def run_job(job, rconn):
rconn, job_id, process.stdout.read1(), "stdout")
sleep(1)
+ update_status(
+ rconn,
+ job_id,
+ ("error" if process.returncode != 0 else "success"))
+
with open(stderrpath, "rb") as stderr:
stderr_content = stderr.read()
update_stdout_stderr(rconn, job_id, stderr_content, "stderr")
- update_status(rconn, job_id, ("error" if bool(stderr_content) else "success"))
os.remove(stderrpath)
return process.poll()