Skip to content

Commit b0d7c19

Browse files
author
Andrei Neagu
committed
reverting old interface
1 parent c2104b5 commit b0d7c19

File tree

7 files changed

+71
-9
lines changed

7 files changed

+71
-9
lines changed

packages/service-library/src/servicelib/aiohttp/long_running_tasks/_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ async def get_task_result(request: web.Request) -> web.Response | Any:
6060
long_running_manager.tasks_manager,
6161
long_running_manager.get_task_context(request),
6262
path_params.task_id,
63+
is_fasapi=False,
6364
)
6465

6566

packages/service-library/src/servicelib/fastapi/long_running_tasks/_client.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@
1313
from tenacity.stop import stop_after_attempt
1414
from tenacity.wait import wait_exponential
1515

16-
from ...long_running_tasks.errors import GenericClientError
17-
from ...long_running_tasks.models import ClientConfiguration, TaskId, TaskStatus
16+
from ...long_running_tasks.errors import GenericClientError, TaskClientResultError
17+
from ...long_running_tasks.models import (
18+
ClientConfiguration,
19+
TaskId,
20+
TaskResult,
21+
TaskStatus,
22+
)
1823

1924
_DEFAULT_HTTP_REQUESTS_TIMEOUT: Final[PositiveFloat] = 15
2025

@@ -168,7 +173,10 @@ async def get_task_result(
168173
body=result.text,
169174
)
170175

171-
return result.json()
176+
task_result = TaskResult.model_validate(result.json())
177+
if task_result.error is not None:
178+
raise TaskClientResultError(message=task_result.error)
179+
return task_result.result
172180

173181
@retry_on_http_errors
174182
async def cancel_and_delete_task(

packages/service-library/src/servicelib/fastapi/long_running_tasks/_routes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ async def get_task_result(
7676
) -> TaskResult | Any:
7777
assert request # nosec
7878
return await http_endpoint_responses.get_task_result(
79-
long_running_manager.tasks_manager, task_context=None, task_id=task_id
79+
long_running_manager.tasks_manager,
80+
task_context=None,
81+
task_id=task_id,
82+
is_fasapi=True,
8083
)
8184

8285

packages/service-library/src/servicelib/long_running_tasks/errors.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,8 @@ class GenericClientError(BaseLongRunningError):
3737
msg_template: str = (
3838
"Unexpected error while '{action}' for '{task_id}': status={status} body={body}"
3939
)
40+
41+
42+
class TaskClientResultError(BaseLongRunningError):
43+
code: str = "long_running_task.client.task_raised_error"
44+
msg_template: str = "{message}"

packages/service-library/src/servicelib/long_running_tasks/http_endpoint_responses.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,21 @@ def get_task_status(
2727

2828

2929
async def get_task_result(
30-
tasks_manager: TasksManager, task_context: TaskContext | None, task_id: TaskId
30+
tasks_manager: TasksManager,
31+
task_context: TaskContext | None,
32+
task_id: TaskId,
33+
*,
34+
is_fasapi: bool,
3135
) -> Any:
3236
try:
33-
task_result = tasks_manager.get_task_result(
34-
task_id, with_task_context=task_context
35-
)
37+
if is_fasapi:
38+
task_result = tasks_manager.get_task_result_old(
39+
task_id, with_task_context=task_context
40+
)
41+
else:
42+
task_result = tasks_manager.get_task_result(
43+
task_id, with_task_context=task_context
44+
)
3645
await tasks_manager.remove_task(
3746
task_id, with_task_context=task_context, reraise_errors=False
3847
)

packages/service-library/src/servicelib/long_running_tasks/task.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from uuid import uuid4
1111

1212
from models_library.api_schemas_long_running_tasks.base import TaskProgress
13+
from models_library.api_schemas_long_running_tasks.tasks import TaskResult
1314
from pydantic import PositiveFloat
1415
from servicelib.async_utils import cancel_wait_task
1516
from servicelib.background_task import create_periodic_task
@@ -259,6 +260,38 @@ def get_task_result(
259260
# the task was cancelled
260261
raise TaskCancelledError(task_id=task_id) from exc
261262

263+
def get_task_result_old(
264+
self, task_id: TaskId, with_task_context: TaskContext | None
265+
) -> TaskResult:
266+
"""
267+
returns: the result of the task
268+
269+
raises TaskNotFoundError if the task cannot be found
270+
"""
271+
tracked_task = self._get_tracked_task(task_id, with_task_context)
272+
273+
if not tracked_task.task.done():
274+
raise TaskNotCompletedError(task_id=task_id)
275+
276+
error: TaskExceptionError | TaskCancelledError
277+
try:
278+
exception = tracked_task.task.exception()
279+
if exception is not None:
280+
formatted_traceback = "\n".join(
281+
traceback.format_tb(exception.__traceback__)
282+
)
283+
error = TaskExceptionError(
284+
task_id=task_id, exception=exception, traceback=formatted_traceback
285+
)
286+
_logger.warning("Task %s finished with error: %s", task_id, f"{error}")
287+
return TaskResult(result=None, error=f"{error}")
288+
except asyncio.CancelledError:
289+
error = TaskCancelledError(task_id=task_id)
290+
_logger.warning("Task %s was cancelled", task_id)
291+
return TaskResult(result=None, error=f"{error}")
292+
293+
return TaskResult(result=tracked_task.task.result(), error=None)
294+
262295
async def cancel_task(
263296
self, task_id: TaskId, with_task_context: TaskContext | None
264297
) -> None:

packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks_context_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from servicelib.fastapi.long_running_tasks.server import get_long_running_manager
1818
from servicelib.fastapi.long_running_tasks.server import setup as setup_server
1919
from servicelib.long_running_tasks.errors import (
20+
TaskClientResultError,
2021
TaskClientTimeoutError,
2122
)
2223
from servicelib.long_running_tasks.models import (
@@ -148,14 +149,16 @@ async def test_task_result_task_result_is_an_error(
148149

149150
url = TypeAdapter(AnyHttpUrl).validate_python("http://backgroud.testserver.io/")
150151
client = Client(app=bg_task_app, async_client=async_client, base_url=url)
151-
with pytest.raises(RuntimeError, match="I am failing as requested"):
152+
with pytest.raises(TaskClientResultError) as exec_info:
152153
async with periodic_task_result(
153154
client,
154155
task_id,
155156
task_timeout=10,
156157
status_poll_interval=TASK_SLEEP_INTERVAL / 3,
157158
):
158159
pass
160+
assert f"{exec_info.value}".startswith(f"Task {task_id} finished with exception:")
161+
assert "I am failing as requested" in f"{exec_info.value}"
159162
await _assert_task_removed(async_client, task_id, router_prefix)
160163

161164

0 commit comments

Comments
 (0)