diff options
author | Frederick Muriuki Muriithi | 2024-01-22 08:54:29 +0300 |
---|---|---|
committer | Frederick Muriuki Muriithi | 2024-01-22 08:54:29 +0300 |
commit | f875926183e2e26881c3288e2f5c3d8ffe6397b8 (patch) | |
tree | 9e1ceb14a61bd5e6351ff5ed706fd3c02e7270bc | |
parent | cdd4dc456e56bb4eb055e1cb7f2518d45fb3bfb9 (diff) | |
download | gn-uploader-f875926183e2e26881c3288e2f5c3d8ffe6397b8.tar.gz |
UI: Show progress of R/qtl2 bundle processing.
-rw-r--r-- | qc_app/templates/rqtl2/no-such-job.html | 13 | ||||
-rw-r--r-- | qc_app/templates/rqtl2/rqtl2-job-error.html | 33 | ||||
-rw-r--r-- | qc_app/templates/rqtl2/rqtl2-job-results.html | 24 | ||||
-rw-r--r-- | qc_app/templates/rqtl2/rqtl2-job-status.html | 24 | ||||
-rw-r--r-- | qc_app/upload/rqtl2.py | 26 | ||||
-rw-r--r-- | scripts/process_rqtl2_bundle.py | 1 | ||||
-rw-r--r-- | scripts/worker.py | 6 |
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() |