Skip to content

Commit da6f92c

Browse files
authored
Merge pull request #32 from flux-framework/add/cancel-button
add cancel button
2 parents 4d84ffc + 2b66e58 commit da6f92c

File tree

6 files changed

+47
-17
lines changed

6 files changed

+47
-17
lines changed

app/library/flux.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,22 @@ def stream_job_output(jobid):
110110
pass
111111

112112

113+
def cancel_job(jobid):
114+
"""
115+
Request a job to be cancelled by id.
116+
117+
Returns a message to the user and a return code.
118+
"""
119+
from app.main import app
120+
121+
try:
122+
flux.job.cancel(app.handle, jobid)
123+
# This is usually FileNotFoundError
124+
except Exception as e:
125+
return "Job cannot be cancelled: %s." % e, 400
126+
return "Job is requested to cancel.", 200
127+
128+
113129
def get_job_output(jobid, delay=None):
114130
"""
115131
Given a jobid, get the output.

app/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
data_root = os.path.join(root, "data")
2121
template_root = os.path.join(root, "templates")
2222

23+
# Create templates, ensure we can get flashed messages from template session
2324
templates = Jinja2Templates(directory=template_root)
25+
2426
app.mount("/static", StaticFiles(directory=static_root), name="static")
2527
app.mount("/data", StaticFiles(directory=data_root), name="data")
2628

app/routers/api.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,8 @@ async def cancel_job(jobid):
122122
"""
123123
Cancel a running flux job
124124
"""
125-
from app.main import app
126-
127-
try:
128-
flux.job.cancel(app.handle, jobid)
129-
# This is usually FileNotFoundError
130-
except Exception as e:
131-
return JSONResponse(
132-
content={"Message": "Job cannot be cancelled: %s." % e}, status_code=400
133-
)
134-
135-
return JSONResponse(
136-
content={"Message": "Job is requested to cancel."}, status_code=200
137-
)
125+
message, return_code = flux_cli.cancel_job(jobid)
126+
return JSONResponse(content={"Message": message}, status_code=return_code)
138127

139128

140129
@router.post("/jobs/submit")

app/routers/views.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import flux
22
import flux.job
33
from fastapi import APIRouter, Depends, Request
4-
from fastapi.responses import HTMLResponse
4+
from fastapi.responses import HTMLResponse, RedirectResponse
55
from fastapi.templating import Jinja2Templates
66

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

5353

5454
# View job detail (and log)
55-
@auth_views_router.get("/job/{jobid}", response_class=HTMLResponse)
56-
async def job_info(request: Request, jobid):
55+
@auth_views_router.get(
56+
"/job/{jobid}",
57+
response_class=HTMLResponse,
58+
name="job_info",
59+
operation_id="job_info",
60+
)
61+
async def job_info(request: Request, jobid, msg=None):
5762
job = flux_cli.get_job(jobid)
5863

64+
# If we have a message, add to messages
65+
messages = [msg] if msg else []
66+
5967
# If not completed, ask info to return after a second of waiting
6068
if job["state"] == "INACTIVE":
6169
info = flux_cli.get_job_output(jobid)
@@ -68,6 +76,7 @@ async def job_info(request: Request, jobid):
6876
"jobs/job.html",
6977
{
7078
"title": f"Job {jobid}",
79+
"messages": messages,
7180
"request": request,
7281
"job": job,
7382
"info": info,
@@ -85,6 +94,16 @@ async def submit_job(request: Request):
8594
)
8695

8796

97+
# Button to cancel a job
98+
@auth_views_router.get("/job/{jobid}/cancel", response_class=HTMLResponse)
99+
async def cancel_job(request: Request, jobid):
100+
from app.main import app
101+
102+
message, _ = flux_cli.cancel_job(jobid)
103+
url = app.url_path_for(name="job_info", jobid=jobid) + "?msg=" + message
104+
return RedirectResponse(url=url)
105+
106+
88107
@auth_views_router.post("/jobs/submit")
89108
async def submit_job_post(request: Request):
90109
"""

templates/include/messages.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<div class="col">
55
<div class="mb-3">{% for message in messages %}
66
<p class="alert alert-info alert-dismissible">{{ message | safe }}</p>{% endfor %}
7-
</div>
7+
</div>
88
</div>
99
</div>
1010
</div>{% endif %}

templates/jobs/job.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
<td scope="row">Return Code</td>
7070
<td>{{ job.returncode }}</td>
7171
</tr>
72+
{% if job.state != "INACTIVE" %}<tr>
73+
<td scope="row">Actions</td>
74+
<td><a href="/job/{{ job.id }}/cancel" type="button" class="btn-warning btn">Request Cancel</a></td>
75+
</tr>{% endif %}
7276
</tbody>
7377
</table>
7478
</div>

0 commit comments

Comments
 (0)