feat: минимальный Flask (v0.1.0) — /health, /, /api/v1/svc/*

This commit is contained in:
2026-07-31 19:46:17 +04:00
parent 6250ba224d
commit 9dddc96704
2 changed files with 70 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
# Python 3.12
Flask>=3.0
gunicorn>=21.2
PyYAML>=6.0
+66
View File
@@ -0,0 +1,66 @@
"""
polygon v0.1.0 — Mock Nubes API.
Эмулятор REST API облачной платформы Nubes для интеграционных тестов.
Эндпоинты с префиксом /api/v1/svc притворяются реальным Nubes API.
Состояние инстансов/операций — в памяти (MockState).
Деплой: Nubes pythonk8s (managed service) с gunicorn:
gunicorn app:app --workers 2 --bind 0.0.0.0:8000
"""
import os
from flask import Flask, jsonify, request
# Версия полигона — независима от app-autotest
VERSION = "0.1.0"
app = Flask(__name__, template_folder="templates", static_folder="static")
@app.route("/health")
def health():
"""Healthcheck для Nubes — всегда возвращает 200 OK."""
return "OK"
@app.route("/")
def index():
"""Корневой эндпоинт — информация о сервисе (HTML)."""
return f"""<!DOCTYPE html>
<html lang="ru">
<head><meta charset="utf-8"><title>polygon v{VERSION}</title>
<style>body{{font-family:system-ui;max-width:600px;margin:40px auto;padding:0 20px;background:#111;color:#eee}}
h1{{color:#4af}} .ok{{color:#4a4}} .ver{{color:#888}}</style></head>
<body>
<h1>polygon <span class="ver">v{VERSION}</span></h1>
<p class="ok">● running</p>
<p>Mock Nubes API — эмулятор REST API облачной платформы.</p>
<p>Эндпоинты: <code>/api/v1/svc/*</code></p>
<p>Сброс: <code>POST /api/v1/svc/_mock/reset</code></p>
</body></html>"""
# ---------------------------------------------------------------------------
# Nubes API mock — префикс /api/v1/svc
# ---------------------------------------------------------------------------
@app.route("/api/v1/svc/instances", methods=["GET"])
def list_instances():
"""GET /instances — пока пустой список."""
page_size = request.args.get("pageSize", 200, type=int)
return jsonify({
"results": [],
"pageSize": min(page_size, 200),
})
@app.route("/api/v1/svc/_mock/reset", methods=["POST"])
def mock_reset():
"""Сброс состояния (пока ничего нет)."""
return jsonify({"reset": "ok"})
# Локальный запуск (без gunicorn) — только для разработки
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=5000)