Skip to content

Commit 5eab3d3

Browse files
committed
initial test
1 parent 821b822 commit 5eab3d3

File tree

6 files changed

+84
-26
lines changed

6 files changed

+84
-26
lines changed

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/async_jobs/async_jobs.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ async def abort(
2323
*,
2424
rpc_namespace: RPCNamespace,
2525
job_id: AsyncJobId,
26-
job_id_data: AsyncJobNameData
26+
job_id_data: AsyncJobNameData,
2727
) -> AsyncJobAbort:
2828
result = await rabbitmq_rpc_client.request(
2929
rpc_namespace,
@@ -41,7 +41,7 @@ async def get_status(
4141
*,
4242
rpc_namespace: RPCNamespace,
4343
job_id: AsyncJobId,
44-
job_id_data: AsyncJobNameData
44+
job_id_data: AsyncJobNameData,
4545
) -> AsyncJobStatus:
4646
result = await rabbitmq_rpc_client.request(
4747
rpc_namespace,
@@ -59,7 +59,7 @@ async def get_result(
5959
*,
6060
rpc_namespace: RPCNamespace,
6161
job_id: AsyncJobId,
62-
job_id_data: AsyncJobNameData
62+
job_id_data: AsyncJobNameData,
6363
) -> AsyncJobResult:
6464
result = await rabbitmq_rpc_client.request(
6565
rpc_namespace,
@@ -77,7 +77,7 @@ async def list_jobs(
7777
*,
7878
rpc_namespace: RPCNamespace,
7979
filter_: str,
80-
job_id_data: AsyncJobNameData
80+
job_id_data: AsyncJobNameData,
8181
) -> list[AsyncJobGet]:
8282
result: list[AsyncJobGet] = await rabbitmq_rpc_client.request(
8383
rpc_namespace,
@@ -95,7 +95,7 @@ async def submit_job(
9595
rpc_namespace: RPCNamespace,
9696
method_name: str,
9797
job_id_data: AsyncJobNameData,
98-
**kwargs
98+
**kwargs,
9999
) -> AsyncJobGet:
100100
result = await rabbitmq_rpc_client.request(
101101
rpc_namespace,
@@ -104,5 +104,5 @@ async def submit_job(
104104
**kwargs,
105105
timeout_s=_DEFAULT_TIMEOUT_S,
106106
)
107-
assert isinstance(result, AsyncJobGet)
107+
assert isinstance(result, AsyncJobGet) # nosec
108108
return result

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/storage/paths.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ async def compute_path_size(
2020
product_name: str,
2121
location_id: LocationID,
2222
path: Path,
23-
) -> StorageAsyncJobGet:
23+
) -> tuple[StorageAsyncJobGet, AsyncJobNameData]:
24+
job_id_data = AsyncJobNameData(user_id=user_id, product_name=product_name)
2425
async_job_rpc_get = await submit_job(
2526
rabbitmq_rpc_client=client,
2627
rpc_namespace=STORAGE_RPC_NAMESPACE,
2728
method_name=RPCMethodName("compute_path_size"),
28-
job_id_data=AsyncJobNameData(user_id=user_id, product_name=product_name),
29+
job_id_data=job_id_data,
2930
location_id=location_id,
3031
path=path,
3132
)
32-
return StorageAsyncJobGet.from_rpc_schema(async_job_rpc_get)
33+
return StorageAsyncJobGet.from_rpc_schema(async_job_rpc_get), job_id_data

services/storage/src/simcore_service_storage/api/rpc/_paths.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66
from models_library.api_schemas_rpc_async_jobs.async_jobs import (
77
AsyncJobGet,
88
AsyncJobId,
9+
AsyncJobNameData,
910
)
1011
from models_library.projects_nodes_io import LocationID
11-
from models_library.users import UserID
1212
from servicelib.rabbitmq import RPCRouter
1313

1414
from ...dsm import get_dsm_provider
1515

1616
router = RPCRouter()
1717

1818

19-
@router.expose(reraise_if_error_type=())
19+
@router.expose(reraise_if_error_type=None)
2020
async def compute_path_size(
2121
app: FastAPI,
22-
user_id: UserID,
22+
job_id_data: AsyncJobNameData,
23+
# user_id: UserID,
2324
location_id: LocationID,
2425
path: Path,
2526
) -> AsyncJobGet:
@@ -28,7 +29,8 @@ async def compute_path_size(
2829
dsm = get_dsm_provider(app).get(location_id)
2930
# TODO: this must be send to Celery!
3031
task = asyncio.create_task(
31-
dsm.compute_path_size(user_id, path=path), name="THISSHALLGOTOCELERY"
32+
dsm.compute_path_size(job_id_data.user_id, path=path),
33+
name="THISSHALLGOTOCELERY",
3234
)
3335
await asyncio.sleep(5)
3436

services/storage/src/simcore_service_storage/api/rpc/routes.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
from servicelib.rabbitmq import RPCRouter
77

88
from ...modules.rabbitmq import get_rabbitmq_rpc_server
9-
from . import _async_jobs, _data_export
9+
from . import _async_jobs, _data_export, _paths
1010

1111
_logger = logging.getLogger(__name__)
1212

1313

14-
ROUTERS: list[RPCRouter] = [_data_export.router, _async_jobs.router]
14+
ROUTERS: list[RPCRouter] = [
15+
_async_jobs.router,
16+
_data_export.router,
17+
_paths.router,
18+
]
1519

1620

1721
def setup_rpc_api_routes(app: FastAPI) -> None:

services/storage/tests/conftest.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
from pytest_simcore.helpers.typing_env import EnvVarsDict
5858
from servicelib.aiohttp import status
5959
from servicelib.utils import limited_gather
60+
from settings_library.rabbit import RabbitSettings
6061
from simcore_postgres_database.models.tokens import tokens
6162
from simcore_postgres_database.storage_models import file_meta_data, projects, users
6263
from simcore_service_storage.core.application import create_app
@@ -166,7 +167,6 @@ def app_environment(
166167
mock_env_devel_environment: EnvVarsDict,
167168
monkeypatch: pytest.MonkeyPatch,
168169
external_envfile_dict: EnvVarsDict,
169-
mock_rabbit_setup: MockerFixture,
170170
) -> EnvVarsDict:
171171
if external_envfile_dict:
172172
delenvs_from_dict(monkeypatch, mock_env_devel_environment, raising=False)
@@ -176,6 +176,18 @@ def app_environment(
176176
return mock_env_devel_environment | envs
177177

178178

179+
@pytest.fixture
180+
def disabled_rabbitmq(app_environment: EnvVarsDict, monkeypatch: pytest.MonkeyPatch):
181+
monkeypatch.setenv("STORAGE_RABBITMQ", "null")
182+
183+
184+
@pytest.fixture
185+
def enabled_rabbitmq(
186+
app_environment: EnvVarsDict, rabbit_service: RabbitSettings
187+
) -> RabbitSettings:
188+
return rabbit_service
189+
190+
179191
@pytest.fixture
180192
def app_settings(
181193
app_environment: EnvVarsDict,

services/storage/tests/unit/test_rpc_handlers_paths.py

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# pylint:disable=unused-variable
88

99

10+
import logging
1011
import random
1112
from collections.abc import Awaitable, Callable
1213
from pathlib import Path
@@ -16,16 +17,27 @@
1617
import pytest
1718
from faker import Faker
1819
from fastapi import FastAPI
19-
from models_library.api_schemas_storage.storage_schemas import (
20-
PathTotalSizeCreate,
21-
)
20+
from models_library.api_schemas_rpc_async_jobs.async_jobs import AsyncJobId
21+
from models_library.api_schemas_storage import STORAGE_RPC_NAMESPACE
22+
from models_library.api_schemas_webserver.storage import StorageAsyncJobGet
2223
from models_library.projects_nodes_io import LocationID, NodeID, SimcoreS3FileID
2324
from models_library.users import UserID
2425
from pydantic import ByteSize, TypeAdapter
2526
from pytest_simcore.helpers.storage_utils import FileIDDict, ProjectWithFilesParams
2627
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient
28+
from servicelib.rabbitmq.rpc_interfaces.async_jobs.async_jobs import (
29+
get_result,
30+
get_status,
31+
)
2732
from servicelib.rabbitmq.rpc_interfaces.storage.paths import compute_path_size
2833
from simcore_service_storage.simcore_s3_dsm import SimcoreS3DataManager
34+
from tenacity import (
35+
before_sleep_log,
36+
retry,
37+
retry_if_exception_type,
38+
stop_after_delay,
39+
wait_fixed,
40+
)
2941

3042
pytest_simcore_core_services_selection = ["postgres", "rabbit"]
3143
pytest_simcore_ops_services_selection = ["adminer"]
@@ -59,6 +71,9 @@ def _filter_and_group_paths_one_level_deeper(
5971
)
6072

6173

74+
_logger = logging.getLogger(__name__)
75+
76+
6277
async def _assert_compute_path_size(
6378
rpc_client: RabbitMQRPCClient,
6479
location_id: LocationID,
@@ -67,16 +82,40 @@ async def _assert_compute_path_size(
6782
path: Path,
6883
expected_total_size: int,
6984
) -> ByteSize:
70-
received = await compute_path_size(
85+
received, job_id_data = await compute_path_size(
7186
rpc_client, user_id=user_id, product_name="", location_id=location_id, path=path
7287
)
7388

74-
assert isinstance(received, PathTotalSizeCreate)
89+
assert isinstance(received, StorageAsyncJobGet)
7590

76-
assert received
77-
assert received.path == path
78-
assert received.size == expected_total_size
79-
return received.size
91+
@retry(
92+
wait=wait_fixed(1),
93+
stop=stop_after_delay(10),
94+
retry=retry_if_exception_type(AssertionError),
95+
before_sleep=before_sleep_log(_logger, logging.WARNING),
96+
)
97+
async def _wait_for_job_completion(job_id: AsyncJobId) -> None:
98+
job_status = await get_status(
99+
rpc_client,
100+
rpc_namespace=STORAGE_RPC_NAMESPACE,
101+
job_id=job_id,
102+
job_id_data=job_id_data,
103+
)
104+
assert job_status.done
105+
106+
await _wait_for_job_completion(received.job_id)
107+
job_result = await get_result(
108+
rpc_client,
109+
rpc_namespace=STORAGE_RPC_NAMESPACE,
110+
job_id=received.job_id,
111+
job_id_data=job_id_data,
112+
)
113+
assert job_result.result is not None
114+
assert job_result.error is None
115+
response = job_result.result
116+
assert isinstance(response, ByteSize)
117+
assert response == expected_total_size
118+
return response
80119

81120

82121
@pytest.mark.parametrize(
@@ -97,8 +136,8 @@ async def _assert_compute_path_size(
97136
ids=str,
98137
)
99138
async def test_path_compute_size(
139+
enabled_rabbitmq,
100140
initialized_app: FastAPI,
101-
client: httpx.AsyncClient,
102141
storage_rabbitmq_rpc_client: RabbitMQRPCClient,
103142
location_id: LocationID,
104143
user_id: UserID,

0 commit comments

Comments
 (0)