feat: минимальный Flask (v0.1.0) — /health, /, /api/v1/svc/*
This commit is contained in:
+66
@@ -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)
|
||||
Reference in New Issue
Block a user