|
1 | 1 | """An abstraction over the kr8s kubernetes client and the k8s-watcher.""" |
2 | 2 |
|
3 | 3 | from collections.abc import AsyncIterable |
| 4 | +from logging import getLogger |
4 | 5 | from typing import TYPE_CHECKING |
5 | 6 |
|
6 | 7 | import httpx |
|
21 | 22 | DUMMY_TASK_RUN_USER_ID, |
22 | 23 | TASK_RUN_GVK, |
23 | 24 | ) |
24 | | -from renku_data_services.session.crs import BuildRun, TaskRun |
| 25 | +from renku_data_services.session.crs import BuildRun, Condition, TaskRun |
25 | 26 |
|
26 | 27 | if TYPE_CHECKING: |
27 | 28 | from renku_data_services.k8s.clients import K8sClusterClientsPool |
28 | 29 |
|
| 30 | +logger = getLogger(__name__) |
| 31 | + |
29 | 32 |
|
30 | 33 | # NOTE The type ignore below is because the kr8s library has no type stubs, they claim pyright better handles type hints |
31 | 34 | class ShipwrightBuildRunV1Beta1Kr8s(APIObject): |
@@ -256,6 +259,7 @@ async def update_image_build_status( |
256 | 259 | k8s_build = await self.get_build_run(name=buildrun_name, user_id=user_id) |
257 | 260 |
|
258 | 261 | if k8s_build is None: |
| 262 | + logger.warning(f"Buildrun {buildrun_name} considered failed because we cannot find it in the cluster.") |
259 | 263 | return models.ShipwrightBuildStatusUpdate( |
260 | 264 | update=models.ShipwrightBuildStatusUpdateContent(status=models.BuildStatus.failed) |
261 | 265 | ), None |
@@ -287,44 +291,48 @@ async def update_image_build_status( |
287 | 291 | # So I needed something to keep mypy happy. The real name of the field is "type" |
288 | 292 | condition = next(filter(lambda c: c.type == "Succeeded", conditions or []), None) |
289 | 293 |
|
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, |
313 | 311 | 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." |
326 | 332 | ) |
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 |
328 | 336 |
|
329 | 337 | async def get_image_build_logs( |
330 | 338 | self, buildrun_name: str, user_id: str, max_log_lines: int | None = None |
|
0 commit comments