Skip to content

Commit 155573e

Browse files
committed
Merge branch 'fix_list_functions_too_many' of github.com:wvangeit/osparc-simcore into fix_list_functions_too_many
2 parents 8eb6811 + f76b4a0 commit 155573e

File tree

9 files changed

+83
-33
lines changed

9 files changed

+83
-33
lines changed

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,21 @@ def _load_from_redis_hash(data: dict[str, str]) -> dict[str, Any]:
2323
return {k: json_loads(v) for k, v in data.items()}
2424

2525

26+
def to_redis_namespace(lrt_namespace: LRTNamespace) -> str:
27+
return lrt_namespace.upper()
28+
29+
2630
class RedisStore:
27-
def __init__(self, redis_settings: RedisSettings, namespace: LRTNamespace):
31+
def __init__(self, redis_settings: RedisSettings, lrt_namespace: LRTNamespace):
2832
self.redis_settings = redis_settings
29-
self.namespace: LRTNamespace = namespace.upper()
33+
self.redis_namespace = to_redis_namespace(lrt_namespace)
3034

3135
self._client: RedisClientSDK | None = None
3236

3337
async def setup(self) -> None:
3438
self._client = RedisClientSDK(
3539
self.redis_settings.build_redis_dsn(RedisDatabase.LONG_RUNNING_TASKS),
36-
client_name=f"long_running_tasks_store_{self.namespace}",
40+
client_name=f"long_running_tasks_store_{self.redis_namespace}",
3741
)
3842
await self._client.setup()
3943

@@ -47,10 +51,10 @@ def _redis(self) -> aioredis.Redis:
4751
return self._client.redis
4852

4953
def _get_redis_key_task_data_match(self) -> str:
50-
return f"{self.namespace}:{_STORE_TYPE_TASK_DATA}*"
54+
return f"{self.redis_namespace}:{_STORE_TYPE_TASK_DATA}*"
5155

5256
def _get_redis_task_data_key(self, task_id: TaskId) -> str:
53-
return f"{self.namespace}:{_STORE_TYPE_TASK_DATA}:{task_id}"
57+
return f"{self.redis_namespace}:{_STORE_TYPE_TASK_DATA}:{task_id}"
5458

5559
async def get_task_data(self, task_id: TaskId) -> TaskData | None:
5660
result: dict[str, Any] = await handle_redis_returns_union_types(

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from ..logging_utils import log_context
77
from ..redis._client import RedisClientSDK
8+
from ._redis_store import to_redis_namespace
89
from .models import LRTNamespace
910

1011
_logger = logging.getLogger(__name__)
@@ -32,15 +33,16 @@ def _redis(self) -> aioredis.Redis:
3233
assert self._client # nosec
3334
return self._client.redis
3435

35-
async def cleanup(self, lrt_namespace: LRTNamespace) -> None:
36+
async def cleanup(self, namespace: LRTNamespace) -> None:
3637
"""removes Redis keys associated to the LRTNamespace if they exist"""
38+
redis_namespace = to_redis_namespace(namespace)
3739
keys_to_remove: list[str] = [
38-
x async for x in self._redis.scan_iter(f"{lrt_namespace}*")
40+
x async for x in self._redis.scan_iter(f"{redis_namespace}*")
3941
]
4042
with log_context(
4143
_logger,
42-
logging.DEBUG,
43-
msg=f"Removing {keys_to_remove=} from Redis for {lrt_namespace=}",
44+
logging.INFO,
45+
msg=f"Removing {keys_to_remove=} from Redis for {redis_namespace=}",
4446
):
4547
if len(keys_to_remove) > 0:
4648
await self._redis.delete(*keys_to_remove)

packages/service-library/tests/long_running_tasks/test_long_running_tasks__redis_store.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ async def store(
3636
[RedisDatabase], AbstractAsyncContextManager[RedisClientSDK]
3737
],
3838
) -> AsyncIterable[RedisStore]:
39-
store = RedisStore(redis_settings=use_in_memory_redis, namespace="test")
39+
store = RedisStore(redis_settings=use_in_memory_redis, lrt_namespace="test")
4040

4141
await store.setup()
4242
yield store
@@ -78,7 +78,7 @@ async def redis_stores(
7878
],
7979
) -> AsyncIterable[list[RedisStore]]:
8080
stores: list[RedisStore] = [
81-
RedisStore(redis_settings=use_in_memory_redis, namespace=f"test-{i}")
81+
RedisStore(redis_settings=use_in_memory_redis, lrt_namespace=f"test-{i}")
8282
for i in range(5)
8383
]
8484
for store in stores:

packages/service-library/tests/long_running_tasks/test_long_running_tasks_client_long_running_manager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from copy import deepcopy
66

77
import pytest
8+
from faker import Faker
89
from pydantic import TypeAdapter
910
from servicelib.long_running_tasks._redis_store import RedisStore
1011
from servicelib.long_running_tasks.long_running_client_helper import (
@@ -23,8 +24,8 @@ def task_data() -> TaskData:
2324

2425

2526
@pytest.fixture
26-
def lrt_namespace() -> LRTNamespace:
27-
return "TEST-NAMESPACE"
27+
def lrt_namespace(faker: Faker) -> LRTNamespace:
28+
return TypeAdapter(LRTNamespace).validate_python(f"test-namespace:{faker.uuid4()}")
2829

2930

3031
@pytest.fixture
@@ -35,7 +36,7 @@ async def store(
3536
],
3637
lrt_namespace: LRTNamespace,
3738
) -> AsyncIterable[RedisStore]:
38-
store = RedisStore(redis_settings=use_in_memory_redis, namespace=lrt_namespace)
39+
store = RedisStore(redis_settings=use_in_memory_redis, lrt_namespace=lrt_namespace)
3940

4041
await store.setup()
4142
yield store

services/api-server/tests/unit/conftest.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
from pytest_simcore.helpers.host import get_localhost_ip
5757
from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict
5858
from pytest_simcore.helpers.storage_rpc_server import StorageSideEffects
59+
from pytest_simcore.helpers.typing_mock import HandlerMockFactory
5960
from pytest_simcore.helpers.webserver_rpc_server import WebserverRpcSideEffects
6061
from pytest_simcore.simcore_webserver_projects_rest_api import GET_PROJECT
6162
from requests.auth import HTTPBasicAuth
@@ -306,10 +307,10 @@ def mocked_app_rpc_dependencies(
306307
"""
307308
Mocks rabbit clients overrides for the FastAPI app.
308309
"""
309-
from simcore_service_api_server.api.dependencies.rabbitmq import (
310+
from simcore_service_api_server.api.dependencies.rabbitmq import ( # noqa: PLC0415
310311
get_rabbitmq_rpc_client,
311312
)
312-
from simcore_service_api_server.api.dependencies.webserver_rpc import (
313+
from simcore_service_api_server.api.dependencies.webserver_rpc import ( # noqa: PLC0415
313314
get_wb_api_rpc_client,
314315
)
315316

@@ -318,7 +319,9 @@ def mocked_app_rpc_dependencies(
318319

319320
# Overrides Depends[get_wb_api_rpc_client]
320321
async def _get_wb_api_rpc_client_override():
321-
from simcore_service_api_server.services_rpc import wb_api_server
322+
from simcore_service_api_server.services_rpc import ( # noqa: PLC0415
323+
wb_api_server,
324+
)
322325

323326
try:
324327
return WbApiRpcClient.get_from_app_state(app)
@@ -636,6 +639,34 @@ def mocked_webserver_rpc_api(
636639
}
637640

638641

642+
@pytest.fixture()
643+
def mock_handler_in_licenses_rpc_interface(
644+
mocker: MockerFixture,
645+
) -> HandlerMockFactory:
646+
"""Factory to mock a handler in the LicensesRpcApi interface"""
647+
648+
def _create(
649+
handler_name: str,
650+
return_value: Any = None,
651+
exception: Exception | None = None,
652+
side_effect: Callable | None = None,
653+
) -> MockType:
654+
from servicelib.rabbitmq.rpc_interfaces.webserver.v1.licenses import ( # noqa: PLC0415
655+
LicensesRpcApi,
656+
)
657+
658+
assert exception is None or side_effect is None
659+
660+
return mocker.patch.object(
661+
LicensesRpcApi,
662+
handler_name,
663+
return_value=return_value,
664+
side_effect=exception or side_effect,
665+
)
666+
667+
return _create
668+
669+
639670
@pytest.fixture
640671
def catalog_rpc_side_effects(request) -> Any:
641672
if "param" in dir(request) and request.param is not None:

services/api-server/tests/unit/pact_broker/test_pact_checkout_release.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
)
1414
from pact.v3 import Verifier
1515
from pytest_mock import MockerFixture
16+
from pytest_simcore.helpers.typing_mock import HandlerMockFactory
1617
from simcore_service_api_server._meta import API_VERSION
1718
from simcore_service_api_server.api.dependencies.resource_usage_tracker_rpc import (
1819
get_resource_usage_tracker_client,
@@ -61,21 +62,23 @@
6162

6263

6364
@pytest.fixture
64-
async def mock_wb_api_server_rpc(app: FastAPI, mocker: MockerFixture) -> None:
65+
async def mock_wb_api_server_rpc(
66+
app: FastAPI,
67+
mocker: MockerFixture,
68+
mock_handler_in_licenses_rpc_interface: HandlerMockFactory,
69+
) -> None:
6570
from servicelib.rabbitmq.rpc_interfaces.webserver.v1 import WebServerRpcClient
6671

6772
app.dependency_overrides[get_wb_api_rpc_client] = lambda: WbApiRpcClient(
6873
_rpc_client=mocker.MagicMock(spec=WebServerRpcClient),
6974
)
7075

71-
mocker.patch(
72-
"simcore_service_api_server.services_rpc.wb_api_server._checkout_licensed_item_for_wallet",
73-
return_value=EXPECTED_CHECKOUT,
76+
mock_handler_in_licenses_rpc_interface(
77+
"checkout_licensed_item_for_wallet", return_value=EXPECTED_CHECKOUT
7478
)
7579

76-
mocker.patch(
77-
"simcore_service_api_server.services_rpc.wb_api_server._release_licensed_item_for_wallet",
78-
return_value=EXPECTED_RELEASE,
80+
mock_handler_in_licenses_rpc_interface(
81+
"release_licensed_item_for_wallet", return_value=EXPECTED_RELEASE
7982
)
8083

8184

services/api-server/tests/unit/pact_broker/test_pact_licensed_items.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
)
1414
from pact.v3 import Verifier
1515
from pytest_mock import MockerFixture
16+
from pytest_simcore.helpers.typing_mock import HandlerMockFactory
1617
from simcore_service_api_server._meta import API_VERSION
1718
from simcore_service_api_server.api.dependencies.webserver_rpc import (
1819
get_wb_api_rpc_client,
@@ -137,16 +138,21 @@ class DummyRpcClient:
137138

138139

139140
@pytest.fixture
140-
async def mock_wb_api_server_rpc(app: FastAPI, mocker: MockerFixture) -> None:
141-
from servicelib.rabbitmq.rpc_interfaces.webserver.v1 import WebServerRpcClient
141+
async def mock_wb_api_server_rpc(
142+
app: FastAPI,
143+
mocker: MockerFixture,
144+
mock_handler_in_licenses_rpc_interface: HandlerMockFactory,
145+
) -> None:
146+
from servicelib.rabbitmq.rpc_interfaces.webserver.v1 import ( # noqa: PLC0415
147+
WebServerRpcClient,
148+
)
142149

143150
app.dependency_overrides[get_wb_api_rpc_client] = lambda: WbApiRpcClient(
144151
_rpc_client=mocker.MagicMock(spec=WebServerRpcClient),
145152
)
146153

147-
mocker.patch(
148-
"simcore_service_api_server.services_rpc.wb_api_server._get_licensed_items",
149-
return_value=EXPECTED_LICENSED_ITEMS_PAGE,
154+
mock_handler_in_licenses_rpc_interface(
155+
"get_licensed_items", return_value=EXPECTED_LICENSED_ITEMS_PAGE
150156
)
151157

152158

services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/scheduler/_core/_events_utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,12 +286,13 @@ async def service_remove_sidecar_proxy_docker_networks_and_volumes(
286286
await app.state.dynamic_sidecar_scheduler.scheduler.remove_service_from_observation(
287287
scheduler_data.node_uuid
288288
)
289+
290+
await _cleanup_long_running_tasks(app, scheduler_data.node_uuid)
291+
289292
await task_progress.update(
290293
message="finished removing resources", percent=ProgressPercent(1)
291294
)
292295

293-
await _cleanup_long_running_tasks(app, scheduler_data.node_uuid)
294-
295296

296297
async def _cleanup_long_running_tasks(app: FastAPI, node_id: NodeID) -> None:
297298
long_running_client_helper = get_long_running_client_helper(app)

services/dynamic-scheduler/tests/unit/services/generic_scheduler/test__core.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,8 +1071,10 @@ async def test_wait_for_manual_intervention(
10711071
await _ensure_keys_in_store(selected_app, expected_keys=formatted_expected_keys)
10721072

10731073
# even if cancelled, state of waiting for manual intervention remains the same
1074-
with pytest.raises(CannotCancelWhileWaitingForManualInterventionError):
1075-
await cancel_operation(selected_app, schedule_id)
1074+
async for attempt in AsyncRetrying(**_RETRY_PARAMS):
1075+
with attempt: # noqa: SIM117
1076+
with pytest.raises(CannotCancelWhileWaitingForManualInterventionError):
1077+
await cancel_operation(selected_app, schedule_id)
10761078

10771079
await _ensure_keys_in_store(selected_app, expected_keys=formatted_expected_keys)
10781080

0 commit comments

Comments
 (0)