Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: make config monkeypatchable #531

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 6 additions & 12 deletions core/testcontainers/core/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,7 @@
import docker.errors
from typing_extensions import Self

from testcontainers.core.config import (
RYUK_DISABLED,
RYUK_DOCKER_SOCKET,
RYUK_IMAGE,
RYUK_PRIVILEGED,
RYUK_RECONNECTION_TIMEOUT,
)
from testcontainers.core import config
from testcontainers.core.docker_client import DockerClient
from testcontainers.core.exceptions import ContainerStartException
from testcontainers.core.labels import LABEL_SESSION_ID, SESSION_ID
Expand Down Expand Up @@ -77,7 +71,7 @@ def maybe_emulate_amd64(self) -> Self:
return self

def start(self) -> Self:
if not RYUK_DISABLED and self.image != RYUK_IMAGE:
if not config.RYUK_DISABLED and self.image != config.RYUK_IMAGE:
logger.debug("Creating Ryuk container")
Reaper.get_instance()
logger.info("Pulling image %s", self.image)
Expand Down Expand Up @@ -201,12 +195,12 @@ def _create_instance(cls) -> "Reaper":
logger.debug(f"Creating new Reaper for session: {SESSION_ID}")

Reaper._container = (
DockerContainer(RYUK_IMAGE)
DockerContainer(config.RYUK_IMAGE)
.with_name(f"testcontainers-ryuk-{SESSION_ID}")
.with_exposed_ports(8080)
.with_volume_mapping(RYUK_DOCKER_SOCKET, "/var/run/docker.sock", "rw")
.with_kwargs(privileged=RYUK_PRIVILEGED, auto_remove=True)
.with_env("RYUK_RECONNECTION_TIMEOUT", RYUK_RECONNECTION_TIMEOUT)
.with_volume_mapping(config.RYUK_DOCKER_SOCKET, "/var/run/docker.sock", "rw")
.with_kwargs(privileged=config.RYUK_PRIVILEGED, auto_remove=True)
.with_env("RYUK_RECONNECTION_TIMEOUT", config.RYUK_RECONNECTION_TIMEOUT)
.start()
)
wait_for_logs(Reaper._container, r".* Started!")
Expand Down
4 changes: 2 additions & 2 deletions core/testcontainers/core/labels.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional
from uuid import uuid4

from testcontainers.core.config import RYUK_IMAGE
from testcontainers.core import config

SESSION_ID: str = str(uuid4())
LABEL_SESSION_ID = "org.testcontainers.session-id"
Expand All @@ -13,7 +13,7 @@ def create_labels(image: str, labels: Optional[dict[str, str]]) -> dict[str, str
labels = {}
labels[LABEL_LANG] = "python"

if image == RYUK_IMAGE:
if image == config.RYUK_IMAGE:
return labels

labels[LABEL_SESSION_ID] = SESSION_ID
Expand Down
6 changes: 3 additions & 3 deletions core/tests/test_ryuk.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
from docker import DockerClient
from docker.errors import NotFound

from testcontainers.core import container as container_module
from testcontainers.core import config
from testcontainers.core.container import Reaper
from testcontainers.core.container import DockerContainer
from testcontainers.core.waiting_utils import wait_for_logs


def test_wait_for_reaper(monkeypatch: MonkeyPatch):
Reaper.delete_instance()
monkeypatch.setattr(container_module, "RYUK_RECONNECTION_TIMEOUT", "0.1s")
monkeypatch.setattr(config, "RYUK_RECONNECTION_TIMEOUT", "0.1s")
docker_client = DockerClient()
container = DockerContainer("hello-world").start()

Expand All @@ -40,7 +40,7 @@ def test_wait_for_reaper(monkeypatch: MonkeyPatch):

def test_container_without_ryuk(monkeypatch: MonkeyPatch):
Reaper.delete_instance()
monkeypatch.setattr(container_module, "RYUK_DISABLED", True)
monkeypatch.setattr(config, "RYUK_DISABLED", True)
with DockerContainer("hello-world") as container:
wait_for_logs(container, "Hello from Docker!")
assert Reaper._instance is None
Expand Down
4 changes: 2 additions & 2 deletions modules/arangodb/testcontainers/arangodb/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import typing
from os import environ

from testcontainers.core.config import TIMEOUT
from testcontainers.core import config
from testcontainers.core.generic import DbContainer
from testcontainers.core.utils import raise_for_deprecated_parameter
from testcontainers.core.waiting_utils import wait_for_logs
Expand Down Expand Up @@ -90,4 +90,4 @@ def get_connection_url(self) -> str:
return f"http://{self.get_container_host_ip()}:{port}"

def _connect(self) -> None:
wait_for_logs(self, predicate="is ready for business", timeout=TIMEOUT)
wait_for_logs(self, predicate="is ready for business", timeout=config.TIMEOUT)
4 changes: 2 additions & 2 deletions modules/k3s/testcontainers/k3s/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# License for the specific language governing permissions and limitations
# under the License.

from testcontainers.core.config import MAX_TRIES
from testcontainers.core import config
from testcontainers.core.container import DockerContainer
from testcontainers.core.waiting_utils import wait_for_logs

Expand Down Expand Up @@ -46,7 +46,7 @@ def __init__(self, image="rancher/k3s:latest", **kwargs) -> None:
self.with_volume_mapping("/sys/fs/cgroup", "/sys/fs/cgroup", "rw")

def _connect(self) -> None:
wait_for_logs(self, predicate="Node controller sync successful", timeout=MAX_TRIES)
wait_for_logs(self, predicate="Node controller sync successful", timeout=config.MAX_TRIES)

def start(self) -> "K3SContainer":
super().start()
Expand Down
4 changes: 2 additions & 2 deletions modules/neo4j/testcontainers/neo4j/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from typing import Optional

from neo4j import Driver, GraphDatabase
from testcontainers.core.config import TIMEOUT
from testcontainers.core import config
from testcontainers.core.generic import DbContainer
from testcontainers.core.utils import raise_for_deprecated_parameter
from testcontainers.core.waiting_utils import wait_container_is_ready, wait_for_logs
Expand Down Expand Up @@ -62,7 +62,7 @@ def get_connection_url(self) -> str:

@wait_container_is_ready()
def _connect(self) -> None:
wait_for_logs(self, "Remote interface available at", TIMEOUT)
wait_for_logs(self, "Remote interface available at", config.TIMEOUT)

# Then we actually check that the container really is listening
with self.get_driver() as driver:
Expand Down
8 changes: 4 additions & 4 deletions modules/postgres/testcontainers/postgres/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from time import sleep
from typing import Optional

from testcontainers.core.config import MAX_TRIES, SLEEP_TIME
from testcontainers.core import config
from testcontainers.core.generic import DbContainer
from testcontainers.core.utils import raise_for_deprecated_parameter
from testcontainers.core.waiting_utils import wait_container_is_ready, wait_for_logs
Expand Down Expand Up @@ -91,15 +91,15 @@ def get_connection_url(self, host: Optional[str] = None, driver: Optional[str] =

@wait_container_is_ready()
def _connect(self) -> None:
wait_for_logs(self, ".*database system is ready to accept connections.*", MAX_TRIES, SLEEP_TIME)
wait_for_logs(self, ".*database system is ready to accept connections.*", config.MAX_TRIES, config.SLEEP_TIME)

count = 0
while count < MAX_TRIES:
while count < config.MAX_TRIES:
status, _ = self.exec(f"pg_isready -hlocalhost -p{self.port} -U{self.username}")
if status == 0:
return

sleep(SLEEP_TIME)
sleep(config.SLEEP_TIME)
count += 1

raise RuntimeError("Postgres could not get into a ready state")
4 changes: 2 additions & 2 deletions modules/qdrant/testcontainers/qdrant/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from pathlib import Path
from typing import Optional

from testcontainers.core.config import TIMEOUT
from testcontainers.core import config
from testcontainers.core.generic import DbContainer
from testcontainers.core.waiting_utils import wait_container_is_ready, wait_for_logs

Expand Down Expand Up @@ -61,7 +61,7 @@ def _configure(self) -> None:

@wait_container_is_ready()
def _connect(self) -> None:
wait_for_logs(self, ".*Actix runtime found; starting in Actix runtime.*", TIMEOUT)
wait_for_logs(self, ".*Actix runtime found; starting in Actix runtime.*", config.TIMEOUT)

def get_client(self, **kwargs):
"""
Expand Down