Skip to content

Commit 60b2073

Browse files
author
Andrei Neagu
committed
added volumes and refactored testing for rpc and rest
1 parent 472e469 commit 60b2073

File tree

11 files changed

+195
-41
lines changed

11 files changed

+195
-41
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import logging
2+
3+
from models_library.projects_nodes_io import NodeID
4+
from models_library.rabbitmq_basic_types import RPCMethodName, RPCNamespace
5+
from models_library.sidecar_volumes import VolumeCategory, VolumeStatus
6+
from pydantic import TypeAdapter
7+
8+
from ....logging_utils import log_decorator
9+
from ... import RabbitMQRPCClient
10+
11+
_logger = logging.getLogger(__name__)
12+
13+
14+
@log_decorator(_logger, level=logging.DEBUG)
15+
async def save_volume_state(
16+
rabbitmq_rpc_client: RabbitMQRPCClient,
17+
*,
18+
node_id: NodeID,
19+
status: VolumeStatus,
20+
category: VolumeCategory,
21+
) -> None:
22+
rpc_namespace = RPCNamespace.from_entries(
23+
{"service": "dy-sidecar", "node_id": f"{node_id}"}
24+
)
25+
result = await rabbitmq_rpc_client.request(
26+
rpc_namespace,
27+
TypeAdapter(RPCMethodName).validate_python("save_volume_state"),
28+
status=status,
29+
category=category,
30+
)
31+
assert result is None # nosec
Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
from fastapi import APIRouter, Depends
1+
from typing import Annotated
2+
3+
from fastapi import APIRouter, Depends, FastAPI
24
from fastapi import Path as PathParam
35
from fastapi import status
4-
from models_library.sidecar_volumes import VolumeCategory, VolumeState, VolumeStatus
6+
from models_library.sidecar_volumes import VolumeCategory, VolumeStatus
57
from pydantic import BaseModel
68

7-
from ...models.shared_store import SharedStore
8-
from ._dependencies import get_shared_store
9+
from ...services import volumes
10+
from ._dependencies import get_application
911

1012
router = APIRouter()
1113

@@ -21,8 +23,7 @@ class PutVolumeItem(BaseModel):
2123
)
2224
async def put_volume_state(
2325
item: PutVolumeItem,
24-
volume_category: VolumeCategory = PathParam(..., alias="id"),
25-
shared_store: SharedStore = Depends(get_shared_store),
26+
app: Annotated[FastAPI, Depends(get_application)],
27+
volume_category: Annotated[VolumeCategory, PathParam(..., alias="id")],
2628
) -> None:
27-
async with shared_store:
28-
shared_store.volume_states[volume_category] = VolumeState(status=item.status)
29+
await volumes.save_volume_state(app, status=item.status, category=volume_category)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from fastapi import FastAPI
2+
from models_library.sidecar_volumes import VolumeCategory, VolumeStatus
3+
from pydantic import validate_call
4+
from servicelib.rabbitmq import RPCRouter
5+
6+
from ...services import volumes
7+
8+
router = RPCRouter()
9+
10+
11+
@router.expose()
12+
@validate_call(config={"arbitrary_types_allowed": True})
13+
async def save_volume_state(
14+
app: FastAPI, *, status: VolumeStatus, category: VolumeCategory
15+
) -> None:
16+
await volumes.save_volume_state(app, status=status, category=category)

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/api/rpc/routes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
from ...core.rabbitmq import get_rabbitmq_rpc_server
66
from ...core.settings import ApplicationSettings
7-
from . import _disk_usage
7+
from . import _disk_usage, _volumes
88

99
ROUTERS: list[RPCRouter] = [
1010
_disk_usage.router,
11+
_volumes.router,
1112
]
1213

1314

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/models/shared_store.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import aiofiles
66
from fastapi import FastAPI
7+
from models_library.api_schemas_dynamic_sidecar.containers import DcokerComposeYamlStr
78
from models_library.sidecar_volumes import VolumeCategory, VolumeState, VolumeStatus
89
from pydantic import BaseModel, Field, PrivateAttr
910

@@ -50,7 +51,7 @@ class SharedStore(_StoreMixin):
5051
shared_store.container_names = copied_list
5152
"""
5253

53-
compose_spec: str | None = Field(
54+
compose_spec: DcokerComposeYamlStr | None = Field(
5455
default=None, description="stores the stringified compose spec"
5556
)
5657
container_names: list[ContainerNameStr] = Field(
@@ -119,3 +120,8 @@ async def on_startup() -> None:
119120
)
120121

121122
app.add_event_handler("startup", on_startup)
123+
124+
125+
def get_shared_store(app: FastAPI) -> SharedStore:
126+
shared_store: SharedStore = app.state.shared_store
127+
return shared_store

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/services/__init__.py

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from fastapi import FastAPI
2+
from models_library.sidecar_volumes import VolumeCategory, VolumeState, VolumeStatus
3+
4+
from ..models.shared_store import get_shared_store
5+
6+
7+
async def save_volume_state(
8+
app: FastAPI, *, status: VolumeStatus, category: VolumeCategory
9+
) -> None:
10+
shared_store = get_shared_store(app)
11+
async with shared_store:
12+
shared_store.volume_states[category] = VolumeState(status=status)
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# pylint:disable=protected-access
21
# pylint:disable=redefined-outer-name
32
# pylint:disable=unused-argument
43

@@ -8,30 +7,16 @@
87
import pytest
98
from asgi_lifespan import LifespanManager
109
from fastapi import FastAPI
11-
from models_library.api_schemas_dynamic_sidecar.telemetry import DiskUsage
12-
from pydantic import ByteSize
1310
from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict
1411
from servicelib.rabbitmq import RabbitMQRPCClient
15-
from servicelib.rabbitmq.rpc_interfaces.dynamic_sidecar import disk_usage
1612
from settings_library.rabbit import RabbitSettings
17-
from settings_library.redis import RedisSettings
1813
from simcore_service_dynamic_sidecar.core.application import create_app
19-
from simcore_service_dynamic_sidecar.core.settings import ApplicationSettings
20-
from simcore_service_dynamic_sidecar.modules.system_monitor._disk_usage import (
21-
get_disk_usage_monitor,
22-
)
23-
24-
pytest_simcore_core_services_selection = [
25-
"redis",
26-
"rabbit",
27-
]
2814

2915

3016
@pytest.fixture
3117
def mock_environment(
3218
monkeypatch: pytest.MonkeyPatch,
3319
rabbit_service: RabbitSettings,
34-
redis_service: RedisSettings,
3520
mock_environment: EnvVarsDict,
3621
mock_registry_service: AsyncMock,
3722
) -> EnvVarsDict:
@@ -61,19 +46,3 @@ async def rpc_client(
6146
rabbitmq_rpc_client: Callable[[str], Awaitable[RabbitMQRPCClient]],
6247
) -> RabbitMQRPCClient:
6348
return await rabbitmq_rpc_client("client")
64-
65-
66-
async def test_get_state(app: FastAPI, rpc_client: RabbitMQRPCClient):
67-
usage = {
68-
"some_path": DiskUsage(
69-
total=ByteSize(0), used=ByteSize(0), free=ByteSize(0), used_percent=0
70-
)
71-
}
72-
settings: ApplicationSettings = app.state.settings
73-
74-
result = await disk_usage.update_disk_usage(
75-
rpc_client, node_id=settings.DY_SIDECAR_NODE_ID, usage=usage
76-
)
77-
assert result is None
78-
79-
assert get_disk_usage_monitor(app)._usage_overwrite == usage # noqa: SLF001
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# pylint:disable=protected-access
2+
# pylint:disable=redefined-outer-name
3+
# pylint:disable=unused-argument
4+
5+
import pytest
6+
from fastapi import FastAPI
7+
from models_library.api_schemas_dynamic_sidecar.telemetry import DiskUsage
8+
from pydantic import ByteSize
9+
from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict
10+
from servicelib.rabbitmq import RabbitMQRPCClient
11+
from servicelib.rabbitmq.rpc_interfaces.dynamic_sidecar import disk_usage
12+
from settings_library.redis import RedisSettings
13+
from simcore_service_dynamic_sidecar.core.settings import ApplicationSettings
14+
from simcore_service_dynamic_sidecar.modules.system_monitor._disk_usage import (
15+
get_disk_usage_monitor,
16+
)
17+
18+
pytest_simcore_core_services_selection = [
19+
"redis",
20+
"rabbit",
21+
]
22+
23+
24+
@pytest.fixture
25+
def mock_environment(
26+
redis_service: RedisSettings, mock_environment: EnvVarsDict
27+
) -> EnvVarsDict:
28+
return mock_environment
29+
30+
31+
async def test_get_state(app: FastAPI, rpc_client: RabbitMQRPCClient):
32+
usage = {
33+
"some_path": DiskUsage(
34+
total=ByteSize(0), used=ByteSize(0), free=ByteSize(0), used_percent=0
35+
)
36+
}
37+
settings: ApplicationSettings = app.state.settings
38+
39+
result = await disk_usage.update_disk_usage(
40+
rpc_client, node_id=settings.DY_SIDECAR_NODE_ID, usage=usage
41+
)
42+
assert result is None
43+
44+
assert get_disk_usage_monitor(app)._usage_overwrite == usage # noqa: SLF001

0 commit comments

Comments
 (0)