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
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.
5.6 KiB
5.6 KiB
Интеграция 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 (общая схема)
- Найти модуль нужного типа через
GET /v1/modules?type=.... - Если модуль отсутствует, создать через
POST /v1/modules. - Загрузить 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
- домены:
- При сохранении:
- удалить отсутствующие записи (
DELETE .../{entry_id}) - обновить изменённые (
PATCH .../{entry_id}) - добавить новые (
POST ...)
- удалить отсутствующие записи (
4.2 Community
- Получить список:
GET /v1/communities - Для сохранения 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-entriesIP-диапазоны: list/create/update/delete работают через/v1/modules/{id}/ip-range-entriesAS: list/create/update/delete работают через/v1/modules/{id}/as-entriesCommunity: CRUD работает через/v1/communities- ошибки
problem+jsonкорректно отображаются в UI