Skip to content

Commit 98454f2

Browse files
author
Andrei Neagu
committed
added tests for rpc endpoint
1 parent 9488bc3 commit 98454f2

File tree

10 files changed

+147
-15
lines changed

10 files changed

+147
-15
lines changed

packages/models-library/src/models_library/api_schemas_api_agent/__init__.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/agent/__init__.py

Whitespace-only changes.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import logging
2+
from datetime import timedelta
3+
4+
from models_library.projects_nodes_io import NodeID
5+
from models_library.rabbitmq_basic_types import RPCMethodName, RPCNamespace
6+
from pydantic import parse_obj_as
7+
from servicelib.logging_utils import log_decorator
8+
from servicelib.rabbitmq import RabbitMQRPCClient
9+
10+
_logger = logging.getLogger(__name__)
11+
12+
13+
@log_decorator(_logger, level=logging.DEBUG)
14+
async def remove_volumes_without_backup_for_service(
15+
rabbitmq_rpc_client: RabbitMQRPCClient,
16+
*,
17+
docker_node_id: str,
18+
swarm_stack_name: str,
19+
node_id: NodeID,
20+
) -> None:
21+
result = await rabbitmq_rpc_client.request(
22+
RPCNamespace.from_entries(
23+
{
24+
"service": "agent",
25+
"docker_node_id": docker_node_id,
26+
"swarm_stack_name": swarm_stack_name,
27+
}
28+
),
29+
parse_obj_as(RPCMethodName, "remove_volumes_without_backup_for_service"),
30+
node_id=node_id,
31+
timeout_s=int(timedelta(minutes=60).total_seconds()),
32+
)
33+
assert result is None # noec
34+
35+
36+
@log_decorator(_logger, level=logging.DEBUG)
37+
async def backup_and_remove_volumes_for_all_services(
38+
rabbitmq_rpc_client: RabbitMQRPCClient,
39+
*,
40+
docker_node_id: str,
41+
swarm_stack_name: str,
42+
) -> None:
43+
result = await rabbitmq_rpc_client.request(
44+
RPCNamespace.from_entries(
45+
{
46+
"service": "agent",
47+
"docker_node_id": docker_node_id,
48+
"swarm_stack_name": swarm_stack_name,
49+
}
50+
),
51+
parse_obj_as(RPCMethodName, "backup_and_remove_volumes_for_all_services"),
52+
timeout_s=int(timedelta(minutes=60).total_seconds()),
53+
)
54+
assert result is None # noec

services/agent/src/simcore_service_agent/core/api/rpc/_volumes.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,3 @@ async def remove_volumes_without_backup_for_service(
1616
@router.expose()
1717
async def backup_and_remove_volumes_for_all_services(app: FastAPI) -> None:
1818
await get_volumes_manager(app).remove_all_volumes()
19-
20-
21-
# TODO: add tests for these

services/agent/src/simcore_service_agent/core/api/rpc/routes.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from fastapi import FastAPI
2-
from models_library.api_schemas_api_agent import AGENT_RPC_NAMESPACE
2+
from models_library.rabbitmq_basic_types import RPCNamespace
33
from servicelib.rabbitmq import RPCRouter
4+
from simcore_service_agent.core.settings import ApplicationSettings
45

56
from ....services.rabbitmq import get_rabbitmq_rpc_server
67
from . import _volumes
@@ -13,7 +14,15 @@
1314
def setup_rpc_api_routes(app: FastAPI) -> None:
1415
async def startup() -> None:
1516
rpc_server = get_rabbitmq_rpc_server(app)
17+
settings: ApplicationSettings = app.state.settings
18+
namespace = RPCNamespace.from_entries(
19+
{
20+
"service": "agent",
21+
"docker_node_id": settings.AGENT_DOCKER_NODE_ID,
22+
"swarm_stack_name": settings.AGENT_VOLUMES_CLEANUP_TARGET_SWARM_STACK_NAME,
23+
}
24+
)
1625
for router in ROUTERS:
17-
await rpc_server.register_router(router, AGENT_RPC_NAMESPACE, app)
26+
await rpc_server.register_router(router, namespace, app)
1827

1928
app.add_event_handler("startup", startup)

services/agent/src/simcore_service_agent/core/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class ApplicationSettings(BaseCustomSettings, MixinLoggingSettings):
6565

6666
AGENT_PROMETHEUS_INSTRUMENTATION_ENABLED: bool = True
6767

68+
AGENT_DOCKER_NODE_ID: str = Field(..., description="used by the rabbitmq module")
69+
6870
AGENT_RABBITMQ: RabbitSettings = Field(
6971
auto_default_from_env=True, description="settings for service/rabbitmq"
7072
)

services/agent/tests/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ def swarm_stack_name() -> str:
2424
return "test-simcore"
2525

2626

27+
@pytest.fixture
28+
def docker_node_id() -> str:
29+
return "test-node-id"
30+
31+
2732
@pytest.fixture
2833
def bucket(faker: Faker) -> str:
2934
return f"test-bucket-{faker.uuid4()}"
@@ -35,6 +40,7 @@ def mock_environment(
3540
mocked_s3_server_url: HttpUrl,
3641
bucket: str,
3742
swarm_stack_name: str,
43+
docker_node_id: str,
3844
) -> EnvVarsDict:
3945
return setenvs_from_dict(
4046
monkeypatch,
@@ -51,6 +57,7 @@ def mock_environment(
5157
"RABBIT_PASSWORD": "test",
5258
"RABBIT_SECURE": "false",
5359
"RABBIT_USER": "test",
60+
"AGENT_DOCKER_NODE_ID": docker_node_id,
5461
},
5562
)
5663

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# pylint:disable=redefined-outer-name
2+
# pylint:disable=unused-argument
3+
4+
from collections.abc import Awaitable, Callable
5+
from unittest.mock import AsyncMock
6+
from uuid import uuid4
7+
8+
import pytest
9+
import pytest_mock
10+
from fastapi import FastAPI
11+
from servicelib.rabbitmq import RabbitMQRPCClient
12+
from servicelib.rabbitmq.rpc_interfaces.agent import volumes
13+
from simcore_service_agent.services.volumes_manager import get_volumes_manager
14+
15+
pytest_simcore_core_services_selection = [
16+
"rabbit",
17+
]
18+
19+
20+
@pytest.fixture
21+
async def rpc_client(
22+
initialized_app: FastAPI,
23+
rabbitmq_rpc_client: Callable[[str], Awaitable[RabbitMQRPCClient]],
24+
) -> RabbitMQRPCClient:
25+
return await rabbitmq_rpc_client("client")
26+
27+
28+
@pytest.fixture
29+
def spy_remove_service_volumes(
30+
mocker: pytest_mock.MockerFixture, initialized_app: FastAPI
31+
) -> AsyncMock:
32+
return mocker.spy(get_volumes_manager(initialized_app), "remove_service_volumes")
33+
34+
35+
@pytest.fixture
36+
def spy_remove_all_volumes(
37+
mocker: pytest_mock.MockerFixture, initialized_app: FastAPI
38+
) -> AsyncMock:
39+
return mocker.spy(get_volumes_manager(initialized_app), "remove_all_volumes")
40+
41+
42+
async def test_backup_and_remove_volumes_for_all_services(
43+
rpc_client: RabbitMQRPCClient,
44+
swarm_stack_name: str,
45+
docker_node_id: str,
46+
spy_remove_all_volumes: AsyncMock,
47+
):
48+
assert spy_remove_all_volumes.call_count == 0
49+
await volumes.backup_and_remove_volumes_for_all_services(
50+
rpc_client, docker_node_id=docker_node_id, swarm_stack_name=swarm_stack_name
51+
)
52+
assert spy_remove_all_volumes.call_count == 1
53+
54+
55+
async def test_remove_volumes_without_backup_for_service(
56+
rpc_client: RabbitMQRPCClient,
57+
swarm_stack_name: str,
58+
docker_node_id: str,
59+
spy_remove_service_volumes: AsyncMock,
60+
):
61+
assert spy_remove_service_volumes.call_count == 0
62+
await volumes.remove_volumes_without_backup_for_service(
63+
rpc_client,
64+
docker_node_id=docker_node_id,
65+
swarm_stack_name=swarm_stack_name,
66+
node_id=uuid4(),
67+
)
68+
assert spy_remove_service_volumes.call_count == 1

services/agent/tests/unit/test_services_volumes_manager.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ def get_unused_dynamc_sidecar_volumes(self) -> set[str]:
4242
return deepcopy(self.volumes)
4343

4444

45-
# spy on remove_volume
46-
47-
4845
@pytest.fixture
4946
async def mock_docker_utils(
5047
mocker: pytest_mock.MockerFixture, run_id: RunID

services/docker-compose.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,11 @@ services:
10051005
AGENT_VOLUMES_CLEANUP_S3_SECRET_KEY: ${AGENT_VOLUMES_CLEANUP_S3_SECRET_KEY}
10061006
AGENT_VOLUMES_CLEANUP_S3_BUCKET: ${AGENT_VOLUMES_CLEANUP_S3_BUCKET}
10071007
AGENT_VOLUMES_CLEANUP_S3_PROVIDER: ${AGENT_VOLUMES_CLEANUP_S3_PROVIDER}
1008+
AGENT_DOCKER_NODE_ID: "{{.Node.ID}}"
1009+
RABBIT_HOST: ${RABBIT_HOST}
1010+
RABBIT_PASSWORD: ${RABBIT_PASSWORD}
1011+
RABBIT_PORT: ${RABBIT_PORT}
1012+
RABBIT_USER: ${RABBIT_USER}
10081013

10091014
dask-sidecar:
10101015
image: ${DOCKER_REGISTRY:-itisfoundation}/dask-sidecar:${DOCKER_IMAGE_TAG:-latest}

0 commit comments

Comments
 (0)