docs: add router-lists-ui integration documentation to README
CI / changes (push) Successful in 7s
CI / openapi (push) Has been skipped
CI / go (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been skipped
CI / docker-bird (push) Has been skipped
CI / bird2 (push) Has been skipped
CI / docker-go-prime (push) Has been skipped
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been skipped
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been skipped
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been skipped
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been skipped
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been skipped
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been skipped
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been skipped
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been skipped
CI / changes (push) Successful in 7s
CI / openapi (push) Has been skipped
CI / go (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been skipped
CI / docker-bird (push) Has been skipped
CI / bird2 (push) Has been skipped
CI / docker-go-prime (push) Has been skipped
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been skipped
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been skipped
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been skipped
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been skipped
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been skipped
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been skipped
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been skipped
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been skipped
Included a new section in the README to document the integration of `router-lists-ui` with the EvoBGP API, covering key components such as DOMAINS, IP_RANGES, AS_PREFIXES, and communities. This enhances the clarity and usability of the documentation for users.
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
| [architecture.md](architecture.md) | Компоненты, потоки данных, пакеты |
|
| [architecture.md](architecture.md) | Компоненты, потоки данных, пакеты |
|
||||||
| [manual.md](manual.md) | Подробное руководство по модулям, процессам и API |
|
| [manual.md](manual.md) | Подробное руководство по модулям, процессам и API |
|
||||||
| [api.md](api.md) | REST: префикс `/v1`, публичные маршруты, ссылки на OpenAPI |
|
| [api.md](api.md) | REST: префикс `/v1`, публичные маршруты, ссылки на OpenAPI |
|
||||||
|
| [router-lists-ui-integration.md](router-lists-ui-integration.md) | Интеграция `router-lists-ui` с EvoBGP API (`DOMAINS/IP_RANGES/AS_PREFIXES/communities`) |
|
||||||
| [access.md](access.md) | Выдача доступа: API-ключи, роли, нода, CORS |
|
| [access.md](access.md) | Выдача доступа: API-ключи, роли, нода, CORS |
|
||||||
| [openapi.yaml](openapi.yaml) | Источник правды по контракту API |
|
| [openapi.yaml](openapi.yaml) | Источник правды по контракту API |
|
||||||
| [OPENAPI-GITEA.md](OPENAPI-GITEA.md) | Как открыть HTML-документацию API (в т.ч. из Gitea) |
|
| [OPENAPI-GITEA.md](OPENAPI-GITEA.md) | Как открыть HTML-документацию API (в т.ч. из Gitea) |
|
||||||
|
|||||||
@@ -0,0 +1,117 @@
|
|||||||
|
# Интеграция router-lists-ui с EvoBGP API
|
||||||
|
|
||||||
|
Документ описывает подключение разделов `Домены`, `IP-диапазоны`, `AS`, `Community` из проекта `router-lists-ui` напрямую к EvoBGP API (`/v1`).
|
||||||
|
|
||||||
|
Источник правды по контракту: [openapi.yaml](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` |
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Создать 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
|
||||||
Reference in New Issue
Block a user