Skip to content

Commit 129b5e9

Browse files
committed
kill: add tests + fix run owner logic
Signed-off-by: Vallari Agrawal <[email protected]>
1 parent 784638f commit 129b5e9

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/teuthology_api/services/kill.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async def run(args, send_logs: bool, token: dict, request: Request):
3333
log.error("teuthology-kill is missing --run")
3434
raise HTTPException(status_code=400, detail="--run is a required argument")
3535

36-
if (run_owner.lower() != username.lower()) or (
36+
if (run_owner.lower() != username.lower()) and (
3737
run_owner.lower() != f"scheduled_{username.lower()}@teuthology"
3838
):
3939
isUserAdmin = await isAdmin(username, token["access_token"])

tests/test_kill.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
async def override_get_token():
13-
return {"access_token": "token_123", "token_type": "bearer"}
13+
return {"access_token": "token_123", "token_type": "bearer", "isUserAdmin": False}
1414

1515

1616
app.dependency_overrides[get_token] = override_get_token
@@ -30,16 +30,22 @@ async def override_get_token():
3030
}
3131

3232

33+
@patch("teuthology_api.services.kill.isAdmin")
3334
@patch("subprocess.Popen")
3435
@patch("teuthology_api.services.kill.get_run_details")
3536
@patch("teuthology_api.services.kill.get_username")
36-
def test_kill_run_success(m_get_username, m_get_run_details, m_popen):
37+
def test_kill_run_success(m_get_username, m_get_run_details, m_popen, m_isAdmin):
3738
m_get_username.return_value = "user1"
38-
m_get_run_details.return_value = {"id": "7451978", "user": "user1"}
39+
m_isAdmin.return_value = False
40+
m_get_run_details.return_value = {
41+
"id": "7451978",
42+
"user": "user1",
43+
"jobs": [{"owner": "user1"}],
44+
}
3945
mock_process = m_popen.return_value
4046
mock_process.communicate.return_value = ("logs", "")
4147
mock_process.wait.return_value = 0
42-
response = client.post("/kill", data=json.dumps(mock_kill_args))
48+
response = client.post("kill/", data=json.dumps(mock_kill_args))
4349
assert response.status_code == 200
4450
assert response.json() == {"kill": "success"}
4551

@@ -48,3 +54,42 @@ def test_kill_run_fail():
4854
response = client.post("/kill", data=json.dumps(mock_kill_args))
4955
assert response.status_code == 401
5056
assert response.json() == {"detail": "You need to be logged in"}
57+
58+
59+
@patch("teuthology_api.services.kill.isAdmin")
60+
@patch("subprocess.Popen")
61+
@patch("teuthology_api.services.kill.get_run_details")
62+
@patch("teuthology_api.services.kill.get_username")
63+
def test_admin_kill_run_success(m_get_username, m_get_run_details, m_popen, m_isAdmin):
64+
m_get_username.return_value = "user1"
65+
m_isAdmin.return_value = True
66+
m_get_run_details.return_value = {
67+
"id": "7451978",
68+
"user": "user1",
69+
"jobs": [{"owner": "someone_else"}],
70+
}
71+
mock_process = m_popen.return_value
72+
mock_process.communicate.return_value = ("logs", "")
73+
mock_process.wait.return_value = 0
74+
response = client.post("kill/", data=json.dumps(mock_kill_args))
75+
assert response.status_code == 200
76+
assert response.json() == {"kill": "success"}
77+
78+
79+
@patch("teuthology_api.services.kill.isAdmin")
80+
@patch("subprocess.Popen")
81+
@patch("teuthology_api.services.kill.get_run_details")
82+
@patch("teuthology_api.services.kill.get_username")
83+
def test_non_admin_kill_run_fail(m_get_username, m_get_run_details, m_popen, m_isAdmin):
84+
m_get_username.return_value = "user1"
85+
m_isAdmin.return_value = False
86+
m_get_run_details.return_value = {
87+
"id": "7451978",
88+
"user": "user1",
89+
"jobs": [{"owner": "someone_else"}],
90+
}
91+
mock_process = m_popen.return_value
92+
mock_process.communicate.return_value = ("logs", "")
93+
mock_process.wait.return_value = 0
94+
response = client.post("kill/", data=json.dumps(mock_kill_args))
95+
assert response.status_code == 401 # run doesn't belong to user + user is not admin

0 commit comments

Comments
 (0)