Skip to content

Commit 641e663

Browse files
Filter running jobs by project event instead of commit SHA (#3027)
Filter running jobs by project event instead of commit SHA Not all events carry commit_sha_before value (e.g. github.pr.Comment, gitlab.mr.Comment, github.check.Rerun), so cancellation silently does nothing on retriggers. Resolve this similarly to what Koji builds cancellation does by querying currently running jobs via ProjectEventModel.type + ProjectEventModel.event_id (project object identity — e.g. a specific PR or branch), which works for all event types regardless of forge or trigger method. Resolves: #3005 Reviewed-by: gemini-code-assist[bot] Reviewed-by: Nikola Forró
2 parents 43fea6c + 166c5a8 commit 641e663

File tree

4 files changed

+90
-36
lines changed

4 files changed

+90
-36
lines changed

packit_service/models.py

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,15 +2176,20 @@ def get_by_id(cls, group_id: int) -> Optional["CoprBuildGroupModel"]:
21762176
return session.query(CoprBuildGroupModel).filter_by(id=group_id).first()
21772177

21782178
@classmethod
2179-
def get_running(cls, commit_sha: str) -> Iterable[tuple["CoprBuildTargetModel"]]:
2180-
"""Get list of currently running Copr builds matching the passed
2181-
arguments.
2179+
def get_running(
2180+
cls,
2181+
project_event_type: ProjectEventModelType,
2182+
event_id: int,
2183+
) -> Iterable[tuple["CoprBuildTargetModel"]]:
2184+
"""Get list of currently running Copr builds for a given project object
2185+
(e.g. a PR or branch).
21822186
21832187
Args:
2184-
commit_sha: Commit hash that is used for filtering the running jobs.
2188+
project_event_type: Type of the project event (e.g. pull_request).
2189+
event_id: ID of the project object (e.g. PullRequestModel.id).
21852190
21862191
Returns:
2187-
An iterable over Copr target models that are curently in queue
2192+
An iterable over Copr target models that are currently in queue
21882193
(running) or waiting for an SRPM.
21892194
"""
21902195
q = (
@@ -2193,7 +2198,8 @@ def get_running(cls, commit_sha: str) -> Iterable[tuple["CoprBuildTargetModel"]]
21932198
.join(PipelineModel)
21942199
.join(ProjectEventModel)
21952200
.filter(
2196-
ProjectEventModel.commit_sha == commit_sha,
2201+
ProjectEventModel.type == project_event_type,
2202+
ProjectEventModel.event_id == event_id,
21972203
CoprBuildTargetModel.status.in_(
21982204
(BuildStatus.pending, BuildStatus.waiting_for_srpm)
21992205
),
@@ -3622,12 +3628,18 @@ def get_by_id(cls, group_id: int) -> Optional["TFTTestRunGroupModel"]:
36223628
return session.query(TFTTestRunGroupModel).filter_by(id=group_id).first()
36233629

36243630
@classmethod
3625-
def get_running(cls, commit_sha: str, ranch: str) -> Iterable[tuple["TFTTestRunTargetModel"]]:
3626-
"""Get list of currently running Testing Farm runs matching the passed
3627-
arguments.
3631+
def get_running(
3632+
cls,
3633+
project_event_type: ProjectEventModelType,
3634+
event_id: int,
3635+
ranch: str,
3636+
) -> Iterable[tuple["TFTTestRunTargetModel"]]:
3637+
"""Get list of currently running Testing Farm runs for a given project
3638+
object (e.g. a PR or branch).
36283639
36293640
Args:
3630-
commit_sha: Commit hash that is used for filtering the running jobs.
3641+
project_event_type: Type of the project event (e.g. pull_request).
3642+
event_id: ID of the project object (e.g. PullRequestModel.id).
36313643
ranch: Testing Farm ranch where the tests are supposed to be run.
36323644
36333645
Returns:
@@ -3641,7 +3653,8 @@ def get_running(cls, commit_sha: str, ranch: str) -> Iterable[tuple["TFTTestRunT
36413653
.join(PipelineModel)
36423654
.join(ProjectEventModel)
36433655
.filter(
3644-
ProjectEventModel.commit_sha == commit_sha,
3656+
ProjectEventModel.type == project_event_type,
3657+
ProjectEventModel.event_id == event_id,
36453658
TFTTestRunGroupModel.ranch == ranch,
36463659
TFTTestRunTargetModel.status.in_(
36473660
(
@@ -4932,12 +4945,17 @@ def get_by_id(cls, group_id: int) -> Optional["LogDetectiveRunGroupModel"]:
49324945
return session.query(LogDetectiveRunGroupModel).filter_by(id=group_id).first()
49334946

49344947
@classmethod
4935-
def get_running(cls, commit_sha: str) -> Iterable[tuple[LogDetectiveRunModel]]:
4936-
"""Get list of currently running Log Detective runs matching the passed
4937-
arguments.
4948+
def get_running(
4949+
cls,
4950+
project_event_type: ProjectEventModelType,
4951+
event_id: int,
4952+
) -> Iterable[tuple[LogDetectiveRunModel]]:
4953+
"""Get list of currently running Log Detective runs for a given project
4954+
object (e.g. a PR or branch).
49384955
49394956
Args:
4940-
commit_sha: Commit hash that is used for filtering the running jobs.
4957+
project_event_type: Type of the project event (e.g. pull_request).
4958+
event_id: ID of the project object (e.g. PullRequestModel.id).
49414959
49424960
Returns:
49434961
An iterable over Log Detective run models representing Log Detective runs
@@ -4949,7 +4967,8 @@ def get_running(cls, commit_sha: str) -> Iterable[tuple[LogDetectiveRunModel]]:
49494967
.join(PipelineModel)
49504968
.join(ProjectEventModel)
49514969
.filter(
4952-
ProjectEventModel.commit_sha == commit_sha,
4970+
ProjectEventModel.type == project_event_type,
4971+
ProjectEventModel.event_id == event_id,
49534972
LogDetectiveRunModel.status == LogDetectiveResult.running,
49544973
)
49554974
)

packit_service/worker/helpers/build/copr_build.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,10 +1024,10 @@ def get_configured_targets(self) -> set[str]:
10241024
def get_running_jobs(
10251025
self,
10261026
) -> Union[Iterable[tuple["CoprBuildTargetModel"]], Iterable[tuple["TFTTestRunTargetModel"]]]:
1027-
if sha := self.metadata.commit_sha_before:
1028-
yield from CoprBuildGroupModel.get_running(commit_sha=sha)
1029-
1030-
# [SAFETY] When there's no previous commit hash, yields nothing
1027+
yield from CoprBuildGroupModel.get_running(
1028+
project_event_type=self.db_project_event.type,
1029+
event_id=self.db_project_event.event_id,
1030+
)
10311031

10321032
def cancel_running_builds(self):
10331033
running_builds = list(self.get_running_jobs())

packit_service/worker/helpers/testing_farm.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,12 +1233,11 @@ def report_status_to_configured_job(
12331233
)
12341234

12351235
def get_running_jobs(self) -> Iterable[tuple["TFTTestRunTargetModel"]]:
1236-
if sha := self.metadata.commit_sha_before:
1237-
yield from TFTTestRunGroupModel.get_running(
1238-
commit_sha=sha, ranch=self.tft_client.default_ranch
1239-
)
1240-
1241-
# [SAFETY] When there's no previous commit hash, yields nothing
1236+
yield from TFTTestRunGroupModel.get_running(
1237+
project_event_type=self.db_project_event.type,
1238+
event_id=self.db_project_event.event_id,
1239+
ranch=self.tft_client.default_ranch,
1240+
)
12421241

12431242
def cancel_running_tests(self):
12441243
running_tests = list(self.get_running_jobs())

tests_openshift/database/test_models.py

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,7 +1274,12 @@ def test_create_koji_tag_request(clean_before_and_after, a_koji_tag_request):
12741274
assert a_koji_tag_request.get_project().project_url == SampleValues.project_url
12751275

12761276

1277-
def test_copr_get_running(clean_before_and_after, pr_model, srpm_build_model_with_new_run_for_pr):
1277+
def test_copr_get_running(
1278+
clean_before_and_after,
1279+
pr_model,
1280+
pr_project_event_model,
1281+
srpm_build_model_with_new_run_for_pr,
1282+
):
12781283
_, run_model = srpm_build_model_with_new_run_for_pr
12791284
group, _ = CoprBuildGroupModel.create(run_model=run_model)
12801285

@@ -1294,15 +1299,25 @@ def test_copr_get_running(clean_before_and_after, pr_model, srpm_build_model_wit
12941299
copr_build_group=group,
12951300
)
12961301

1297-
running = list(CoprBuildGroupModel.get_running(commit_sha=SampleValues.commit_sha))
1302+
running = list(
1303+
CoprBuildGroupModel.get_running(
1304+
project_event_type=pr_project_event_model.type,
1305+
event_id=pr_project_event_model.event_id,
1306+
)
1307+
)
12981308
assert running, "There are some running builds present"
12991309
assert len(running) == 3, "There are exactly 3 builds running"
13001310
assert {build.build_id for (build,) in running} == {"1", "2"}, (
13011311
"Exactly ‹1› and ‹2› are in the running state"
13021312
)
13031313

13041314

1305-
def test_tmt_get_running(clean_before_and_after, pr_model, srpm_build_model_with_new_run_for_pr):
1315+
def test_tmt_get_running(
1316+
clean_before_and_after,
1317+
pr_model,
1318+
pr_project_event_model,
1319+
srpm_build_model_with_new_run_for_pr,
1320+
):
13061321
_, run_model = srpm_build_model_with_new_run_for_pr
13071322
group = TFTTestRunGroupModel.create(run_model, ranch="public")
13081323

@@ -1320,7 +1335,11 @@ def test_tmt_get_running(clean_before_and_after, pr_model, srpm_build_model_with
13201335
)
13211336

13221337
running = list(
1323-
TFTTestRunGroupModel.get_running(commit_sha=SampleValues.commit_sha, ranch="public")
1338+
TFTTestRunGroupModel.get_running(
1339+
project_event_type=pr_project_event_model.type,
1340+
event_id=pr_project_event_model.event_id,
1341+
ranch="public",
1342+
)
13241343
)
13251344
assert running, "There are some running tests present"
13261345
assert len(running) == 2, "There are exactly 2 tests running"
@@ -1330,7 +1349,10 @@ def test_tmt_get_running(clean_before_and_after, pr_model, srpm_build_model_with
13301349

13311350

13321351
def test_tmt_get_running_different_ranches(
1333-
clean_before_and_after, pr_model, srpm_build_model_with_new_run_for_pr
1352+
clean_before_and_after,
1353+
pr_model,
1354+
pr_project_event_model,
1355+
srpm_build_model_with_new_run_for_pr,
13341356
):
13351357
_, run_model = srpm_build_model_with_new_run_for_pr
13361358

@@ -1359,7 +1381,11 @@ def test_tmt_get_running_different_ranches(
13591381
)
13601382

13611383
running = list(
1362-
TFTTestRunGroupModel.get_running(commit_sha=SampleValues.commit_sha, ranch="public")
1384+
TFTTestRunGroupModel.get_running(
1385+
project_event_type=pr_project_event_model.type,
1386+
event_id=pr_project_event_model.event_id,
1387+
ranch="public",
1388+
)
13631389
)
13641390
assert running, "There are some running tests present"
13651391
assert len(running) == 2, "There are exactly 2 tests running in the public ranch"
@@ -1368,7 +1394,11 @@ def test_tmt_get_running_different_ranches(
13681394
)
13691395

13701396
running = list(
1371-
TFTTestRunGroupModel.get_running(commit_sha=SampleValues.commit_sha, ranch="redhat")
1397+
TFTTestRunGroupModel.get_running(
1398+
project_event_type=pr_project_event_model.type,
1399+
event_id=pr_project_event_model.event_id,
1400+
ranch="redhat",
1401+
)
13721402
)
13731403
assert running, "There are some running tests present"
13741404
assert len(running) == 2, "There are exactly 2 tests running in the redhat ranch"
@@ -1508,7 +1538,9 @@ def test_log_detective_run_group_targets(
15081538
assert group.grouped_targets[0] == run_target
15091539

15101540

1511-
def test_log_detective_get_running(clean_before_and_after, srpm_build_model_with_new_run_for_pr):
1541+
def test_log_detective_get_running(
1542+
clean_before_and_after, pr_project_event_model, srpm_build_model_with_new_run_for_pr
1543+
):
15121544
_, run_model = srpm_build_model_with_new_run_for_pr
15131545
group = LogDetectiveRunGroupModel.create([run_model])
15141546

@@ -1542,8 +1574,12 @@ def test_log_detective_get_running(clean_before_and_after, srpm_build_model_with
15421574
target="",
15431575
)
15441576

1545-
# The fixture uses SampleValues.commit_sha ("80201a74d96c")
1546-
running = list(LogDetectiveRunGroupModel.get_running(SampleValues.commit_sha))
1577+
running = list(
1578+
LogDetectiveRunGroupModel.get_running(
1579+
project_event_type=pr_project_event_model.type,
1580+
event_id=pr_project_event_model.event_id,
1581+
)
1582+
)
15471583

15481584
assert running, "There should be running analysis present"
15491585
assert len(running) == 1, "There is exactly 1 analysis running"

0 commit comments

Comments
 (0)