From c5d6f909baf0bc9667f9f817346c15c178aa7b94 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:16:39 +0000 Subject: [PATCH 1/7] Initial plan From 474226d4f048c462025168897acfc9a1a7a481fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:20:52 +0000 Subject: [PATCH 2/7] Initial analysis of JobError stage field addition Co-authored-by: agners <34061+agners@users.noreply.github.com> --- aiohasupervisor/models/jobs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiohasupervisor/models/jobs.py b/aiohasupervisor/models/jobs.py index 2ef6223..b1cf9ef 100644 --- a/aiohasupervisor/models/jobs.py +++ b/aiohasupervisor/models/jobs.py @@ -3,9 +3,9 @@ from __future__ import annotations from dataclasses import dataclass -from datetime import datetime # noqa: TCH003 +from datetime import datetime # noqa: TC003 from enum import StrEnum -from uuid import UUID # noqa: TCH003 +from uuid import UUID # noqa: TC003 from .base import Request, ResponseData From b73656b7ab84e38ced30527722f482a0c155a74f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:24:56 +0000 Subject: [PATCH 3/7] Add stage field to JobError model Co-authored-by: agners <34061+agners@users.noreply.github.com> --- aiohasupervisor/models/jobs.py | 1 + tests/fixtures/jobs_info.json | 3 ++- tests/fixtures/jobs_info_no_stage.json | 24 ++++++++++++++++++++++++ tests/test_jobs.py | 20 ++++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/jobs_info_no_stage.json diff --git a/aiohasupervisor/models/jobs.py b/aiohasupervisor/models/jobs.py index b1cf9ef..6cfe71d 100644 --- a/aiohasupervisor/models/jobs.py +++ b/aiohasupervisor/models/jobs.py @@ -45,6 +45,7 @@ class JobError(ResponseData): type: str message: str + stage: str | None = None @dataclass(slots=True, frozen=True) diff --git a/tests/fixtures/jobs_info.json b/tests/fixtures/jobs_info.json index 3c6667f..ea27d8d 100644 --- a/tests/fixtures/jobs_info.json +++ b/tests/fixtures/jobs_info.json @@ -48,7 +48,8 @@ "errors": [ { "type": "BackupInvalidError", - "message": "Invalid password for backup cfddca18" + "message": "Invalid password for backup cfddca18", + "stage": "restore_backup" } ], "created": "2025-01-30T20:55:15.000000+00:00", diff --git a/tests/fixtures/jobs_info_no_stage.json b/tests/fixtures/jobs_info_no_stage.json new file mode 100644 index 0000000..492b754 --- /dev/null +++ b/tests/fixtures/jobs_info_no_stage.json @@ -0,0 +1,24 @@ +{ + "result": "ok", + "data": { + "ignore_conditions": ["free_space"], + "jobs": [ + { + "name": "test_job_error_no_stage", + "reference": "test123", + "uuid": "3febe59311f94d6ba36f6f9f73357ca9", + "progress": 0, + "stage": null, + "done": true, + "errors": [ + { + "type": "TestError", + "message": "Test error without stage field" + } + ], + "created": "2025-01-30T20:55:12.859349+00:00", + "child_jobs": [] + } + ] + } +} \ No newline at end of file diff --git a/tests/test_jobs.py b/tests/test_jobs.py index a21b6f2..aa72a49 100644 --- a/tests/test_jobs.py +++ b/tests/test_jobs.py @@ -42,6 +42,7 @@ async def test_jobs_info( assert info.jobs[1].reference == "cfddca18" assert info.jobs[1].errors[0].type == "BackupInvalidError" assert info.jobs[1].errors[0].message == "Invalid password for backup cfddca18" + assert info.jobs[1].errors[0].stage == "restore_backup" async def test_jobs_set_options( @@ -112,3 +113,22 @@ async def test_jobs_delete_job( assert responses.requests.keys() == { ("DELETE", URL(f"{SUPERVISOR_URL}/jobs/2febe59311f94d6ba36f6f9f73357ca8")) } + + +async def test_jobs_info_backward_compatibility_no_stage( + responses: aioresponses, supervisor_client: SupervisorClient +) -> None: + """Test jobs info API with error lacking stage field for backward compatibility.""" + responses.get( + f"{SUPERVISOR_URL}/jobs/info", + status=200, + body=load_fixture("jobs_info_no_stage.json"), + ) + info = await supervisor_client.jobs.info() + assert info.ignore_conditions == [JobCondition.FREE_SPACE] + + assert info.jobs[0].name == "test_job_error_no_stage" + assert info.jobs[0].reference == "test123" + assert info.jobs[0].errors[0].type == "TestError" + assert info.jobs[0].errors[0].message == "Test error without stage field" + assert info.jobs[0].errors[0].stage is None From a10e1f4f72519c150241d70218849b86107349e1 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 26 Aug 2025 16:30:03 +0200 Subject: [PATCH 4/7] Apply suggestions from code review --- aiohasupervisor/models/jobs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiohasupervisor/models/jobs.py b/aiohasupervisor/models/jobs.py index 6cfe71d..67934c1 100644 --- a/aiohasupervisor/models/jobs.py +++ b/aiohasupervisor/models/jobs.py @@ -3,9 +3,9 @@ from __future__ import annotations from dataclasses import dataclass -from datetime import datetime # noqa: TC003 +from datetime import datetime # noqa: TCH003 from enum import StrEnum -from uuid import UUID # noqa: TC003 +from uuid import UUID # noqa: TCH003 from .base import Request, ResponseData From 2683baba1c934688f2dce242dbf99d13afbfc2fa Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 26 Aug 2025 16:32:36 +0200 Subject: [PATCH 5/7] Address prettier --- tests/fixtures/jobs_info_no_stage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/jobs_info_no_stage.json b/tests/fixtures/jobs_info_no_stage.json index 492b754..013cb7d 100644 --- a/tests/fixtures/jobs_info_no_stage.json +++ b/tests/fixtures/jobs_info_no_stage.json @@ -21,4 +21,4 @@ } ] } -} \ No newline at end of file +} From d1ee64427ac20b6caf38ae37eef4557632fadade Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 26 Aug 2025 16:40:17 +0200 Subject: [PATCH 6/7] Apply suggestions from code review Co-authored-by: Mike Degatano --- aiohasupervisor/models/jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiohasupervisor/models/jobs.py b/aiohasupervisor/models/jobs.py index 67934c1..0389025 100644 --- a/aiohasupervisor/models/jobs.py +++ b/aiohasupervisor/models/jobs.py @@ -45,7 +45,7 @@ class JobError(ResponseData): type: str message: str - stage: str | None = None + stage: str | None @dataclass(slots=True, frozen=True) From 790b46efbab1ac7e875511c782909dd602918bd3 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 26 Aug 2025 16:42:25 +0200 Subject: [PATCH 7/7] Apply suggestions from code review Co-authored-by: Mike Degatano --- tests/fixtures/jobs_info_no_stage.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fixtures/jobs_info_no_stage.json b/tests/fixtures/jobs_info_no_stage.json index 013cb7d..3f9d509 100644 --- a/tests/fixtures/jobs_info_no_stage.json +++ b/tests/fixtures/jobs_info_no_stage.json @@ -13,7 +13,8 @@ "errors": [ { "type": "TestError", - "message": "Test error without stage field" + "message": "Test error without stage field", + "stage": null } ], "created": "2025-01-30T20:55:12.859349+00:00",