Цели docker-build, web-check, check-infra (подсказка «make up»); .env.test переведён на 5432/4222/9000 (R-19), test_config и README обновлены. Цикл миграций входит в test-integration и отдельным шагом не дублируется. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""Быстрая проверка доступности PostgreSQL и NATS из `.env.test` (порты docker-compose из docs/dev).
|
|
|
|
Нужна `make check-full`, чтобы вместо длинного трейсбека pytest сразу подсказать: «поднимите инфраструктуру: make up».
|
|
Только TCP-подключение, без аутентификации; коды: 0 — доступны, 1 — недоступны.
|
|
"""
|
|
|
|
import socket
|
|
import sys
|
|
from pathlib import Path
|
|
from urllib.parse import urlparse
|
|
|
|
from dotenv import dotenv_values
|
|
|
|
ENV_FILE = Path(__file__).resolve().parent.parent / ".env.test"
|
|
KEYS = ("OPENBAO__DATABASE__DATABASE_URL", "OPENBAO__NATS__NATS_URL")
|
|
|
|
|
|
def unreachable(urls: list[str]) -> list[str]:
|
|
"""Адреса host:port, к которым не удалось подключиться."""
|
|
bad: list[str] = []
|
|
for url in urls:
|
|
parsed = urlparse(url)
|
|
host, port = parsed.hostname or "localhost", parsed.port or 0
|
|
try:
|
|
with socket.create_connection((host, port), timeout=3):
|
|
pass
|
|
except OSError:
|
|
bad.append(f"{host}:{port}")
|
|
return bad
|
|
|
|
|
|
def main() -> int:
|
|
env = dotenv_values(ENV_FILE)
|
|
bad = unreachable([env[key] or "" for key in KEYS])
|
|
if bad:
|
|
print(f"Инфраструктура недоступна ({', '.join(bad)}): поднимите её командой make up", file=sys.stderr)
|
|
return 1
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|