|
1 | 1 | """Storage subsystem's API: responsible of communication with storage service""" |
2 | 2 |
|
3 | | -import asyncio |
| 3 | +import datetime |
4 | 4 | import logging |
5 | 5 | import urllib.parse |
6 | 6 | from collections.abc import AsyncGenerator |
7 | 7 | from typing import Any, Final |
8 | 8 |
|
9 | 9 | from aiohttp import ClientError, ClientSession, ClientTimeout, web |
| 10 | +from models_library.api_schemas_rpc_async_jobs.async_jobs import AsyncJobNameData |
| 11 | +from models_library.api_schemas_storage import STORAGE_RPC_NAMESPACE |
10 | 12 | from models_library.api_schemas_storage.storage_schemas import ( |
11 | 13 | FileLocation, |
12 | 14 | FileLocationArray, |
13 | 15 | FileMetaDataGet, |
| 16 | + FoldersBody, |
14 | 17 | PresignedLink, |
15 | 18 | ) |
16 | 19 | from models_library.generics import Envelope |
17 | 20 | from models_library.projects import ProjectID |
18 | 21 | from models_library.projects_nodes_io import LocationID, NodeID, SimCoreFileLink |
19 | 22 | from models_library.users import UserID |
20 | | -from models_library.utils.fastapi_encoders import jsonable_encoder |
21 | 23 | from pydantic import ByteSize, HttpUrl, TypeAdapter |
22 | 24 | from servicelib.aiohttp.client_session import get_client_session |
23 | | -from servicelib.aiohttp.long_running_tasks.client import ( |
24 | | - LRTask, |
25 | | - long_running_task_request, |
26 | | -) |
27 | 25 | from servicelib.logging_utils import get_log_record_extra, log_context |
| 26 | +from servicelib.rabbitmq.rpc_interfaces.async_jobs.async_jobs import ( |
| 27 | + AsyncJobComposedResult, |
| 28 | + submit_and_wait, |
| 29 | +) |
28 | 30 | from yarl import URL |
29 | 31 |
|
30 | 32 | from ..projects.models import ProjectDict |
31 | 33 | from ..projects.utils import NodesMap |
| 34 | +from ..rabbitmq import get_rabbitmq_rpc_client |
32 | 35 | from .settings import StorageSettings, get_plugin_settings |
33 | 36 |
|
34 | 37 | _logger = logging.getLogger(__name__) |
@@ -104,23 +107,25 @@ async def copy_data_folders_from_project( |
104 | 107 | destination_project: ProjectDict, |
105 | 108 | nodes_map: NodesMap, |
106 | 109 | user_id: UserID, |
107 | | -) -> AsyncGenerator[LRTask, None]: |
108 | | - session, api_endpoint = _get_storage_client(app) |
109 | | - _logger.debug("Copying %d nodes", len(nodes_map)) |
110 | | - # /simcore-s3/folders: |
111 | | - async for lr_task in long_running_task_request( |
112 | | - session, |
113 | | - (api_endpoint / "simcore-s3/folders").with_query(user_id=user_id), |
114 | | - json=jsonable_encoder( |
115 | | - { |
116 | | - "source": source_project, |
117 | | - "destination": destination_project, |
118 | | - "nodes_map": nodes_map, |
119 | | - } |
120 | | - ), |
121 | | - client_timeout=_TOTAL_TIMEOUT_TO_COPY_DATA_SECS, |
122 | | - ): |
123 | | - yield lr_task |
| 110 | +) -> AsyncGenerator[AsyncJobComposedResult, None]: |
| 111 | + product_name = "osparc" # TODO fix it |
| 112 | + with log_context(_logger, logging.DEBUG, msg=f"copy {nodes_map=}"): |
| 113 | + rabbitmq_client = get_rabbitmq_rpc_client(app) |
| 114 | + async for job_composed_result in submit_and_wait( |
| 115 | + rabbitmq_client, |
| 116 | + method_name="copy_folders_from_project", |
| 117 | + rpc_namespace=STORAGE_RPC_NAMESPACE, |
| 118 | + job_id_data=AsyncJobNameData(user_id=user_id, product_name=product_name), |
| 119 | + body=TypeAdapter(FoldersBody).validate_python( |
| 120 | + { |
| 121 | + "source": source_project, |
| 122 | + "destination": destination_project, |
| 123 | + "nodes_map": nodes_map, |
| 124 | + }, |
| 125 | + ), |
| 126 | + client_timeout=datetime.timedelta(seconds=_TOTAL_TIMEOUT_TO_COPY_DATA_SECS), |
| 127 | + ): |
| 128 | + yield job_composed_result |
124 | 129 |
|
125 | 130 |
|
126 | 131 | async def _delete(session, target_url): |
@@ -164,7 +169,7 @@ async def is_healthy(app: web.Application) -> bool: |
164 | 169 | timeout=ClientTimeout(total=2, connect=1), |
165 | 170 | ) |
166 | 171 | return True |
167 | | - except (ClientError, asyncio.TimeoutError) as err: |
| 172 | + except (TimeoutError, ClientError) as err: |
168 | 173 | # ClientResponseError, ClientConnectionError, ClientPayloadError, InValidURL |
169 | 174 | _logger.debug("Storage is NOT healthy: %s", err) |
170 | 175 | return False |
|
0 commit comments