arm-core/api/scripts/check_infra.py
Andrey Epifancev 81bb79e600 feat: make check-full — check, dbml-check, интеграционные тесты против compose, docker build, web; .env.test на порты compose
Цели 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>
2026-10-04 00:58:57 +04:00

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())