Skip to content

Commit 6eb1ebc

Browse files
authored
fix: buildrun status false failed (#1300)
Sometimes the buildrun status is considered failed when in reality it is not failed. This should address that. It is because of some transient state in the buildrun conditions.
1 parent b74955a commit 6eb1ebc

2 files changed

Lines changed: 46 additions & 38 deletions

File tree

components/renku_data_services/session/crs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import BaseModel, ConfigDict, Field, RootModel
66

7-
from renku_data_services.session.cr_shipwright_buildrun import Build, Git, ParamValue, Strategy, Toleration
7+
from renku_data_services.session.cr_shipwright_buildrun import Build, Condition, Git, ParamValue, Strategy, Toleration
88
from renku_data_services.session.cr_shipwright_buildrun import Model as _BuildRun
99
from renku_data_services.session.cr_shipwright_buildrun import Output as BuildOutput
1010
from renku_data_services.session.cr_shipwright_buildrun import Retention1 as Retention

components/renku_data_services/session/k8s_client.py

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""An abstraction over the kr8s kubernetes client and the k8s-watcher."""
22

33
from collections.abc import AsyncIterable
4+
from logging import getLogger
45
from typing import TYPE_CHECKING
56

67
import httpx
@@ -21,11 +22,13 @@
2122
DUMMY_TASK_RUN_USER_ID,
2223
TASK_RUN_GVK,
2324
)
24-
from renku_data_services.session.crs import BuildRun, TaskRun
25+
from renku_data_services.session.crs import BuildRun, Condition, TaskRun
2526

2627
if TYPE_CHECKING:
2728
from renku_data_services.k8s.clients import K8sClusterClientsPool
2829

30+
logger = getLogger(__name__)
31+
2932

3033
# NOTE The type ignore below is because the kr8s library has no type stubs, they claim pyright better handles type hints
3134
class ShipwrightBuildRunV1Beta1Kr8s(APIObject):
@@ -256,6 +259,7 @@ async def update_image_build_status(
256259
k8s_build = await self.get_build_run(name=buildrun_name, user_id=user_id)
257260

258261
if k8s_build is None:
262+
logger.warning(f"Buildrun {buildrun_name} considered failed because we cannot find it in the cluster.")
259263
return models.ShipwrightBuildStatusUpdate(
260264
update=models.ShipwrightBuildStatusUpdateContent(status=models.BuildStatus.failed)
261265
), None
@@ -287,44 +291,48 @@ async def update_image_build_status(
287291
# So I needed something to keep mypy happy. The real name of the field is "type"
288292
condition = next(filter(lambda c: c.type == "Succeeded", conditions or []), None)
289293

290-
if condition is not None and condition.status not in ["True", "False"]:
291-
# The buildrun is still running or pending
292-
return models.ShipwrightBuildStatusUpdate(update=None), k8s_build.frontend_variant
293-
294-
buildSpec = k8s_build_status.buildSpec
295-
output = buildSpec.output if buildSpec else None
296-
result_image = output.image if output else "unknown"
297-
298-
source = buildSpec.source if buildSpec else None
299-
git_obj = source.git if source else None
300-
result_repository_url = git_obj.url if git_obj else "unknown"
301-
302-
source_2 = k8s_build_status.source
303-
git_obj_2 = source_2.git if source_2 else None
304-
result_repository_git_commit_sha = git_obj_2.commitSha if git_obj_2 else None
305-
result_repository_git_commit_sha = result_repository_git_commit_sha or "unknown"
306-
307-
if condition is not None and condition.reason == "Succeeded" and condition.status == "True":
308-
return models.ShipwrightBuildStatusUpdate(
309-
update=models.ShipwrightBuildStatusUpdateContent(
310-
status=models.BuildStatus.succeeded,
311-
completed_at=completion_time,
312-
result=models.BuildResult(
294+
match condition:
295+
case Condition(reason="Succeeded", status="True"):
296+
buildSpec = k8s_build_status.buildSpec
297+
output = buildSpec.output if buildSpec else None
298+
result_image = output.image if output else "unknown"
299+
300+
source = buildSpec.source if buildSpec else None
301+
git_obj = source.git if source else None
302+
result_repository_url = git_obj.url if git_obj else "unknown"
303+
304+
source_2 = k8s_build_status.source
305+
git_obj_2 = source_2.git if source_2 else None
306+
result_repository_git_commit_sha = git_obj_2.commitSha if git_obj_2 else None
307+
result_repository_git_commit_sha = result_repository_git_commit_sha or "unknown"
308+
return models.ShipwrightBuildStatusUpdate(
309+
update=models.ShipwrightBuildStatusUpdateContent(
310+
status=models.BuildStatus.succeeded,
313311
completed_at=completion_time,
314-
image=result_image,
315-
repository_url=result_repository_url,
316-
repository_git_commit_sha=result_repository_git_commit_sha,
317-
),
318-
)
319-
), k8s_build.frontend_variant
320-
else:
321-
return models.ShipwrightBuildStatusUpdate(
322-
update=models.ShipwrightBuildStatusUpdateContent(
323-
status=models.BuildStatus.failed,
324-
completed_at=completion_time,
325-
error_reason=condition.reason if condition is not None else None,
312+
result=models.BuildResult(
313+
completed_at=completion_time,
314+
image=result_image,
315+
repository_url=result_repository_url,
316+
repository_git_commit_sha=result_repository_git_commit_sha,
317+
),
318+
)
319+
), k8s_build.frontend_variant
320+
case Condition(status="False", type="Succeeded"):
321+
logger.info(f"Buildrun {buildrun_name} failed with condition {condition}")
322+
return models.ShipwrightBuildStatusUpdate(
323+
update=models.ShipwrightBuildStatusUpdateContent(
324+
status=models.BuildStatus.failed,
325+
completed_at=completion_time,
326+
error_reason=condition.reason if condition is not None else None,
327+
)
328+
), k8s_build.frontend_variant
329+
case None:
330+
logger.warning(
331+
f"Buildrun {buildrun_name} is missing Succeeded condition, considered to be in progress."
326332
)
327-
), k8s_build.frontend_variant
333+
return models.ShipwrightBuildStatusUpdate(update=None), k8s_build.frontend_variant
334+
case _:
335+
return models.ShipwrightBuildStatusUpdate(update=None), k8s_build.frontend_variant
328336

329337
async def get_image_build_logs(
330338
self, buildrun_name: str, user_id: str, max_log_lines: int | None = None

0 commit comments

Comments
 (0)