diff --git a/api/specs/web-server/_long_running_tasks.py b/api/specs/web-server/_long_running_tasks.py index f204c1de5b4..fc99db45b89 100644 --- a/api/specs/web-server/_long_running_tasks.py +++ b/api/specs/web-server/_long_running_tasks.py @@ -10,7 +10,7 @@ from models_library.generics import Envelope from models_library.rest_error import EnvelopedError from servicelib.aiohttp.long_running_tasks._routes import _PathParam -from servicelib.long_running_tasks._models import TaskGet, TaskStatus +from servicelib.long_running_tasks.models import TaskGet, TaskStatus from simcore_service_webserver._meta import API_VTAG from simcore_service_webserver.tasks._exception_handlers import ( _TO_HTTP_ERROR_MAP as export_data_http_error_map, diff --git a/api/specs/web-server/_long_running_tasks_legacy.py b/api/specs/web-server/_long_running_tasks_legacy.py index fcbe3508c4d..89c85b0ff93 100644 --- a/api/specs/web-server/_long_running_tasks_legacy.py +++ b/api/specs/web-server/_long_running_tasks_legacy.py @@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, status from models_library.generics import Envelope from servicelib.aiohttp.long_running_tasks._routes import _PathParam -from servicelib.long_running_tasks._models import TaskGet, TaskStatus +from servicelib.long_running_tasks.models import TaskGet, TaskStatus from simcore_service_webserver._meta import API_VTAG router = APIRouter( diff --git a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_dependencies.py b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_dependencies.py index b38004b3200..4a8bc455cd8 100644 --- a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_dependencies.py +++ b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_dependencies.py @@ -2,7 +2,7 @@ from aiohttp import web -from ...long_running_tasks._task import TasksManager +from ...long_running_tasks.task import TasksManager from ._constants import ( APP_LONG_RUNNING_TASKS_MANAGER_KEY, RQT_LONG_RUNNING_TASKS_CONTEXT_KEY, diff --git a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_error_handlers.py b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_error_handlers.py index 4534d7c951c..8a679c70b7d 100644 --- a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_error_handlers.py +++ b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_error_handlers.py @@ -3,7 +3,7 @@ from aiohttp import web from common_library.json_serialization import json_dumps -from ...long_running_tasks._errors import ( +from ...long_running_tasks.errors import ( TaskCancelledError, TaskNotCompletedError, TaskNotFoundError, diff --git a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_routes.py b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_routes.py index 1906c0bc93f..2603b229f68 100644 --- a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_routes.py +++ b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_routes.py @@ -6,9 +6,9 @@ from pydantic import BaseModel from servicelib.aiohttp import status -from ...long_running_tasks._errors import TaskNotCompletedError, TaskNotFoundError -from ...long_running_tasks._models import TaskGet, TaskId, TaskStatus -from ...long_running_tasks._task import TrackedTask +from ...long_running_tasks.errors import TaskNotCompletedError, TaskNotFoundError +from ...long_running_tasks.models import TaskGet, TaskId, TaskStatus +from ...long_running_tasks.task import TrackedTask from ..requests_validation import parse_request_path_parameters_as from ._dependencies import get_task_context, get_tasks_manager diff --git a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_server.py b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_server.py index d0c96699462..40777376815 100644 --- a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_server.py +++ b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/_server.py @@ -9,8 +9,8 @@ from pydantic import AnyHttpUrl, PositiveFloat, TypeAdapter from ...aiohttp import status -from ...long_running_tasks._models import TaskGet -from ...long_running_tasks._task import ( +from ...long_running_tasks.models import TaskGet +from ...long_running_tasks.task import ( TaskContext, TaskProtocol, TasksManager, @@ -136,11 +136,11 @@ def setup( async def on_cleanup_ctx(app: web.Application) -> AsyncGenerator[None, None]: # add components to state - app[ - APP_LONG_RUNNING_TASKS_MANAGER_KEY - ] = long_running_task_manager = TasksManager( - stale_task_check_interval_s=stale_task_check_interval_s, - stale_task_detect_timeout_s=stale_task_detect_timeout_s, + app[APP_LONG_RUNNING_TASKS_MANAGER_KEY] = long_running_task_manager = ( + TasksManager( + stale_task_check_interval_s=stale_task_check_interval_s, + stale_task_detect_timeout_s=stale_task_detect_timeout_s, + ) ) # add error handlers diff --git a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/client.py b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/client.py index e29fabc87fe..81c48ed017b 100644 --- a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/client.py +++ b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/client.py @@ -13,10 +13,16 @@ from yarl import URL from ...long_running_tasks._constants import DEFAULT_POLL_INTERVAL_S, HOUR -from ...long_running_tasks._models import LRTask, RequestBody +from ...long_running_tasks.models import ( + LRTask, + RequestBody, + TaskGet, + TaskId, + TaskProgress, + TaskStatus, +) from ...rest_responses import unwrap_envelope_if_required from .. import status -from .server import TaskGet, TaskId, TaskProgress, TaskStatus _logger = logging.getLogger(__name__) @@ -123,6 +129,3 @@ async def long_running_task_request( if task: await _abort_task(session, URL(task.abort_href)) raise - - -__all__: tuple[str, ...] = ("LRTask",) diff --git a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/server.py b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/server.py index 55d1295c197..218fb4640f7 100644 --- a/packages/service-library/src/servicelib/aiohttp/long_running_tasks/server.py +++ b/packages/service-library/src/servicelib/aiohttp/long_running_tasks/server.py @@ -6,39 +6,19 @@ running task. """ -from ...long_running_tasks._errors import TaskAlreadyRunningError, TaskCancelledError -from ...long_running_tasks._models import ProgressMessage, ProgressPercent -from ...long_running_tasks._task import ( - TaskId, - TaskProgress, - TaskProtocol, - TasksManager, - TaskStatus, -) from ._dependencies import ( create_task_name_from_request, get_task_context, get_tasks_manager, ) -from ._routes import TaskGet from ._server import setup, start_long_running_task __all__: tuple[str, ...] = ( "create_task_name_from_request", "get_task_context", "get_tasks_manager", - "ProgressMessage", - "ProgressPercent", "setup", "start_long_running_task", - "TaskAlreadyRunningError", - "TaskCancelledError", - "TaskId", - "TaskGet", - "TasksManager", - "TaskProgress", - "TaskProtocol", - "TaskStatus", ) # nopycln: file diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_client.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_client.py index 4593bbf7b01..c2b93594ce1 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_client.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_client.py @@ -14,10 +14,10 @@ from tenacity.stop import stop_after_attempt from tenacity.wait import wait_exponential -from ...long_running_tasks._errors import GenericClientError -from ...long_running_tasks._models import ClientConfiguration, TaskId, TaskStatus +from ...long_running_tasks.errors import GenericClientError +from ...long_running_tasks.models import ClientConfiguration, TaskId, TaskStatus -DEFAULT_HTTP_REQUESTS_TIMEOUT: Final[PositiveFloat] = 15 +_DEFAULT_HTTP_REQUESTS_TIMEOUT: Final[PositiveFloat] = 15 logger = logging.getLogger(__name__) @@ -207,7 +207,7 @@ def setup( app: FastAPI, *, router_prefix: str = "", - http_requests_timeout: PositiveFloat = DEFAULT_HTTP_REQUESTS_TIMEOUT, + http_requests_timeout: PositiveFloat = _DEFAULT_HTTP_REQUESTS_TIMEOUT, ): """ - `router_prefix` by default it is assumed the server mounts the APIs on diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_context_manager.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_context_manager.py index c16fadd8be2..3cc1b65c8f6 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_context_manager.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_context_manager.py @@ -6,8 +6,8 @@ from pydantic import PositiveFloat -from ...long_running_tasks._errors import TaskClientTimeoutError -from ...long_running_tasks._models import ( +from ...long_running_tasks.errors import TaskClientTimeoutError +from ...long_running_tasks.models import ( ProgressCallback, ProgressMessage, ProgressPercent, diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_dependencies.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_dependencies.py index 937ddcf33d1..e2c2fdc4b00 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_dependencies.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_dependencies.py @@ -1,6 +1,6 @@ from fastapi import Request -from ...long_running_tasks._task import TasksManager +from ...long_running_tasks.task import TasksManager def get_tasks_manager(request: Request) -> TasksManager: diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_error_handlers.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_error_handlers.py index e5f1ef7d9ee..b39eff575bc 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_error_handlers.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_error_handlers.py @@ -5,7 +5,7 @@ from starlette.requests import Request from starlette.responses import JSONResponse -from ...long_running_tasks._errors import ( +from ...long_running_tasks.errors import ( BaseLongRunningError, TaskNotCompletedError, TaskNotFoundError, diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_routes.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_routes.py index b56ba3d21dd..fa11e506012 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_routes.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_routes.py @@ -2,9 +2,9 @@ from fastapi import APIRouter, Depends, Request, status -from ...long_running_tasks._errors import TaskNotCompletedError, TaskNotFoundError -from ...long_running_tasks._models import TaskGet, TaskId, TaskResult, TaskStatus -from ...long_running_tasks._task import TasksManager +from ...long_running_tasks.errors import TaskNotCompletedError, TaskNotFoundError +from ...long_running_tasks.models import TaskGet, TaskId, TaskResult, TaskStatus +from ...long_running_tasks.task import TasksManager from ..requests_decorators import cancel_on_disconnect from ._dependencies import get_tasks_manager diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_server.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_server.py index e8306b6d187..26c26d10bc3 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/_server.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/_server.py @@ -3,8 +3,8 @@ from fastapi import APIRouter, FastAPI from pydantic import PositiveFloat -from ...long_running_tasks._errors import BaseLongRunningError -from ...long_running_tasks._task import TasksManager +from ...long_running_tasks.errors import BaseLongRunningError +from ...long_running_tasks.task import TasksManager from ._error_handlers import base_long_running_error_handler from ._routes import router @@ -50,4 +50,4 @@ async def on_shutdown() -> None: # add error handlers # NOTE: Exception handler can not be added during the on_startup script, otherwise not working correctly - app.add_exception_handler(BaseLongRunningError, base_long_running_error_handler) # type: ignore[arg-type] + app.add_exception_handler(BaseLongRunningError, base_long_running_error_handler) # type: ignore[arg-type] diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/client.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/client.py index 62b72256000..e0eafea2257 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/client.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/client.py @@ -9,12 +9,6 @@ import httpx from fastapi import status -from models_library.api_schemas_long_running_tasks.base import TaskProgress -from models_library.api_schemas_long_running_tasks.tasks import ( - TaskGet, - TaskResult, - TaskStatus, -) from tenacity import ( AsyncRetrying, TryAgain, @@ -27,17 +21,16 @@ from yarl import URL from ...long_running_tasks._constants import DEFAULT_POLL_INTERVAL_S, HOUR -from ...long_running_tasks._models import ( - ClientConfiguration, +from ...long_running_tasks.models import ( LRTask, - ProgressCallback, - ProgressMessage, - ProgressPercent, RequestBody, + TaskGet, + TaskProgress, + TaskStatus, ) -from ...long_running_tasks._task import TaskId +from ...long_running_tasks.task import TaskId from ...rest_responses import unwrap_envelope_if_required -from ._client import DEFAULT_HTTP_REQUESTS_TIMEOUT, Client, setup +from ._client import Client, setup from ._context_manager import periodic_task_result _logger = logging.getLogger(__name__) @@ -151,15 +144,7 @@ async def long_running_task_request( __all__: tuple[str, ...] = ( - "DEFAULT_HTTP_REQUESTS_TIMEOUT", "Client", - "ClientConfiguration", - "LRTask", - "ProgressCallback", - "ProgressMessage", - "ProgressPercent", - "TaskId", - "TaskResult", "periodic_task_result", "setup", ) diff --git a/packages/service-library/src/servicelib/fastapi/long_running_tasks/server.py b/packages/service-library/src/servicelib/fastapi/long_running_tasks/server.py index b9a29d1d90a..51240434a77 100644 --- a/packages/service-library/src/servicelib/fastapi/long_running_tasks/server.py +++ b/packages/service-library/src/servicelib/fastapi/long_running_tasks/server.py @@ -6,30 +6,12 @@ running task. The client will take care of recovering the result from it. """ -from models_library.api_schemas_long_running_tasks.tasks import TaskResult - -from ...long_running_tasks._errors import TaskAlreadyRunningError, TaskCancelledError -from ...long_running_tasks._task import ( - TaskId, - TaskProgress, - TasksManager, - TaskStatus, - start_task, -) from ._dependencies import get_tasks_manager from ._server import setup __all__: tuple[str, ...] = ( "get_tasks_manager", "setup", - "start_task", - "TaskAlreadyRunningError", - "TaskCancelledError", - "TaskId", - "TasksManager", - "TaskProgress", - "TaskResult", - "TaskStatus", ) # nopycln: file diff --git a/packages/service-library/src/servicelib/long_running_tasks/_errors.py b/packages/service-library/src/servicelib/long_running_tasks/errors.py similarity index 100% rename from packages/service-library/src/servicelib/long_running_tasks/_errors.py rename to packages/service-library/src/servicelib/long_running_tasks/errors.py diff --git a/packages/service-library/src/servicelib/long_running_tasks/_models.py b/packages/service-library/src/servicelib/long_running_tasks/models.py similarity index 100% rename from packages/service-library/src/servicelib/long_running_tasks/_models.py rename to packages/service-library/src/servicelib/long_running_tasks/models.py diff --git a/packages/service-library/src/servicelib/long_running_tasks/_task.py b/packages/service-library/src/servicelib/long_running_tasks/task.py similarity index 99% rename from packages/service-library/src/servicelib/long_running_tasks/_task.py rename to packages/service-library/src/servicelib/long_running_tasks/task.py index b1b0bedfcc0..5e02b1adbec 100644 --- a/packages/service-library/src/servicelib/long_running_tasks/_task.py +++ b/packages/service-library/src/servicelib/long_running_tasks/task.py @@ -15,14 +15,14 @@ ) from pydantic import PositiveFloat -from ._errors import ( +from .errors import ( TaskAlreadyRunningError, TaskCancelledError, TaskExceptionError, TaskNotCompletedError, TaskNotFoundError, ) -from ._models import TaskId, TaskName, TaskStatus, TrackedTask +from .models import TaskId, TaskName, TaskStatus, TrackedTask logger = logging.getLogger(__name__) @@ -262,7 +262,7 @@ async def _cancel_asyncio_task( await asyncio.wait_for( _await_task(task), timeout=self._cancel_task_timeout_s ) - except asyncio.TimeoutError: + except TimeoutError: logger.warning( "Timed out while awaiting for cancellation of '%s'", reference ) diff --git a/packages/service-library/tests/aiohttp/long_running_tasks/conftest.py b/packages/service-library/tests/aiohttp/long_running_tasks/conftest.py index 8fe29473cfc..4f39c80be08 100644 --- a/packages/service-library/tests/aiohttp/long_running_tasks/conftest.py +++ b/packages/service-library/tests/aiohttp/long_running_tasks/conftest.py @@ -12,9 +12,14 @@ from pydantic import BaseModel, TypeAdapter from pytest_simcore.helpers.assert_checks import assert_status from servicelib.aiohttp import long_running_tasks, status -from servicelib.aiohttp.long_running_tasks.server import TaskId from servicelib.aiohttp.requests_validation import parse_request_query_parameters_as -from servicelib.long_running_tasks._task import TaskContext +from servicelib.long_running_tasks.models import ( + TaskGet, + TaskId, + TaskProgress, + TaskStatus, +) +from servicelib.long_running_tasks.task import TaskContext from tenacity.asyncio import AsyncRetrying from tenacity.retry import retry_if_exception_type from tenacity.stop import stop_after_delay @@ -22,7 +27,7 @@ async def _string_list_task( - task_progress: long_running_tasks.server.TaskProgress, + task_progress: TaskProgress, num_strings: int, sleep_time: float, fail: bool, @@ -93,7 +98,7 @@ async def _caller(client: TestClient, **query_kwargs) -> TaskId: data, error = await assert_status(resp, status.HTTP_202_ACCEPTED) assert data assert not error - task_get = TypeAdapter(long_running_tasks.server.TaskGet).validate_python(data) + task_get = TypeAdapter(TaskGet).validate_python(data) return task_get.task_id return _caller @@ -123,7 +128,7 @@ async def _waiter( data, error = await assert_status(result, status.HTTP_200_OK) assert data assert not error - task_status = long_running_tasks.server.TaskStatus.model_validate(data) + task_status = TaskStatus.model_validate(data) assert task_status assert task_status.done diff --git a/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks.py b/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks.py index 71d5501b2ed..ad924ec8e73 100644 --- a/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks.py +++ b/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks.py @@ -20,9 +20,9 @@ from pydantic import TypeAdapter from pytest_simcore.helpers.assert_checks import assert_status from servicelib.aiohttp import long_running_tasks, status -from servicelib.aiohttp.long_running_tasks.server import TaskGet, TaskId from servicelib.aiohttp.rest_middlewares import append_rest_middlewares -from servicelib.long_running_tasks._task import TaskContext +from servicelib.long_running_tasks.models import TaskGet, TaskId, TaskStatus +from servicelib.long_running_tasks.task import TaskContext from tenacity.asyncio import AsyncRetrying from tenacity.retry import retry_if_exception_type from tenacity.stop import stop_after_delay @@ -70,7 +70,7 @@ async def test_workflow( data, error = await assert_status(result, status.HTTP_200_OK) assert data assert not error - task_status = long_running_tasks.server.TaskStatus.model_validate(data) + task_status = TaskStatus.model_validate(data) assert task_status progress_updates.append( (task_status.task_progress.message, task_status.task_progress.percent) diff --git a/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks_with_task_context.py b/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks_with_task_context.py index 0b37c941669..20f8dbf657f 100644 --- a/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks_with_task_context.py +++ b/packages/service-library/tests/aiohttp/long_running_tasks/test_long_running_tasks_with_task_context.py @@ -22,11 +22,11 @@ from servicelib.aiohttp.long_running_tasks._server import ( RQT_LONG_RUNNING_TASKS_CONTEXT_KEY, ) -from servicelib.aiohttp.long_running_tasks.server import TaskGet, TaskId from servicelib.aiohttp.requests_validation import parse_request_query_parameters_as from servicelib.aiohttp.rest_middlewares import append_rest_middlewares from servicelib.aiohttp.typing_extension import Handler -from servicelib.long_running_tasks._task import TaskContext +from servicelib.long_running_tasks.models import TaskGet, TaskId +from servicelib.long_running_tasks.task import TaskContext # WITH TASK CONTEXT # NOTE: as the long running task framework may be used in any number of services diff --git a/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks.py b/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks.py index 84146c6b0dc..7a5b919c34e 100644 --- a/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks.py +++ b/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks.py @@ -19,9 +19,18 @@ from fastapi import APIRouter, Depends, FastAPI, status from httpx import AsyncClient from pydantic import TypeAdapter -from servicelib.fastapi import long_running_tasks -from servicelib.long_running_tasks._models import TaskGet, TaskId -from servicelib.long_running_tasks._task import TaskContext +from servicelib.fastapi.long_running_tasks.client import setup as setup_client +from servicelib.fastapi.long_running_tasks.server import ( + get_tasks_manager, +) +from servicelib.fastapi.long_running_tasks.server import setup as setup_server +from servicelib.long_running_tasks.models import ( + TaskGet, + TaskId, + TaskProgress, + TaskStatus, +) +from servicelib.long_running_tasks.task import TaskContext, TasksManager, start_task from tenacity.asyncio import AsyncRetrying from tenacity.retry import retry_if_exception_type from tenacity.stop import stop_after_delay @@ -32,7 +41,7 @@ async def _string_list_task( - task_progress: long_running_tasks.server.TaskProgress, + task_progress: TaskProgress, num_strings: int, sleep_time: float, fail: bool, @@ -43,7 +52,8 @@ async def _string_list_task( await asyncio.sleep(sleep_time) task_progress.update(message="generated item", percent=index / num_strings) if fail: - raise RuntimeError("We were asked to fail!!") + msg = "We were asked to fail!!" + raise RuntimeError(msg) return generated_strings @@ -59,11 +69,9 @@ async def create_string_list_task( num_strings: int, sleep_time: float, fail: bool = False, - task_manager: long_running_tasks.server.TasksManager = Depends( - long_running_tasks.server.get_tasks_manager - ), - ) -> long_running_tasks.server.TaskId: - task_id = long_running_tasks.server.start_task( + task_manager: TasksManager = Depends(get_tasks_manager), + ) -> TaskId: + task_id = start_task( task_manager, _string_list_task, num_strings=num_strings, @@ -80,8 +88,8 @@ async def app(server_routes: APIRouter) -> AsyncIterator[FastAPI]: # overrides fastapi/conftest.py:app app = FastAPI(title="test app") app.include_router(server_routes) - long_running_tasks.server.setup(app) - long_running_tasks.client.setup(app) + setup_server(app) + setup_client(app) async with LifespanManager(app): yield app @@ -94,10 +102,7 @@ async def _caller(app: FastAPI, client: AsyncClient, **query_kwargs) -> TaskId: ) resp = await client.post(f"{url}") assert resp.status_code == status.HTTP_202_ACCEPTED - task_id = TypeAdapter(long_running_tasks.server.TaskId).validate_python( - resp.json() - ) - return task_id + return TypeAdapter(TaskId).validate_python(resp.json()) return _caller @@ -124,9 +129,7 @@ async def _waiter( with attempt: result = await client.get(f"{status_url}") assert result.status_code == status.HTTP_200_OK - task_status = long_running_tasks.server.TaskStatus.model_validate( - result.json() - ) + task_status = TaskStatus.model_validate(result.json()) assert task_status assert task_status.done @@ -151,9 +154,7 @@ async def test_workflow( with attempt: result = await client.get(f"{status_url}") assert result.status_code == status.HTTP_200_OK - task_status = long_running_tasks.server.TaskStatus.model_validate( - result.json() - ) + task_status = TaskStatus.model_validate(result.json()) assert task_status progress_updates.append( (task_status.task_progress.message, task_status.task_progress.percent) diff --git a/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks_context_manager.py b/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks_context_manager.py index b0db697a6ad..cf9890a0ed4 100644 --- a/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks_context_manager.py +++ b/packages/service-library/tests/fastapi/long_running_tasks/test_long_running_tasks_context_manager.py @@ -11,26 +11,20 @@ from httpx import AsyncClient from pydantic import AnyHttpUrl, PositiveFloat, TypeAdapter from servicelib.fastapi.long_running_tasks._context_manager import _ProgressManager -from servicelib.fastapi.long_running_tasks.client import ( - Client, +from servicelib.fastapi.long_running_tasks.client import Client, periodic_task_result +from servicelib.fastapi.long_running_tasks.client import setup as setup_client +from servicelib.fastapi.long_running_tasks.server import get_tasks_manager +from servicelib.fastapi.long_running_tasks.server import setup as setup_server +from servicelib.long_running_tasks.errors import ( + TaskClientTimeoutError, +) +from servicelib.long_running_tasks.models import ( ProgressMessage, ProgressPercent, - periodic_task_result, -) -from servicelib.fastapi.long_running_tasks.client import setup as setup_client -from servicelib.fastapi.long_running_tasks.server import ( TaskId, TaskProgress, - TasksManager, - get_tasks_manager, -) -from servicelib.fastapi.long_running_tasks.server import setup as setup_server -from servicelib.fastapi.long_running_tasks.server import ( - start_task, -) -from servicelib.long_running_tasks._errors import ( - TaskClientTimeoutError, ) +from servicelib.long_running_tasks.task import TasksManager, start_task TASK_SLEEP_INTERVAL: Final[PositiveFloat] = 0.1 diff --git a/packages/service-library/tests/long_running_tasks/test_long_running_tasks_models.py b/packages/service-library/tests/long_running_tasks/test_long_running_tasks_models.py index f21417da788..a92765eb010 100644 --- a/packages/service-library/tests/long_running_tasks/test_long_running_tasks_models.py +++ b/packages/service-library/tests/long_running_tasks/test_long_running_tasks_models.py @@ -1,4 +1,4 @@ -from servicelib.long_running_tasks._models import TaskProgress +from servicelib.long_running_tasks.models import TaskProgress def test_progress_has_no_more_than_3_digits(): diff --git a/packages/service-library/tests/long_running_tasks/test_long_running_tasks_task.py b/packages/service-library/tests/long_running_tasks/test_long_running_tasks_task.py index 6d3b9c837f2..63be0eb1262 100644 --- a/packages/service-library/tests/long_running_tasks/test_long_running_tasks_task.py +++ b/packages/service-library/tests/long_running_tasks/test_long_running_tasks_task.py @@ -12,18 +12,18 @@ import pytest from faker import Faker -from servicelib.long_running_tasks._errors import ( +from servicelib.long_running_tasks.errors import ( TaskAlreadyRunningError, TaskCancelledError, TaskNotCompletedError, TaskNotFoundError, ) -from servicelib.long_running_tasks._models import ( +from servicelib.long_running_tasks.models import ( ProgressPercent, TaskProgress, TaskStatus, ) -from servicelib.long_running_tasks._task import TasksManager, start_task +from servicelib.long_running_tasks.task import TasksManager, start_task from tenacity import TryAgain from tenacity.asyncio import AsyncRetrying from tenacity.retry import retry_if_exception_type diff --git a/services/api-server/src/simcore_service_api_server/services_http/webserver.py b/services/api-server/src/simcore_service_api_server/services_http/webserver.py index 7751ffb382f..6ce01daccd3 100644 --- a/services/api-server/src/simcore_service_api_server/services_http/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services_http/webserver.py @@ -41,11 +41,11 @@ from models_library.rest_pagination import Page, PageLimitInt, PageOffsetInt from models_library.utils.fastapi_encoders import jsonable_encoder from pydantic import PositiveInt -from servicelib.aiohttp.long_running_tasks.server import TaskStatus from servicelib.common_headers import ( X_SIMCORE_PARENT_NODE_ID, X_SIMCORE_PARENT_PROJECT_UUID, ) +from servicelib.long_running_tasks.models import TaskStatus from settings_library.tracing import TracingSettings from tenacity import TryAgain from tenacity.asyncio import AsyncRetrying diff --git a/services/director-v2/src/simcore_service_director_v2/api/routes/dynamic_scheduler.py b/services/director-v2/src/simcore_service_director_v2/api/routes/dynamic_scheduler.py index dadfdc3cdfc..4f01e803dd0 100644 --- a/services/director-v2/src/simcore_service_director_v2/api/routes/dynamic_scheduler.py +++ b/services/director-v2/src/simcore_service_director_v2/api/routes/dynamic_scheduler.py @@ -4,18 +4,15 @@ from fastapi import APIRouter, Depends, HTTPException, status from models_library.projects_nodes_io import NodeID from pydantic import BaseModel, PositiveInt -from servicelib.fastapi.long_running_tasks.client import ( +from servicelib.fastapi.long_running_tasks.server import get_tasks_manager +from servicelib.long_running_tasks.errors import TaskAlreadyRunningError +from servicelib.long_running_tasks.models import ( ProgressMessage, ProgressPercent, -) -from servicelib.fastapi.long_running_tasks.server import ( - TaskAlreadyRunningError, TaskId, TaskProgress, - TasksManager, - get_tasks_manager, - start_task, ) +from servicelib.long_running_tasks.task import TasksManager, start_task from tenacity import retry from tenacity.before_sleep import before_sleep_log from tenacity.retry import retry_if_result diff --git a/services/director-v2/src/simcore_service_director_v2/cli/_close_and_save_service.py b/services/director-v2/src/simcore_service_director_v2/cli/_close_and_save_service.py index fb8f70bf62f..d7f25a6a79d 100644 --- a/services/director-v2/src/simcore_service_director_v2/cli/_close_and_save_service.py +++ b/services/director-v2/src/simcore_service_director_v2/cli/_close_and_save_service.py @@ -16,11 +16,13 @@ from servicelib.fastapi.http_client_thin import UnexpectedStatusError from servicelib.fastapi.long_running_tasks.client import ( Client, + periodic_task_result, + setup, +) +from servicelib.long_running_tasks.models import ( ProgressMessage, ProgressPercent, TaskId, - periodic_task_result, - setup, ) from tenacity.asyncio import AsyncRetrying from tenacity.retry import retry_if_exception_type diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_public.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_public.py index 5945e07b8e3..1dfb5b522d3 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_public.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/api_client/_public.py @@ -22,15 +22,14 @@ BaseHttpClientError, UnexpectedStatusError, ) -from servicelib.fastapi.long_running_tasks.client import ( - Client, +from servicelib.fastapi.long_running_tasks.client import Client, periodic_task_result +from servicelib.logging_utils import log_context, log_decorator +from servicelib.long_running_tasks.models import ( ProgressCallback, ProgressMessage, ProgressPercent, TaskId, - periodic_task_result, ) -from servicelib.logging_utils import log_context, log_decorator from servicelib.utils import logged_gather from ....core.dynamic_services_settings.scheduler import ( diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_abc.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_abc.py index fc550e6a74d..c5e47cc3c6b 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_abc.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_abc.py @@ -15,8 +15,7 @@ from models_library.services_types import ServicePortKey from models_library.users import UserID from models_library.wallets import WalletID -from servicelib.fastapi.long_running_tasks.client import ProgressCallback -from servicelib.fastapi.long_running_tasks.server import TaskProgress +from servicelib.long_running_tasks.models import ProgressCallback, TaskProgress class SchedulerInternalsInterface(ABC): diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_user_services.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_user_services.py index d7dd034134b..a0f543a83a3 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_user_services.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_user_services.py @@ -8,7 +8,7 @@ from models_library.services import ServiceVersion from models_library.services_creation import CreateServiceMetricsAdditionalParams from pydantic import TypeAdapter -from servicelib.fastapi.long_running_tasks.client import TaskId +from servicelib.long_running_tasks.models import TaskId from tenacity import RetryError from tenacity.asyncio import AsyncRetrying from tenacity.before_sleep import before_sleep_log diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py index af3c094a57e..6aa648b31e0 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py @@ -20,9 +20,8 @@ from models_library.user_preferences import FrontendUserPreference from models_library.users import UserID from servicelib.fastapi.http_client_thin import BaseHttpClientError -from servicelib.fastapi.long_running_tasks.client import ProgressCallback -from servicelib.fastapi.long_running_tasks.server import TaskProgress from servicelib.logging_utils import log_context +from servicelib.long_running_tasks.models import ProgressCallback, TaskProgress from servicelib.rabbitmq import RabbitMQClient from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient from servicelib.rabbitmq._errors import RemoteMethodNotRegisteredError diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler.py index 6860717238d..ea36680240d 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler.py @@ -43,8 +43,7 @@ from pydantic import NonNegativeFloat from servicelib.async_utils import cancel_wait_task from servicelib.background_task import create_periodic_task -from servicelib.fastapi.long_running_tasks.client import ProgressCallback -from servicelib.fastapi.long_running_tasks.server import TaskProgress +from servicelib.long_running_tasks.models import ProgressCallback, TaskProgress from servicelib.redis import RedisClientsManager, exclusive from settings_library.redis import RedisDatabase @@ -272,9 +271,9 @@ async def add_service_from_scheduler_data( ) raise DynamicSidecarError(msg=msg) - self._inverse_search_mapping[ - scheduler_data.node_uuid - ] = scheduler_data.service_name + self._inverse_search_mapping[scheduler_data.node_uuid] = ( + scheduler_data.service_name + ) self._to_observe[scheduler_data.service_name] = scheduler_data self._enqueue_observation_from_service_name(scheduler_data.service_name) logger.debug("Added service '%s' to observe", scheduler_data.service_name) @@ -374,9 +373,9 @@ async def mark_service_for_removal( dynamic_scheduler: DynamicServicesSchedulerSettings = ( self.app.state.settings.DYNAMIC_SERVICES.DYNAMIC_SCHEDULER ) - self._service_observation_task[ - service_name - ] = self.__create_observation_task(dynamic_scheduler, service_name) + self._service_observation_task[service_name] = ( + self.__create_observation_task(dynamic_scheduler, service_name) + ) logger.debug("Service '%s' marked for removal from scheduler", service_name) @@ -575,9 +574,9 @@ async def _run_trigger_observation_queue_task(self) -> None: if self._service_observation_task.get(service_name) is None: logger.info("Create observation task for service %s", service_name) - self._service_observation_task[ - service_name - ] = self.__create_observation_task(dynamic_scheduler, service_name) + self._service_observation_task[service_name] = ( + self.__create_observation_task(dynamic_scheduler, service_name) + ) logger.info("Scheduler 'trigger observation queue task' was shut down") diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler_utils.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler_utils.py index 5a4a011a874..3bbd06b7c5c 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler_utils.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_scheduler_utils.py @@ -7,7 +7,7 @@ ) from models_library.projects_nodes_io import NodeID from models_library.services_enums import ServiceBootType, ServiceState -from servicelib.fastapi.long_running_tasks.client import ProgressCallback +from servicelib.long_running_tasks.models import ProgressCallback from .....core.dynamic_services_settings.scheduler import ( DynamicServicesSchedulerSettings, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_task.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_task.py index e712958a32a..555ea16a958 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_task.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_task.py @@ -17,8 +17,7 @@ from models_library.services_types import ServicePortKey from models_library.users import UserID from models_library.wallets import WalletID -from servicelib.fastapi.long_running_tasks.client import ProgressCallback -from servicelib.fastapi.long_running_tasks.server import TaskProgress +from servicelib.long_running_tasks.models import ProgressCallback, TaskProgress from ....core.dynamic_services_settings.scheduler import ( DynamicServicesSchedulerSettings, diff --git a/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py b/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py index 30563157d6d..3469914a677 100644 --- a/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py +++ b/services/director-v2/tests/integration/02/test_dynamic_sidecar_nodeports_integration.py @@ -52,11 +52,10 @@ from pytest_simcore.helpers.typing_env import EnvVarsDict from servicelib.fastapi.long_running_tasks.client import ( Client, - ProgressMessage, - ProgressPercent, TaskId, periodic_task_result, ) +from servicelib.long_running_tasks.models import ProgressMessage, ProgressPercent from servicelib.progress_bar import ProgressBarData from servicelib.sequences_utils import pairwise from settings_library.rabbit import RabbitSettings diff --git a/services/director-v2/tests/unit/with_dbs/test_cli.py b/services/director-v2/tests/unit/with_dbs/test_cli.py index 813bd93aa07..2f7706cbda1 100644 --- a/services/director-v2/tests/unit/with_dbs/test_cli.py +++ b/services/director-v2/tests/unit/with_dbs/test_cli.py @@ -22,7 +22,7 @@ from models_library.projects_nodes_io import NodeID from pytest_mock.plugin import MockerFixture from pytest_simcore.helpers.typing_env import EnvVarsDict -from servicelib.long_running_tasks._models import ProgressCallback +from servicelib.long_running_tasks.models import ProgressCallback from simcore_service_director_v2.cli import DEFAULT_NODE_SAVE_ATTEMPTS, main from simcore_service_director_v2.cli._close_and_save_service import ( ThinDV2LocalhostClient, diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/api/rest/containers_long_running_tasks.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/api/rest/containers_long_running_tasks.py index af857013a82..da487ce392d 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/api/rest/containers_long_running_tasks.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/api/rest/containers_long_running_tasks.py @@ -2,14 +2,11 @@ from typing import Annotated, cast from fastapi import APIRouter, Depends, FastAPI, Request, status -from servicelib.fastapi.long_running_tasks.server import ( - TaskAlreadyRunningError, - TaskId, - TasksManager, - get_tasks_manager, - start_task, -) +from servicelib.fastapi.long_running_tasks.server import get_tasks_manager from servicelib.fastapi.requests_decorators import cancel_on_disconnect +from servicelib.long_running_tasks.errors import TaskAlreadyRunningError +from servicelib.long_running_tasks.models import TaskId +from servicelib.long_running_tasks.task import TasksManager, start_task from ...core.settings import ApplicationSettings from ...models.schemas.application_health import ApplicationHealth diff --git a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/cli.py b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/cli.py index 4bbf9e6016e..def22092390 100644 --- a/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/cli.py +++ b/services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/cli.py @@ -6,7 +6,7 @@ import typer from common_library.json_serialization import json_dumps from fastapi import FastAPI -from servicelib.fastapi.long_running_tasks.server import TaskProgress +from servicelib.long_running_tasks.models import TaskProgress from settings_library.utils_cli import create_settings_command from ._meta import PROJECT_NAME diff --git a/services/dynamic-sidecar/tests/integration/test_modules_long_running_tasks.py b/services/dynamic-sidecar/tests/integration/test_modules_long_running_tasks.py index b7d45d90654..221f7f0a10f 100644 --- a/services/dynamic-sidecar/tests/integration/test_modules_long_running_tasks.py +++ b/services/dynamic-sidecar/tests/integration/test_modules_long_running_tasks.py @@ -29,7 +29,7 @@ from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict from pytest_simcore.helpers.postgres_tools import PostgresTestConfig from pytest_simcore.helpers.storage import replace_storage_endpoint -from servicelib.fastapi.long_running_tasks.server import TaskProgress +from servicelib.long_running_tasks.models import TaskProgress from servicelib.utils import logged_gather from settings_library.s3 import S3Settings from simcore_postgres_database.models.projects import projects diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py index c7f98d6e375..54125d4f9a8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/nodes_rest.py @@ -32,10 +32,7 @@ from models_library.utils.fastapi_encoders import jsonable_encoder from pydantic import BaseModel, Field from servicelib.aiohttp import status -from servicelib.aiohttp.long_running_tasks.server import ( - TaskProgress, - start_long_running_task, -) +from servicelib.aiohttp.long_running_tasks.server import start_long_running_task from servicelib.aiohttp.requests_validation import ( parse_request_body_as, parse_request_path_parameters_as, @@ -45,6 +42,7 @@ UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE, X_SIMCORE_USER_AGENT, ) +from servicelib.long_running_tasks.models import TaskProgress from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from servicelib.rabbitmq import RPCServerError from servicelib.rabbitmq.rpc_interfaces.dynamic_scheduler.errors import ( diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py index 102707b2821..7ae8cb8654e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py @@ -17,7 +17,7 @@ from models_library.utils.fastapi_encoders import jsonable_encoder from models_library.workspaces import UserWorkspaceWithAccessRights from pydantic import TypeAdapter -from servicelib.aiohttp.long_running_tasks.server import TaskProgress +from servicelib.long_running_tasks.models import TaskProgress from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from servicelib.redis import with_project_locked from servicelib.rest_constants import RESPONSE_MODEL_POLICY diff --git a/services/web/server/tests/conftest.py b/services/web/server/tests/conftest.py index dc15b475984..fc85e684513 100644 --- a/services/web/server/tests/conftest.py +++ b/services/web/server/tests/conftest.py @@ -29,11 +29,11 @@ from pytest_simcore.helpers.webserver_login import LoggedUser, NewUser, UserInfoDict from pytest_simcore.simcore_webserver_projects_rest_api import NEW_PROJECT from servicelib.aiohttp import status -from servicelib.aiohttp.long_running_tasks.server import TaskStatus from servicelib.common_headers import ( X_SIMCORE_PARENT_NODE_ID, X_SIMCORE_PARENT_PROJECT_UUID, ) +from servicelib.long_running_tasks.models import TaskStatus from simcore_service_webserver.application_settings_utils import ( AppConfigDict, convert_to_environ_vars, diff --git a/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py b/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py index 07cb83015d0..61353b6f624 100644 --- a/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py +++ b/services/web/server/tests/unit/with_dbs/02/test_projects_cancellations.py @@ -23,7 +23,7 @@ MockedStorageSubsystem, standard_role_response, ) -from servicelib.aiohttp.long_running_tasks.server import TaskGet +from servicelib.long_running_tasks.models import TaskGet from servicelib.rabbitmq.rpc_interfaces.async_jobs.async_jobs import ( AsyncJobComposedResult, )