|
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 |
|
19 | 20 | DUMMY_TASK_RUN_USER_ID, |
20 | 21 | TASK_RUN_GVK, |
21 | 22 | ) |
22 | | -from renku_data_services.session.crs import BuildRun, TaskRun |
| 23 | +from renku_data_services.session.crs import BuildRun, Condition, TaskRun |
23 | 24 |
|
24 | 25 | if TYPE_CHECKING: |
25 | 26 | from renku_data_services.k8s.clients import K8sClusterClientsPool |
26 | 27 |
|
| 28 | +logger = getLogger(__name__) |
| 29 | + |
27 | 30 |
|
28 | 31 | # NOTE The type ignore below is because the kr8s library has no type stubs, they claim pyright better handles type hints |
29 | 32 | class ShipwrightBuildRunV1Beta1Kr8s(APIObject): |
@@ -215,6 +218,7 @@ async def update_image_build_status( |
215 | 218 | k8s_build = await self.get_build_run(name=buildrun_name, user_id=user_id) |
216 | 219 |
|
217 | 220 | if k8s_build is None: |
| 221 | + logger.warning(f"Buildrun {buildrun_name} considered failed because we cannot find it in the cluster.") |
218 | 222 | return models.ShipwrightBuildStatusUpdate( |
219 | 223 | update=models.ShipwrightBuildStatusUpdateContent(status=models.BuildStatus.failed) |
220 | 224 | ), None |
@@ -246,44 +250,48 @@ async def update_image_build_status( |
246 | 250 | # So I needed something to keep mypy happy. The real name of the field is "type" |
247 | 251 | condition = next(filter(lambda c: c.type == "Succeeded", conditions or []), None) |
248 | 252 |
|
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, |
272 | 270 | 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." |
285 | 291 | ) |
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 |
287 | 295 |
|
288 | 296 | async def get_image_build_logs( |
289 | 297 | self, buildrun_name: str, user_id: str, max_log_lines: int | None = None |
|
0 commit comments