Skip to content

Commit b72b313

Browse files
committed
landing_job: add method to show pr landing status (bug 2032164)
1 parent 4ac63ab commit b72b313

2 files changed

Lines changed: 41 additions & 22 deletions

File tree

src/lando/api/views.py

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import json
2-
from collections import defaultdict
32
from datetime import datetime
43
from functools import wraps
54
from typing import Callable
@@ -25,7 +24,7 @@
2524
Revision,
2625
add_revisions_to_job,
2726
)
28-
from lando.main.models.landing_job import get_jobs_for_pull
27+
from lando.main.models.landing_job import get_pull_request_last_landing_job_status
2928
from lando.main.models.revision import DiffWarning, DiffWarningStatus
3029
from lando.main.scm import SCMType
3130
from lando.utils.github import (
@@ -234,25 +233,9 @@ def get(
234233
self, request: WSGIRequest, repo_name: int, pull_number: int
235234
) -> JsonResponse:
236235
"""Return the status of a pull request based on landing job counts."""
237-
238-
landing_jobs = get_jobs_for_pull(self.target_repo, pull_number)
239-
landing_jobs_by_status = defaultdict(list)
240-
for landing_job in landing_jobs:
241-
landing_jobs_by_status[landing_job.status].append(landing_job.id)
242-
243-
status = None
244-
# Return the first encountered status in this list.
245-
for _status in [
246-
JobStatus.LANDED,
247-
JobStatus.CREATED,
248-
JobStatus.SUBMITTED,
249-
JobStatus.IN_PROGRESS,
250-
JobStatus.FAILED,
251-
]:
252-
if landing_jobs_by_status[_status]:
253-
status = str(_status).lower()
254-
break
255-
236+
status = str(
237+
get_pull_request_last_landing_job_status(repo_name, pull_number)
238+
).lower()
256239
return JsonResponse({"status": status}, status=200)
257240

258241
@method_decorator(require_authenticated_user)

src/lando/main/models/landing_job.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
import logging
3+
from collections import defaultdict
34
from collections.abc import Iterable
45
from pathlib import Path
56
from typing import Any
@@ -10,7 +11,7 @@
1011
from mots.config import FileConfig
1112
from mots.directory import Directory
1213

13-
from lando.main.models.jobs import BaseJob
14+
from lando.main.models.jobs import BaseJob, JobStatus
1415
from lando.main.models.repo import Repo
1516
from lando.main.models.revision import Revision, RevisionLandingJob
1617

@@ -312,6 +313,41 @@ def add_revisions_to_job(revisions: list[Revision], job: LandingJob):
312313
job.sort_revisions(revisions)
313314

314315

316+
def get_pull_request_last_landing_job_status(
317+
repo_name: str, pull_number: int
318+
) -> JobStatus:
319+
"""Return a heuristically determined status based on related jobs."""
320+
target_repo = Repo.objects.get(name=repo_name)
321+
landing_jobs = get_jobs_for_pull(target_repo, pull_number)
322+
landing_jobs_by_status = defaultdict(list)
323+
for landing_job in landing_jobs:
324+
landing_jobs_by_status[landing_job.status].append(landing_job.id)
325+
326+
# A LANDED status implies that the pull request has landed. A
327+
# DEFERRED status implies that the last job has been deferred.
328+
# For all other cases, there may be other permanently failed landing
329+
# jobs that are no longer relevant to the status of the pull request as
330+
# a whole.
331+
332+
# A CREATED status implies that the latest landing job is created.
333+
# A SUBMITTED status implies that the latest landing job is submitted.
334+
# An IN_PROGRESS status implies that the latest landing job is in progress.
335+
# A FAILED status implies that the latest landing job has failed.
336+
337+
# Return the first encountered status in this list.
338+
for _status in [
339+
JobStatus.LANDED,
340+
JobStatus.CREATED,
341+
JobStatus.SUBMITTED,
342+
JobStatus.IN_PROGRESS,
343+
JobStatus.DEFERRED,
344+
JobStatus.FAILED,
345+
JobStatus.CANCELLED,
346+
]:
347+
if landing_jobs_by_status[_status]:
348+
return _status
349+
350+
315351
def get_jobs_for_pull(target_repo: Repo, pull_number: int) -> QuerySet[LandingJob]:
316352
"""Given a target repo and a pull number, return all landing jobs."""
317353
revisions = Revision.objects.filter(

0 commit comments

Comments
 (0)