feat: минимальный Flask (v0.1.0) — /health, /, /api/v1/svc/*
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
# Python 3.12
|
||||||
|
Flask>=3.0
|
||||||
|
gunicorn>=21.2
|
||||||
|
PyYAML>=6.0
|
||||||
+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