|
11 | 11 | # License for the specific language governing permissions and limitations |
12 | 12 | # under the License. |
13 | 13 | import os |
14 | | -from time import sleep |
15 | 14 | from typing import Optional |
16 | 15 |
|
17 | | -from testcontainers.core.config import testcontainers_config as c |
18 | 16 | from testcontainers.core.generic import DbContainer |
19 | 17 | from testcontainers.core.utils import raise_for_deprecated_parameter |
20 | | -from testcontainers.core.waiting_utils import wait_container_is_ready, wait_for_logs |
| 18 | +from testcontainers.core.waiting_utils import wait_container_is_ready |
21 | 19 |
|
22 | 20 | _UNSET = object() |
23 | 21 |
|
@@ -91,45 +89,13 @@ def get_connection_url(self, host: Optional[str] = None, driver: Optional[str] = |
91 | 89 |
|
92 | 90 | @wait_container_is_ready() |
93 | 91 | def _connect(self) -> None: |
94 | | - # postgres itself logs these messages to the standard error stream: |
95 | | - # |
96 | | - # $ /opt/homebrew/opt/postgresql@14/bin/postgres -D /opt/homebrew/var/postgresql@14 \ |
97 | | - # > | grep -o -a -m 1 -h 'database system is ready to accept connections' |
98 | | - # 2024-08-03 00:13:02.799 EDT [70226] LOG: starting PostgreSQL 14.11 (Homebrew) .... |
99 | | - # 2024-08-03 00:13:02.804 EDT [70226] LOG: listening on IPv4 address "127.0.0.1", port 5432 |
100 | | - # ... |
101 | | - # ^C2024-08-03 00:13:04.226 EDT [70226] LOG: received fast shutdown request |
102 | | - # ... |
103 | | - # |
104 | | - # $ /opt/homebrew/opt/postgresql@14/bin/postgres -D /opt/homebrew/var/postgresql@14 2>&1 \ |
105 | | - # > | grep -o -a -m 1 -h 'database system is ready to accept connections' |
106 | | - # database system is ready to accept connections |
107 | | - # |
108 | | - # and the setup script inside docker library postgres |
109 | | - # uses pg_ctl: |
110 | | - # https://github.com/docker-library/postgres/blob/66da3846b40396249936938ee17e9684e6968a57/16/alpine3.20/docker-entrypoint.sh#L261-L282 |
111 | | - # which prints logs to stdout: |
112 | | - # https://www.postgresql.org/docs/current/app-pg-ctl.html#:~:text=the%20server%27s%20standard%20output%20and%20standard%20error%20are%20sent%20to%20pg_ctl%27s%20standard%20output |
113 | | - # |
114 | | - # so we must wait for both the setup and real startup: |
115 | | - predicate_streams_and = True |
116 | | - |
117 | | - wait_for_logs( |
118 | | - self, |
119 | | - ".*database system is ready to accept connections.*", |
120 | | - c.max_tries, |
121 | | - c.sleep_time, |
122 | | - predicate_streams_and=predicate_streams_and, |
123 | | - # |
| 92 | + escaped_single_password = self.password.replace("'", "'\"'\"'") |
| 93 | + result = self.exec( |
| 94 | + [ |
| 95 | + "sh", |
| 96 | + "-c", |
| 97 | + f"PGPASSWORD='{escaped_single_password}' psql --username {self.username} --dbname {self.dbname} --host 127.0.0.1 -c 'select version();'", |
| 98 | + ] |
124 | 99 | ) |
125 | | - |
126 | | - count = 0 |
127 | | - while count < c.max_tries: |
128 | | - status, _ = self.exec(f"pg_isready -hlocalhost -p{self.port} -U{self.username}") |
129 | | - if status == 0: |
130 | | - return |
131 | | - |
132 | | - sleep(c.sleep_time) |
133 | | - count += 1 |
134 | | - |
135 | | - raise RuntimeError("Postgres could not get into a ready state") |
| 100 | + if result.exit_code: |
| 101 | + raise ConnectionError("pg_isready is not ready yet") |
0 commit comments