Andrey Epifancev 4b6655238b openspec: change nats-env-config — subject'ы и JWT NATS по окружению из OpenBao
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:40:35 +04:00

4.1 KiB
Raw Blame History

ADDED Requirements

Requirement: Subject'ы и учётные данные NATS из настроек окружения

Ядро SHALL брать subject'ы обмена из OPENBAO__NATS__NATS_TABULAR_REQUEST_SUBJECT, NATS_IMAGE_REQUEST_SUBJECT, NATS_RESULT_SUBJECT (умолчания files.tabular_uploaded, files.img_uploaded, files.tabular_parsed): публикует запросы в tabular_request и image_request, подписан на result (queue group arm-core). При старте SHALL проверяться все три имени (непустое, без пробельных символов, без * и >, без пустых токенов, попарно различны); при нарушении приложение MUST NOT стартовать. Значения NATS_JWT и NATS_SEED MUST NOT попадать в логи, repr настроек и тексты ошибок валидации. Используемые subject'ы SHALL писаться в лог при старте и отдаваться в /healthcheck объектом subjects с ключами tabular_request, image_request, result при любом значении nats (ok | down | off).

Scenario: Умолчания

  • WHEN приложение стартует без ключей OPENBAO__NATS__NATS_*_SUBJECT
  • THEN /healthcheck.subjects содержит имена files.* по умолчанию, обмен идёт по ним

Scenario: Subject'ы окружения

  • WHEN заданы OPENBAO__NATS__NATS_TABULAR_REQUEST_SUBJECT=test.files.tabular_uploaded, OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT=test.files.img_uploaded, OPENBAO__NATS__NATS_RESULT_SUBJECT=test.files.tabular_parsed
  • THEN подписки и публикации идут только по этим subject'ам, /healthcheck.subjects их показывает

Scenario: Недопустимый subject

  • WHEN OPENBAO__NATS__NATS_RESULT_SUBJECT совпадает с subject'ом запроса или содержит >
  • THEN приложение не стартует, ошибка называет ключ

Scenario: JWT не раскрывается

  • WHEN заданы NATS_JWT и NATS_SEED, а валидация настроек падает на другом поле
  • THEN текст ошибки и лог не содержат значений JWT и seed; repr настроек показывает их скрытыми

MODIFIED Requirements

Requirement: Соединение с NATS по шаблону, без JetStream

Ядро SHALL подключаться к NATS с nkeys-seed и JWT, если заданы OPENBAO__NATS__NATS_SEED/NATS_JWT, и без учётных данных, если они пусты; подписываться на subject ответа NATS_RESULT_SUBJECT (по умолчанию files.tabular_parsed) в queue group arm-core; переподключаться автоматически. Stream'ы и consumer'ы JetStream MUST NOT требоваться. Фоновые задачи SHALL запускаться при NATS_ENABLED=true.

Scenario: Dev-окружение compose

  • WHEN ядро стартует с DEBUG=true, NATS_ENABLED=true и пустыми учётными данными против NATS без JetStream
  • THEN подписка активна, /healthcheck отдаёт nats = ok, в логах нет ошибок подключения

Scenario: Два инстанса ядра

  • WHEN запущены два инстанса с NATS_ENABLED=true и опубликован один результат
  • THEN результат обработан ровно одним инстансом (queue group), строка задания изменена один раз

Scenario: NATS выключен

  • WHEN NATS_ENABLED=false
  • THEN приложение стартует, фоновые задачи не запускаются, /healthcheck отвечает 200 с nats = off