Skip to content

Commit

Permalink
Merge pull request #32 from flux-framework/add/cancel-button
Browse files Browse the repository at this point in the history
add cancel button
  • Loading branch information
vsoch committed Nov 21, 2022
2 parents 4d84ffc + 2b66e58 commit da6f92c
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 17 deletions.
16 changes: 16 additions & 0 deletions app/library/flux.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,22 @@ def stream_job_output(jobid):
pass


def cancel_job(jobid):
"""
Request a job to be cancelled by id.
Returns a message to the user and a return code.
"""
from app.main import app

try:
flux.job.cancel(app.handle, jobid)
# This is usually FileNotFoundError
except Exception as e:
return "Job cannot be cancelled: %s." % e, 400
return "Job is requested to cancel.", 200


def get_job_output(jobid, delay=None):
"""
Given a jobid, get the output.
Expand Down
2 changes: 2 additions & 0 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
data_root = os.path.join(root, "data")
template_root = os.path.join(root, "templates")

# Create templates, ensure we can get flashed messages from template session
templates = Jinja2Templates(directory=template_root)

app.mount("/static", StaticFiles(directory=static_root), name="static")
app.mount("/data", StaticFiles(directory=data_root), name="data")

Expand Down
15 changes: 2 additions & 13 deletions app/routers/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,19 +122,8 @@ async def cancel_job(jobid):
"""
Cancel a running flux job
"""
from app.main import app

try:
flux.job.cancel(app.handle, jobid)
# This is usually FileNotFoundError
except Exception as e:
return JSONResponse(
content={"Message": "Job cannot be cancelled: %s." % e}, status_code=400
)

return JSONResponse(
content={"Message": "Job is requested to cancel."}, status_code=200
)
message, return_code = flux_cli.cancel_job(jobid)
return JSONResponse(content={"Message": message}, status_code=return_code)


@router.post("/jobs/submit")
Expand Down
25 changes: 22 additions & 3 deletions app/routers/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import flux
import flux.job
from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates

import app.library.flux as flux_cli
Expand Down Expand Up @@ -52,10 +52,18 @@ async def jobs_table(request: Request):


# View job detail (and log)
@auth_views_router.get("/job/{jobid}", response_class=HTMLResponse)
async def job_info(request: Request, jobid):
@auth_views_router.get(
"/job/{jobid}",
response_class=HTMLResponse,
name="job_info",
operation_id="job_info",
)
async def job_info(request: Request, jobid, msg=None):
job = flux_cli.get_job(jobid)

# If we have a message, add to messages
messages = [msg] if msg else []

# If not completed, ask info to return after a second of waiting
if job["state"] == "INACTIVE":
info = flux_cli.get_job_output(jobid)
Expand All @@ -68,6 +76,7 @@ async def job_info(request: Request, jobid):
"jobs/job.html",
{
"title": f"Job {jobid}",
"messages": messages,
"request": request,
"job": job,
"info": info,
Expand All @@ -85,6 +94,16 @@ async def submit_job(request: Request):
)


# Button to cancel a job
@auth_views_router.get("/job/{jobid}/cancel", response_class=HTMLResponse)
async def cancel_job(request: Request, jobid):
from app.main import app

message, _ = flux_cli.cancel_job(jobid)
url = app.url_path_for(name="job_info", jobid=jobid) + "?msg=" + message
return RedirectResponse(url=url)


@auth_views_router.post("/jobs/submit")
async def submit_job_post(request: Request):
"""
Expand Down
2 changes: 1 addition & 1 deletion templates/include/messages.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<div class="col">
<div class="mb-3">{% for message in messages %}
<p class="alert alert-info alert-dismissible">{{ message | safe }}</p>{% endfor %}
</div>
</div>
</div>
</div>
</div>{% endif %}
4 changes: 4 additions & 0 deletions templates/jobs/job.html
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@
<td scope="row">Return Code</td>
<td>{{ job.returncode }}</td>
</tr>
{% if job.state != "INACTIVE" %}<tr>
<td scope="row">Actions</td>
<td><a href="/job/{{ job.id }}/cancel" type="button" class="btn-warning btn">Request Cancel</a></td>
</tr>{% endif %}
</tbody>
</table>
</div>
Expand Down

0 comments on commit da6f92c

Please sign in to comment.