Skip to content

Commit f55ed0d

Browse files
committed
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 39eaedc commit f55ed0d

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, 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
@@ -19,11 +20,13 @@
1920
DUMMY_TASK_RUN_USER_ID,
2021
TASK_RUN_GVK,
2122
)
22-
from renku_data_services.session.crs import BuildRun, TaskRun
23+
from renku_data_services.session.crs import BuildRun, Condition, TaskRun
2324

2425
if TYPE_CHECKING:
2526
from renku_data_services.k8s.clients import K8sClusterClientsPool
2627

28+
logger = getLogger(__name__)
29+
2730

2831
# NOTE The type ignore below is because the kr8s library has no type stubs, they claim pyright better handles type hints
2932
class ShipwrightBuildRunV1Beta1Kr8s(APIObject):
@@ -215,6 +218,7 @@ async def update_image_build_status(
215218
k8s_build = await self.get_build_run(name=buildrun_name, user_id=user_id)
216219

217220
if k8s_build is None:
221+
logger.warning(f"Buildrun {buildrun_name} considered failed because we cannot find it in the cluster.")
218222
return models.ShipwrightBuildStatusUpdate(
219223
update=models.ShipwrightBuildStatusUpdateContent(status=models.BuildStatus.failed)
220224
), None
@@ -246,44 +250,48 @@ async def update_image_build_status(
246250
# So I needed something to keep mypy happy. The real name of the field is "type"
247251
condition = next(filter(lambda c: c.type == "Succeeded", conditions or []), None)
248252

249-
if condition is not None and condition.status not in ["True", "False"]:
250-
# The buildrun is still running or pending
251-
return models.ShipwrightBuildStatusUpdate(update=None), k8s_build.frontend_variant
252-
253-
buildSpec = k8s_build_status.buildSpec
254-
output = buildSpec.output if buildSpec else None
255-
result_image = output.image if output else "unknown"
256-
257-
source = buildSpec.source if buildSpec else None
258-
git_obj = source.git if source else None
259-
result_repository_url = git_obj.url if git_obj else "unknown"
260-
261-
source_2 = k8s_build_status.source
262-
git_obj_2 = source_2.git if source_2 else None
263-
result_repository_git_commit_sha = git_obj_2.commitSha if git_obj_2 else None
264-
result_repository_git_commit_sha = result_repository_git_commit_sha or "unknown"
265-
266-
if condition is not None and condition.reason == "Succeeded" and condition.status == "True":
267-
return models.ShipwrightBuildStatusUpdate(
268-
update=models.ShipwrightBuildStatusUpdateContent(
269-
status=models.BuildStatus.succeeded,
270-
completed_at=completion_time,
271-
result=models.BuildResult(
253+
match condition:
254+
case Condition(reason="Succeeded", status="True"):
255+
buildSpec = k8s_build_status.buildSpec
256+
output = buildSpec.output if buildSpec else None
257+
result_image = output.image if output else "unknown"
258+
259+
source = buildSpec.source if buildSpec else None
260+
git_obj = source.git if source else None
261+
result_repository_url = git_obj.url if git_obj else "unknown"
262+
263+
source_2 = k8s_build_status.source
264+
git_obj_2 = source_2.git if source_2 else None
265+
result_repository_git_commit_sha = git_obj_2.commitSha if git_obj_2 else None
266+
result_repository_git_commit_sha = result_repository_git_commit_sha or "unknown"
267+
return models.ShipwrightBuildStatusUpdate(
268+
update=models.ShipwrightBuildStatusUpdateContent(
269+
status=models.BuildStatus.succeeded,
272270
completed_at=completion_time,
273-
image=result_image,
274-
repository_url=result_repository_url,
275-
repository_git_commit_sha=result_repository_git_commit_sha,
276-
),
277-
)
278-
), k8s_build.frontend_variant
279-
else:
280-
return models.ShipwrightBuildStatusUpdate(
281-
update=models.ShipwrightBuildStatusUpdateContent(
282-
status=models.BuildStatus.failed,
283-
completed_at=completion_time,
284-
error_reason=condition.reason if condition is not None else None,
271+
result=models.BuildResult(
272+
completed_at=completion_time,
273+
image=result_image,
274+
repository_url=result_repository_url,
275+
repository_git_commit_sha=result_repository_git_commit_sha,
276+
),
277+
)
278+
), k8s_build.frontend_variant
279+
case Condition(status="False", type="Succeeded"):
280+
logger.info(f"Buildrun {buildrun_name} failed with condition {condition}")
281+
return models.ShipwrightBuildStatusUpdate(
282+
update=models.ShipwrightBuildStatusUpdateContent(
283+
status=models.BuildStatus.failed,
284+
completed_at=completion_time,
285+
error_reason=condition.reason if condition is not None else None,
286+
)
287+
), k8s_build.frontend_variant
288+
case None:
289+
logger.warning(
290+
f"Buildrun {buildrun_name} is missing Succeeded condition, considered to be in progress."
285291
)
286-
), k8s_build.frontend_variant
292+
return models.ShipwrightBuildStatusUpdate(update=None), k8s_build.frontend_variant
293+
case _:
294+
return models.ShipwrightBuildStatusUpdate(update=None), k8s_build.frontend_variant
287295

288296
async def get_image_build_logs(
289297
self, buildrun_name: str, user_id: str, max_log_lines: int | None = None

0 commit comments

Comments
 (0)