deploy: гейт покрытия стенда и тестируемая health-заглушка (#56)

- deploy/api_stub.py: make_server() выделен из main(), main(argv) — тесты поднимают
  настоящий сервер на порту 0 (покрытие api_stub.py 0 % -> 98 %).
- Makefile: make test-deploy (гейт ≥70 % через tests/deploy/pytest.ini),
  test-netns-ci прокидывает AWG_NS_EXEC_MODE.

Refs #21, Refs #15, Refs #56
This commit is contained in:
2026-10-28 21:30:33 +03:00
parent 4aa69132ad
commit c7f2ea128e
2 changed files with 33 additions and 7 deletions
+16 -5
View File
@@ -25,6 +25,8 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
STARTED_AT = time.time()
STUB_ENV = os.environ.get("AWG_API_STUB", "0")
HEALTH_PATHS = ("/api/v1/health", "/healthz")
class Handler(BaseHTTPRequestHandler):
server_version = "awg-dash-stub/0.1"
@@ -40,7 +42,7 @@ class Handler(BaseHTTPRequestHandler):
def do_GET(self) -> None: # noqa: N802 (HTTP-метод)
path = self.path.split("?", 1)[0]
if path in ("/api/v1/health", "/healthz"):
if path in HEALTH_PATHS:
self._json(
200,
{
@@ -56,7 +58,7 @@ class Handler(BaseHTTPRequestHandler):
self._json(404, {"error": "not_implemented", "issue": "#31", "path": path})
def do_HEAD(self) -> None: # noqa: N802
self.send_response(200 if self.path.split("?", 1)[0] in ("/api/v1/health", "/healthz") else 404)
self.send_response(200 if self.path.split("?", 1)[0] in HEALTH_PATHS else 404)
self.send_header("Content-Length", "0")
self.end_headers()
@@ -64,19 +66,28 @@ class Handler(BaseHTTPRequestHandler):
print(f"[api-stub] {self.address_string()} {fmt % args}", flush=True)
def main() -> int:
def make_server(host: str, port: int) -> ThreadingHTTPServer:
"""HTTP-сервер заглушки.
Вынесен из main(), чтобы тесты (tests/deploy/test_api_stub.py) поднимали
настоящий HTTP-сервер на свободном порту (port=0) и проверяли коды ответов.
"""
return ThreadingHTTPServer((host, port), Handler)
def main(argv: list[str] | None = None) -> int:
ap = argparse.ArgumentParser(description="DEV-ONLY заглушка health для dev-стенда (#21)")
ap.add_argument("--host", default="0.0.0.0")
ap.add_argument("--port", type=int, default=8080)
ap.add_argument("--domain", default="/config", help="каталог, доступность которого проверяем (для лога)")
args = ap.parse_args()
args = ap.parse_args(argv)
print(
f"[api-stub] DEV-ONLY заглушка на {args.host}:{args.port}; каталог {args.domain} "
f"{'доступен' if os.path.isdir(args.domain) else 'НЕ доступен'}",
flush=True,
)
ThreadingHTTPServer((args.host, args.port), Handler).serve_forever()
make_server(args.host, args.port).serve_forever()
return 0