Files
EvoBGP/docs/router-lists-ui-integration.md
Denozordec c811c43bbc
CI / changes (push) Successful in 5s
CI / openapi (push) Successful in 22s
CI / go (push) Successful in 38s
CI / bird2 (push) Has been cancelled
CI / docker-go-prime (push) Has been cancelled
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been cancelled
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been cancelled
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been cancelled
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been cancelled
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been cancelled
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been cancelled
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been cancelled
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been cancelled
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has started running
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been cancelled
CI / docker-bird (push) Has been cancelled
feat: add aggregated router-lists catalog endpoint and update module listing filters
Introduced a new endpoint `GET /v1/router-lists/catalog` that returns a consolidated view of modules, domain entries, ASNs, IP ranges, and communities. Enhanced the existing module listing functionality to support filtering by type and enabled status. Updated documentation to reflect these changes and added tests for the new endpoint and filtering capabilities.
2026-04-07 23:15:40 +07:00

5.6 KiB
Raw Permalink Blame History

Интеграция router-lists-ui с EvoBGP API

Документ описывает подключение разделов Домены, IP-диапазоны, AS, Community из проекта router-lists-ui напрямую к EvoBGP API (/v1).

Источник правды по контракту: openapi.yaml.

1. Базовые требования

  • Base URL API: https://<evobgp-host>/v1
  • Аутентификация: Authorization: Bearer <api_key>
  • CORS на стороне EvoBGP: переменная EVOBGP_CORS_ORIGINS
  • Роли:
    • чтение: viewer+
    • изменение данных: editor+
    • apply/деплой: operator

2. Маппинг legacy -> EvoBGP

Раздел UI Legacy endpoint EvoBGP endpoint
Домены /api/domains-new /v1/modules?type=DOMAINS + /v1/modules/{module_id}/domain-entries
IP-диапазоны /api/ip-ranges /v1/modules?type=IP_RANGES + /v1/modules/{module_id}/ip-range-entries
AS /api/asns /v1/modules?type=AS_PREFIXES + /v1/modules/{module_id}/as-entries
Community /api/communities /v1/communities

Для упрощённой интеграции доступен агрегированный endpoint: GET /v1/router-lists/catalog (модули + entries + communities в одном ответе).

3. Маппинг полей

Legacy модель EvoBGP модель Комментарий
{ domain, community } DomainEntry { fqdn, community_id } community в UI резолвится в community_id через /v1/communities
{ ipRange, community } IpRangeEntry { prefix, community_id } Для IP_RANGES community_id обязателен
{ domain, type } (AS) AsEntry { asn, community_id } domain legacy = ASN
{ value, name } (Community dict) BgpCommunity { community, title } value -> community, name -> title

4. Алгоритм работы по разделам

4.1 Домены / IP / AS (общая схема)

  1. Найти модуль нужного типа через GET /v1/modules?type=....
  2. Если модуль отсутствует, создать через POST /v1/modules.
  3. Загрузить entries:
    • домены: GET /v1/modules/{module_id}/domain-entries
    • IP: GET /v1/modules/{module_id}/ip-range-entries
    • AS: GET /v1/modules/{module_id}/as-entries
  4. При сохранении:
    • удалить отсутствующие записи (DELETE .../{entry_id})
    • обновить изменённые (PATCH .../{entry_id})
    • добавить новые (POST ...)

4.2 Community

  1. Получить список: GET /v1/communities
  2. Для сохранения diff:
    • новые -> POST /v1/communities
    • изменённые -> PATCH /v1/communities/{id}
    • удалённые -> DELETE /v1/communities/{id}

5. Разрешение community

  • Перед работой с entries загрузить /v1/communities.
  • Основной путь: сопоставление по id.
  • Для UI-формы использовать значение community (например, 65001:120) и перед записью преобразовывать в community_id.
  • Если community не найдена:
    • для IP_RANGES считать ошибкой валидации;
    • для DOMAINS и AS_PREFIXES можно передать null только если это допускается бизнес-логикой.

6. Пагинация и ошибки

  • Списки используют cursor + limit.
  • Формат ошибок: application/problem+json (RFC 9457).
  • Базовая обработка:
    • 401 — неверный/отсутствующий токен
    • 403 — недостаточно прав
    • 404 — ресурс не найден
    • 422 — ошибка валидации

7. Примеры (PowerShell)

$base = "http://localhost:8080/v1"
$token = "YOUR_API_KEY"
$h = @{ Authorization = "Bearer $token" }

# 1) Найти модуль DOMAINS
$modules = Invoke-RestMethod -Uri "$base/modules?type=DOMAINS&limit=50" -Headers $h
$moduleId = $modules.items[0].id

# 2) Прочитать домены
Invoke-RestMethod -Uri "$base/modules/$moduleId/domain-entries?limit=100" -Headers $h
# Создать community
$body = @{
  community = "65001:120"
  title     = "Video"
} | ConvertTo-Json

Invoke-RestMethod -Method Post -Uri "$base/communities" -Headers $h -ContentType "application/json" -Body $body

8. Настройки router-lists-ui для прямой интеграции

Рекомендуемые переменные frontend:

  • VITE_EVOBGP_API_URL (по умолчанию /v1)
  • VITE_EVOBGP_API_TOKEN (опционально; либо хранить токен в localStorage как evobgp_api_token)

Для dev-прокси Vite добавить маршрут /v1 -> http://localhost:8080.

9. Контрольный список интеграции

  • Домены: list/create/update/delete работают через /v1/modules/{id}/domain-entries
  • IP-диапазоны: list/create/update/delete работают через /v1/modules/{id}/ip-range-entries
  • AS: list/create/update/delete работают через /v1/modules/{id}/as-entries
  • Community: CRUD работает через /v1/communities
  • ошибки problem+json корректно отображаются в UI