Files
ripe-cidr-collector/docs/plan-collect-endpoint.md
T
ayurishchevandClaude Sonnet 5 bcf8156085 Initial commit: RIPE CIDR/FQDN collector
Collector daemon, FastAPI server (addresses, diff, collect, sources),
SQLite storage with change journal, Docker Compose deployment,
tests, documentation and project rules.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 07:29:38 +03:00

3.4 KiB

План: POST /collect (немедленный сбор)

Цель

После добавления источника (или по необходимости) запускать сбор сразу, не дожидаясь расписания. API и сборщик - разные процессы, поэтому API не собирает сам, а передаёт демону запрос через файл.

Дизайн

  • POST /collect (токен X-API-Key), тело необязательно: {"type": "asn" | "fqdn" | "all"}, по умолчанию all. Ответ 202 с перечнем запрошенных типов; ход выполнения видно в GET /health.
  • Если демон не жив (heartbeat старше 120 с или его не было), API отвечает 503, запрос не ставится в очередь «в пустоту».
  • Запрос передаётся файлом collect_request.json в DATA_DIR (запись атомарная, под блокировкой): повторные POST объединяются (типы складываются), лишних сборов не будет.
  • Демон: задание check_collect_requests каждые 5 секунд (TRIGGER_POLL_INTERVAL) забирает и удаляет файл и ставит разовое задание <type>_manual (не блокирует опрос).
  • Защита от наложения: на каждый тип один запуск за раз (неблокирующая блокировка в run_job); если такой сбор уже идёт (по расписанию или ручной), повторный запуск пропускается с записью в лог.
  • status.json: для каждого задания добавляются running и last_finished, чтобы клиент мог дождаться завершения через /health.

Изменения

  1. cidr_collector.py: COLLECT_REQUEST_FILE, TRIGGER_POLL_INTERVAL, request_collection(types), pop_collection_requests().
  2. collector_daemon.py: блокировки запусков, поля running/last_finished, check_collect_requests(scheduler), регистрация задания в build_scheduler.
  3. api_server.py: общий помощник состояния демона (используется /health и /collect), эндпоинт POST /collect.
  4. README.md: описание эндпоинта, поля /health; .gitignore/.dockerignore: collect_request.json.
  5. Тесты (2): API (401 без ключа, 503 без демона, 202 с объединением типов, 422 на неверный тип); демон (запрос превращается в разовые задания, файл удалён, повторный вызов ничего не делает).

Проверка

Тесты в контейнере; вручную на копии данных: демон и API отдельными процессами с редким расписанием, POST /collect запускает сбор за несколько секунд, /health показывает running и last_finished; при остановленном демоне 503; два быстрых запроса дают один сбор; проверка в Docker Compose (общий том).