fix: _build_default_json→json.dumps + 409 repeat run + MOCK_AUTH_TOKEN
This commit is contained in:
@@ -8,13 +8,31 @@ Blueprint "mock" с префиксом /api/v1/svc/_mock.
|
||||
POST /delay/<s> — изменить MOCK_OP_DELAY на лету (не перезапуская сервер)
|
||||
"""
|
||||
|
||||
from flask import Blueprint, jsonify
|
||||
import os
|
||||
|
||||
from flask import Blueprint, jsonify, request, abort
|
||||
|
||||
import mock_state
|
||||
import config.loader as _cfg # для чтения/записи модульных переменных DELAY, SERVICES
|
||||
|
||||
bp = Blueprint("mock", __name__, url_prefix="/api/v1/svc/_mock")
|
||||
|
||||
# Токен для защиты _mock/* эндпоинтов (из env, опционально).
|
||||
# Если не задан — эндпоинты открыты (dev/локально).
|
||||
# Если задан — требуется заголовок X-Mock-Auth: <токен>.
|
||||
_MOCK_TOKEN = os.getenv("MOCK_AUTH_TOKEN", "")
|
||||
|
||||
|
||||
@bp.before_request
|
||||
def _check_mock_auth():
|
||||
"""Проверка X-Mock-Auth заголовка если MOCK_AUTH_TOKEN задан.
|
||||
|
||||
Вызывается Flask перед КАЖДЫМ обработчиком в этом blueprint'е.
|
||||
Если токен не задан в env — пропускаем всех (dev-режим).
|
||||
Если задан — требуем совпадения с заголовком."""
|
||||
if _MOCK_TOKEN and request.headers.get("X-Mock-Auth") != _MOCK_TOKEN:
|
||||
abort(403)
|
||||
|
||||
|
||||
@bp.route("/reset", methods=["POST"])
|
||||
def mock_reset():
|
||||
|
||||
+6
-4
@@ -34,16 +34,18 @@ def run_operation(uid):
|
||||
После этого GET /instanceOperations/{uid} вернёт dtFinish,
|
||||
и poll_until_done() в app-autotest завершит поллинг.
|
||||
|
||||
⛔ Нет защиты от повторного run — если вызвать дважды, dtStart
|
||||
перезапишется и эффект применится повторно. Для тестовых целей
|
||||
(MOCK_OP_DELAY ≤ 0.5с) вероятность минимальна.
|
||||
|
||||
Возвращает {"ok": True} — формат как в реальном Nubes API.
|
||||
Повторный вызов → 409 (operation already completed).
|
||||
"""
|
||||
op = mock_state.state.get_operation(uid)
|
||||
if not op:
|
||||
return jsonify({"error": "operation not found"}), 404
|
||||
|
||||
# Защита от повторного запуска: если dtFinish уже проставлен —
|
||||
# операция уже выполнена, повторный run может испортить данные.
|
||||
if op.get("dtFinish") is not None:
|
||||
return jsonify({"error": "operation already completed"}), 409
|
||||
|
||||
# Фиксируем время старта
|
||||
op["dtStart"] = _now()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user