Что такое Polygon?
Polygon — это эмулятор REST API облачной платформы Nubes для интеграционных тестов. Он полностью повторяет контракты реального API: сервисы, инстансы, операции, параметры, валидацию — но работает без реальной инфраструктуры, в памяти, с мгновенным откликом.
Зачем нужен
- Тестировать создание/изменение/удаление инстансов без реальных ресурсов
- Отлаживать UI автодеплоя (
app-autotest) на мок-данных - Писать интеграционные тесты с детерминированным состоянием
- Проверять краевые случаи (ошибки валидации, сбои операций)
Как устроен
- Flask 3.0 + gunicorn, 1 воркер (состояние в памяти)
- Конфигурация сервисов — из YAML (генерируется из STANDS)
- Все операции — синхронные, с настраиваемой задержкой
- Управляемый сброс состояния через
/_mock/reset
Как использовать
{% if stands_list|length > 1 %}Стенд: {{ current_stand }}{% endif %}📡 Базовые команды
Получить список сервисов:
curl -s {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/services | python3 -m json.tool
Создать инстанс:
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/instances \
-H "Content-Type: application/json" \
-d '{"serviceId": 1, "displayName": "my-instance"}' | python3 -m json.tool
Создать операцию, установить параметры, запустить:
# 1. Создать операцию (получить opUid из ответа)
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/instanceOperations \
-H "Content-Type: application/json" \
-d '{"instanceUid": "<uid>", "operation": "create", "svcOperationId": 18}'
# 2. Установить каждый параметр (повторить для всех)
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/instanceOperationCfsParams \
-H "Content-Type: application/json" \
-d '{"instanceOperationUid": "<opUid>", "svcOperationCfsParamId": 242, "paramValue": "my-value"}'
# 3. Запустить операцию (будет ждать {{ delay }}s)
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/instanceOperations/<opUid>/run
🛠 Управление полигоном (служебные эндпоинты)
Если на сервере задан MOCK_AUTH_TOKEN, для запросов к /_mock/* добавьте
заголовок -H "X-Mock-Auth: <token>".
⏱ Задержка операций
Каждый POST /run ждёт {{ delay }} секунд перед ответом —
эмуляция времени выполнения в облаке.
Текущая: {{ delay }}s
# Сделать операции мгновенными
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/_mock/delay/0
# Поставить задержку 3 секунды (эмуляция долгой операции)
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/_mock/delay/3
🧹 Сброс состояния
Удаляет все инстансы и операции на текущем стенде. Полезно перед каждым тестом.
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/_mock/reset
💥 Симуляция ошибок
Следующий POST /run упадёт с ошибкой. One-shot: после
использования флаг сбрасывается.
# Включить
curl -s -X POST {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/_mock/fail-next
# Следующий run → {"ok": false, "error": "mock failure..."}
# После этого — снова работает нормально
📊 Отладка
Посмотреть текущее состояние всех инстансов и операций:
curl -s {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/_mock/state | python3 -m json.tool
Список загруженных сервисов:
curl -s {{ endpoint }}/{% if stands_list|length > 1 %}{{ current_stand }}/{% endif %}api/v1/svc/_mock/services | python3 -m json.tool
🔁 Жизненный цикл операции
GET /api/v1/svc/instanceOperations/default/{svcOperationId}— узнать какие параметры нужныPOST /api/v1/svc/instanceOperations— создать операцию (получить opUid)POST /api/v1/svc/instanceOperationCfsParams× N — установить каждый параметрGET /api/v1/svc/instanceOperations/{opUid}/validate-cfs— проверить корректностьPOST /api/v1/svc/instanceOperations/{opUid}/run— выполнить (ждёт {{ delay }}s)GET /api/v1/svc/instanceOperations/{opUid}?fields=dtFinish,isSuccessful— проверить результат
API эндпоинты
| Метод | Путь | Описание |
|---|---|---|
| GET | /health |
Healthcheck |
| GET | / |
Главная страница |
| GET | /api/v1/svc/services |
Список сервисов |
| GET | /api/v1/svc/services/<id> |
Детали сервиса |
| GET | /api/v1/svc/instances |
Список инстансов |
| GET | /api/v1/svc/instances/<uid> |
Детали инстанса |
| POST | /api/v1/svc/instances |
Создать инстанс |
| GET | /api/v1/svc/instanceOperations/default/<id> |
Шаблон операции и параметры |
| POST | /api/v1/svc/instanceOperations |
Создать операцию |
| GET | /api/v1/svc/instanceOperations/<uid> |
Статус операции |
| POST | /api/v1/svc/instanceOperationCfsParams |
Установить параметр операции |
| GET | /api/v1/svc/instanceOperations/<uid>/validate-cfs |
Проверить параметры |
| POST | /api/v1/svc/instanceOperations/<uid>/run |
Запустить операцию |
| POST | /api/v1/svc/_mock/reset |
Сброс состояния |
| GET | /api/v1/svc/_mock/state |
Дамп состояния |
| GET | /api/v1/svc/_mock/services |
Список загруженных сервисов |
| POST | /api/v1/svc/_mock/delay/<s> |
Задать задержку |
| POST | /api/v1/svc/_mock/fail-next |
Следующая операция упадёт |
| GET | /swagger |
Swagger UI |
| GET | /api/v1/svc/openapi.json |
OpenAPI JSON |
Загруженные сервисы ({{ svc_count }})
| ID | Название | Операций | CfsParams | StateParams | StateOut |
|---|---|---|---|---|---|
{{ svc.id }} |
{{ svc.display_name }} | {{ svc.op_count }} | {% if svc.has_cfs %}{% else %}{% endif %} | {% if svc.has_state %}{% else %}{% endif %} | {% if svc.has_out %}{% else %}{% endif %} |