Skip to content

Commit 3622fc2

Browse files
authored
Merge branch 'main' into feature/857
2 parents d47b8d8 + 87332c1 commit 3622fc2

File tree

4 files changed

+14
-24
lines changed

4 files changed

+14
-24
lines changed

docs/features/wait_strategies.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,17 @@ Testcontainers-Python provides several strategies to wait for containers to be r
44

55
## Basic Wait Strategy
66

7-
The simplest way to wait for a container is using the `wait_container_is_ready` decorator:
7+
The simplest way to wait for a container is using a structured wait strategy:
88

99
```python
10-
from testcontainers.core.waiting_utils import wait_container_is_ready
10+
from testcontainers.core.wait_strategies import HttpWaitStrategy
1111

1212
class MyContainer(DockerContainer):
13-
@wait_container_is_ready()
1413
def _connect(self):
15-
# Your connection logic here
16-
pass
14+
HttpWaitStrategy(8080).wait_until_ready(self)
1715
```
1816

19-
This decorator will retry the method until it succeeds or times out. By default, it will retry for 120 seconds with a 1-second interval between attempts.
17+
The strategy will retry until it succeeds or times out. By default, it will retry for 120 seconds with a 1-second interval between attempts.
2018

2119
## Log-based Waiting
2220

modules/generic/testcontainers/generic/server.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
from typing import Union
2-
from urllib.error import HTTPError, URLError
3-
from urllib.request import urlopen
42

53
import httpx
64

75
from testcontainers.core.container import DockerContainer
86
from testcontainers.core.exceptions import ContainerStartException
97
from testcontainers.core.image import DockerImage
10-
from testcontainers.core.waiting_utils import wait_container_is_ready
8+
from testcontainers.core.wait_strategies import HttpWaitStrategy
119

1210

1311
class ServerContainer(DockerContainer):
@@ -40,19 +38,9 @@ def __init__(self, port: int, image: Union[str, DockerImage]) -> None:
4038
self.internal_port = port
4139
self.with_exposed_ports(self.internal_port)
4240

43-
@wait_container_is_ready(HTTPError, URLError)
4441
def _connect(self) -> None:
45-
# noinspection HttpUrlsUsage
46-
url = self._create_connection_url()
47-
try:
48-
with urlopen(url) as r:
49-
assert b"" in r.read()
50-
except HTTPError as e:
51-
# 404 is expected, as the server may not have the specific endpoint we are looking for
52-
if e.code == 404:
53-
pass
54-
else:
55-
raise
42+
strategy = HttpWaitStrategy(self.internal_port).for_status_code(404)
43+
strategy.wait_until_ready(self)
5644

5745
def get_api_url(self) -> str:
5846
raise NotImplementedError

modules/kafka/testcontainers/kafka/_redpanda.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import os.path
2+
import re
23
import tarfile
34
import time
45
from io import BytesIO
56
from textwrap import dedent
67

78
from testcontainers.core.container import DockerContainer
8-
from testcontainers.core.waiting_utils import wait_for_logs
9+
from testcontainers.core.wait_strategies import LogMessageWaitStrategy
910

1011

1112
class RedpandaContainer(DockerContainer):
@@ -34,6 +35,7 @@ def __init__(
3435
self.redpanda_port = 9092
3536
self.schema_registry_port = 8081
3637
self.with_exposed_ports(self.redpanda_port, self.schema_registry_port)
38+
self.wait_for: re.Pattern[str] = re.compile(r".*Started Kafka API server.*")
3739

3840
def get_bootstrap_server(self) -> str:
3941
host = self.get_container_host_ip()
@@ -70,7 +72,9 @@ def start(self, timeout=10) -> "RedpandaContainer":
7072
self.with_command(command)
7173
super().start()
7274
self.tc_start()
73-
wait_for_logs(self, r".*Started Kafka API server.*", timeout=timeout)
75+
wait_strategy = LogMessageWaitStrategy(self.wait_for)
76+
wait_strategy.with_startup_timeout(timeout)
77+
wait_strategy.wait_until_ready(self)
7478
return self
7579

7680
def create_file(self, content: bytes, path: str) -> None:

modules/kafka/tests/test_redpanda.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_redpanda_producer_consumer():
1313
produce_and_consume_message(container)
1414

1515

16-
@pytest.mark.parametrize("version", ["v23.1.13", "v23.3.10"])
16+
@pytest.mark.parametrize("version", ["v23.1.13", "v25.3.6"])
1717
def test_redpanda_confluent_version(version):
1818
with RedpandaContainer(image=f"docker.redpanda.com/redpandadata/redpanda:{version}") as container:
1919
produce_and_consume_message(container)

0 commit comments

Comments
 (0)