Skip to content

Commit 41f9a9d

Browse files
author
Andrei Neagu
committed
extraced ServiceManager
1 parent 424e4ea commit 41f9a9d

File tree

2 files changed

+65
-58
lines changed

2 files changed

+65
-58
lines changed

packages/pytest-simcore/src/pytest_simcore/helpers/docker.py

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1+
import contextlib
12
import json
23
import logging
34
import os
45
import re
56
import subprocess
7+
from collections.abc import AsyncIterator, Callable
8+
from contextlib import AbstractAsyncContextManager
69
from enum import Enum
710
from pathlib import Path
8-
from typing import Any
11+
from typing import Any, Protocol
912

1013
import docker
1114
import yaml
15+
from servicelib.rabbitmq import RabbitMQClient
16+
from servicelib.redis import RedisClientSDK
1217
from tenacity import retry
1318
from tenacity.after import after_log
14-
from tenacity.stop import stop_after_attempt
19+
from tenacity.asyncio import AsyncRetrying
20+
from tenacity.retry import retry_if_exception_type
21+
from tenacity.stop import stop_after_attempt, stop_after_delay
1522
from tenacity.wait import wait_fixed
1623

1724

@@ -272,3 +279,56 @@ def save_docker_infos(destination_dir: Path):
272279
f"wrote docker log and json files for {len(all_containers)} containers in ",
273280
destination_dir,
274281
)
282+
283+
284+
class _ClientWithPingProtocol(Protocol):
285+
async def ping(self) -> bool: ...
286+
287+
288+
class ServiceManager:
289+
def __init__(
290+
self,
291+
redis_client: RedisClientSDK,
292+
rabbit_client: RabbitMQClient,
293+
paused_container: Callable[[str], AbstractAsyncContextManager[None]],
294+
) -> None:
295+
self.redis_client = redis_client
296+
self.rabbit_client = rabbit_client
297+
self.paused_container = paused_container
298+
299+
@contextlib.asynccontextmanager
300+
async def _paused_container(
301+
self, container_name: str, client: _ClientWithPingProtocol
302+
) -> AsyncIterator[None]:
303+
async with self.paused_container(container_name):
304+
async for attempt in AsyncRetrying(
305+
wait=wait_fixed(0.1),
306+
stop=stop_after_delay(10),
307+
reraise=True,
308+
retry=retry_if_exception_type(AssertionError),
309+
):
310+
with attempt:
311+
assert await client.ping() is False
312+
yield
313+
314+
async for attempt in AsyncRetrying(
315+
wait=wait_fixed(0.1),
316+
stop=stop_after_delay(10),
317+
reraise=True,
318+
retry=retry_if_exception_type(AssertionError),
319+
):
320+
with attempt:
321+
assert await client.ping() is True
322+
323+
@contextlib.asynccontextmanager
324+
async def pause_rabbit(self) -> AsyncIterator[None]:
325+
async with self._paused_container("rabbit", self.rabbit_client):
326+
yield
327+
328+
@contextlib.asynccontextmanager
329+
async def pause_redis(self) -> AsyncIterator[None]:
330+
# save db for clean restore point
331+
await self.redis_client.redis.save()
332+
333+
async with self._paused_container("redis", self.redis_client):
334+
yield

packages/service-library/tests/deferred_tasks/test_deferred_tasks.py

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22
# pylint:disable=unused-argument
33

44
import asyncio
5-
import contextlib
65
import datetime
76
import itertools
87
import json
98
import random
109
import sys
11-
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable
10+
from collections.abc import AsyncIterable, Awaitable, Callable
1211
from contextlib import AbstractAsyncContextManager, AsyncExitStack, suppress
1312
from pathlib import Path
14-
from typing import Any, Protocol
13+
from typing import Any
1514

1615
import psutil
1716
import pytest
@@ -20,6 +19,7 @@
2019
from common_library.serialization import model_dump_with_secrets
2120
from pydantic import NonNegativeFloat, NonNegativeInt
2221
from pytest_mock import MockerFixture
22+
from pytest_simcore.helpers.docker import ServiceManager
2323
from servicelib.rabbitmq import RabbitMQClient
2424
from servicelib.redis import RedisClientSDK
2525
from servicelib.sequences_utils import partition_gen
@@ -332,59 +332,6 @@ async def rabbit_client(
332332
return create_rabbitmq_client("pinger")
333333

334334

335-
class ClientWithPingProtocol(Protocol):
336-
async def ping(self) -> bool: ...
337-
338-
339-
class ServiceManager:
340-
def __init__(
341-
self,
342-
redis_client: RedisClientSDK,
343-
rabbit_client: RabbitMQClient,
344-
paused_container: Callable[[str], AbstractAsyncContextManager[None]],
345-
) -> None:
346-
self.redis_client = redis_client
347-
self.rabbit_client = rabbit_client
348-
self.paused_container = paused_container
349-
350-
@contextlib.asynccontextmanager
351-
async def _paused_container(
352-
self, container_name: str, client: ClientWithPingProtocol
353-
) -> AsyncIterator[None]:
354-
async with self.paused_container(container_name):
355-
async for attempt in AsyncRetrying(
356-
wait=wait_fixed(0.1),
357-
stop=stop_after_delay(10),
358-
reraise=True,
359-
retry=retry_if_exception_type(AssertionError),
360-
):
361-
with attempt:
362-
assert await client.ping() is False
363-
yield
364-
365-
async for attempt in AsyncRetrying(
366-
wait=wait_fixed(0.1),
367-
stop=stop_after_delay(10),
368-
reraise=True,
369-
retry=retry_if_exception_type(AssertionError),
370-
):
371-
with attempt:
372-
assert await client.ping() is True
373-
374-
@contextlib.asynccontextmanager
375-
async def pause_rabbit(self) -> AsyncIterator[None]:
376-
async with self._paused_container("rabbit", self.rabbit_client):
377-
yield
378-
379-
@contextlib.asynccontextmanager
380-
async def pause_redis(self) -> AsyncIterator[None]:
381-
# save db for clean restore point
382-
await self.redis_client.redis.save()
383-
384-
async with self._paused_container("redis", self.redis_client):
385-
yield
386-
387-
388335
@pytest.fixture
389336
def mock_default_socket_timeout(mocker: MockerFixture) -> None:
390337
mocker.patch(

0 commit comments

Comments
 (0)