164 lines
6.4 KiB
YAML
164 lines
6.4 KiB
YAML
work_item: ORCH-021
|
||
description: >
|
||
Тест-план пост-деплой мониторинга прода + авто-rollback. Упор на детерминированную
|
||
чистую логику классификации/решения (юнит, без сети/LLM) и на интеграцию
|
||
армирования наблюдения после deploy->done. Сетевые опросы и хук-вызовы мокируются.
|
||
Имена модулей/функций — целевые (src/post_deploy.py); архитектор уточняет точную
|
||
сигнатуру, тесты адаптируются под ADR.
|
||
|
||
tests:
|
||
# --- Классификация деградации (чистая логика, ядро) ---
|
||
- id: TC-01
|
||
type: unit
|
||
description: "HEALTHY: серия опросов без провалов (< порога) -> вердикт HEALTHY"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-3]
|
||
expected: PASS
|
||
|
||
- id: TC-02
|
||
type: unit
|
||
description: "DEGRADED: N последовательных провалов health (== fail_threshold) -> DEGRADED"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-4]
|
||
expected: PASS
|
||
|
||
- id: TC-03
|
||
type: unit
|
||
description: "DEGRADED по 5xx: доля 5xx выше порога при health=200 -> DEGRADED"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-5]
|
||
expected: PASS
|
||
|
||
- id: TC-04
|
||
type: unit
|
||
description: "Нет ложного срабатывания: одиночный провал (1 < threshold) + восстановление -> HEALTHY"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-6]
|
||
expected: PASS
|
||
|
||
- id: TC-05
|
||
type: unit
|
||
description: "Пороги читаются из Settings (env ORCH_*), изменение порога меняет вердикт на тех же данных"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-11]
|
||
expected: PASS
|
||
|
||
# --- Решение о реакции (чистая логика + self-hosting safety) ---
|
||
- id: TC-06
|
||
type: unit
|
||
description: "Решение: не-self репо + auto_rollback=True + DEGRADED -> ROLLBACK"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-7]
|
||
expected: PASS
|
||
|
||
- id: TC-07
|
||
type: unit
|
||
description: "Решение self-hosting: orchestrator + DEGRADED -> ALERT_ONLY (НИКОГДА не авто-rollback)"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-8]
|
||
expected: PASS
|
||
|
||
- id: TC-08
|
||
type: unit
|
||
description: "Решение: HEALTHY -> NONE (реакции нет) для любого репо"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-3]
|
||
expected: PASS
|
||
|
||
# --- Условность / kill-switch ---
|
||
- id: TC-09
|
||
type: unit
|
||
description: "post_deploy_applies: пусто в repos -> True только для orchestrator, False для enduro-trails"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-2]
|
||
expected: PASS
|
||
|
||
- id: TC-10
|
||
type: unit
|
||
description: "kill-switch: post_deploy_monitor_enabled=False -> applies()=False для всех; наблюдение не армится"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-10]
|
||
expected: PASS
|
||
|
||
# --- Маппинг exit-code отката -> исход ---
|
||
- id: TC-11
|
||
type: unit
|
||
description: "Откат exit 0 -> action_taken=ROLLBACK_OK"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-7]
|
||
expected: PASS
|
||
|
||
- id: TC-12
|
||
type: unit
|
||
description: "Откат exit 1/2 (нет prev-образа / откат упал) -> ROLLBACK_FAILED + эскалация-алерт"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-9]
|
||
expected: PASS
|
||
|
||
# --- Артефакт ---
|
||
- id: TC-13
|
||
type: unit
|
||
description: "16-post-deploy-log.md пишется с валидным YAML-frontmatter (post_deploy_status/action_taken), парсится yaml.safe_load"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-13]
|
||
expected: PASS
|
||
|
||
# --- never-raise ---
|
||
- id: TC-14
|
||
type: unit
|
||
description: "Опрос при сетевой ошибке/таймауте -> консервативный результат (провал-как-down), исключение НЕ всплывает"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-16]
|
||
expected: PASS
|
||
|
||
- id: TC-15
|
||
type: unit
|
||
description: "Ошибка записи артефакта (нет каталога/IO) -> логируется, функция возвращает False, не raise"
|
||
module: tests/test_post_deploy.py
|
||
covers: [AC-16, AC-13]
|
||
expected: PASS
|
||
|
||
# --- Интеграция: армирование после deploy->done ---
|
||
- id: TC-16
|
||
type: integration
|
||
description: "advance_stage deploy->done для orchestrator армит наблюдение (sentinel/job создан); для enduro-trails — нет"
|
||
module: tests/test_post_deploy_integration.py
|
||
covers: [AC-1, AC-2]
|
||
expected: PASS
|
||
|
||
- id: TC-17
|
||
type: integration
|
||
description: "Идемпотентность: повторный арм той же задачи (двойной webhook) не создаёт второе наблюдение"
|
||
module: tests/test_post_deploy_integration.py
|
||
covers: [AC-15]
|
||
expected: PASS
|
||
|
||
- id: TC-18
|
||
type: integration
|
||
description: "Полный цикл DEGRADED -> для не-self вызывается откат (хук замокан), пишется лог, шлётся уведомление"
|
||
module: tests/test_post_deploy_integration.py
|
||
covers: [AC-7, AC-13, AC-17]
|
||
expected: PASS
|
||
|
||
- id: TC-19
|
||
type: integration
|
||
description: "Self-hosting DEGRADED: тик НЕ вызывает рестарт/откат прод-контейнера, формирует алерт+approve-запрос"
|
||
module: tests/test_post_deploy_integration.py
|
||
covers: [AC-8, AC-17]
|
||
expected: PASS
|
||
|
||
# --- Наблюдаемость и обратная совместимость ---
|
||
- id: TC-20
|
||
type: integration
|
||
description: "GET /queue содержит блок post_deploy со снимком состояния"
|
||
module: tests/test_post_deploy_integration.py
|
||
covers: [AC-14]
|
||
expected: PASS
|
||
|
||
- id: TC-21
|
||
type: integration
|
||
description: "Регресс: существующие тесты deploy/staging/merge-gate/reconciler зелёные; STAGE_TRANSITIONS и QG_CHECKS не изменены"
|
||
module: tests/test_stages.py
|
||
covers: [AC-12]
|
||
expected: PASS
|