Зафиксированы очередь job, семантика метрик, лимиты бандла и исходящих запросов, а также чеклист продакшена для пула соединений. Co-authored-by: Cursor <[email protected]>
59 lines
14 KiB
Markdown
59 lines
14 KiB
Markdown
# Совместимость control plane и спикеров: проверяемая основа
|
||
|
||
Обязательная legacy-версия по указанию пользователя — **2.56.2**. Новый control plane должен обслуживать эти спикеры без синхронного обновления агентов. Digest развёрнутых образов и версия BIRD внутри них ещё не подтверждены. Дополнительная проверка исходников `v1.0.0` ниже не является обещанием поддержки всех промежуточных релизов.
|
||
|
||
## Проверка исполняемого CLI 2.56.2
|
||
|
||
26.10.2026 `git ls-remote` подтвердил `refs/tags/v2.56.2` → `924f111e4871e1d6d47c9916d7da1b9051718f1c`. Из этого неизменённого commit локально собран `evobgp-node` (Go 1.26.1, Windows/amd64, зависимости из локального кэша). Тест `TestLegacyNodeBinaryCurrentControlPlane` запускает именно исторический executable против настоящего HTTP-handler нового CP: latest/pull, проверка текущего подписанного бандла, отказ неверному/чужому токену и повреждённому архиву. Локально тест прошёл для **2.56.2** и отдельно для **1.0.0**.
|
||
|
||
Отдельно собран и запущен `evobgp-agent` **2.56.2** в режиме `serve`. `TestLegacyAgentBinaryCurrentDispatch` проверил текущий dispatch, авторизацию, получение подписанного текущим builder бандла, явный ACK, health и BGP protocols. BIRD/birdc заменены изолированными helper-процессами; CP для этого теста выдаёт заранее подписанный бандл через тестовый HTTP-handler. Проверка прошла локально на Windows, без изменения BIRD хоста. В CLI-тесте дополнительно проверен отказ для корректного архива с чужим публичным ключом.
|
||
|
||
В CI добавлена матрица двух pinned commits (`scripts/ci/legacy-node-compatibility.sh`), включая agent для 2.56.2; обязательные тесты не могут быть пропущены незаметно. CI job ещё не запускался. Это source-built binaries, не опубликованные Docker images: реальные image digests, TLS, настоящий BIRD parse/apply/rollback и mixed-fleet стенд остаются отдельными gates.
|
||
|
||
Для повторного локального запуска задайте `EVOBGP_TEST_LEGACY_NODE_BIN` абсолютным путём к собранному historical CLI и выполните `go test ./internal/httpapi -run '^TestLegacyNodeBinaryCurrentControlPlane$' -count=1 -v`. Без переменной тест явно пропускается. Проверка не вызывает apply и не меняет конфигурацию BIRD хоста.
|
||
|
||
Агент проверяется аналогично: `EVOBGP_TEST_LEGACY_AGENT_BIN` и `go test ./internal/nodedispatch -run '^TestLegacyAgentBinaryCurrentDispatch$' -count=1 -v`. Вызов sync проходит через старый агент, но команды BIRD выполняет только тестовая подмена. В Linux CI включён race detector; таймаут учитывает задержку завершения race-instrumented helper-процессов.
|
||
|
||
## Доступные свидетельства
|
||
|
||
- В локальном Git имеются теги `v1.0.0`–`v2.54.0` и исходники `cmd/evobgp-node`, `internal/nodecli`, `internal/bundle` для `v1.0.0` (`6ca34b900859665eede22044d734b698059bdf84`). Это исторические исходники, а не сохранённые исполняемые файлы или подтверждение установленной версии.
|
||
- CLI в `v1.0.0` запрашивает `GET /v1/speakers/{speaker_id}/revisions/latest`, затем `GET /v1/speakers/{speaker_id}/bundle/{revision_id}` с `Authorization: Bearer`. Ответ latest читается по `revision_id`. Публичный ключ передаётся CLI отдельно в base64/hex; текущий CP предоставляет `GET /v1/bundle/signing-public-key` для роли с `bgp:network:read`.
|
||
- Формат `v1.0.0` — gzip/tar с `manifest.json`, `bundle.sig` и файлами конфигурации. В манифесте: `revision_id`, необязательный `speaker_id`, `created_at`, `files` (`path`, `sha256`), `signature_algorithm=ed25519`, `public_key_base64`. Подпись Ed25519 считается по точным байтам `manifest.json`; содержимое файлов сверяется по SHA-256. Сопоставление исходников `v1.0.0` и текущего `internal/bundle` показывает ту же структуру, но само по себе не доказывает совместимость реального бинарника или синтаксиса BIRD.
|
||
- `internal/agentserver` и `internal/nodedispatch` в дереве `v1.0.0` отсутствуют. Проверки их минимальных ответов ниже — характеристика текущего протокола и имитация legacy-формы, а не тест агента релиза `v1.0.0`.
|
||
|
||
## Автоматические проверки этой основы
|
||
|
||
| Тест | Что проверяет | Предел вывода |
|
||
|---|---|
|
||
| `internal/bundle/legacy_compatibility_test.go` | Текущий builder создаёт прежний набор полей и порядок tar entries; независимая проверка Ed25519/SHA-256 по полям старого манифеста принимает результат. Замороженный подписанный архив `internal/bundle/testdata/current_baseline_signed_bundle.tar.gz` проверяется отдельно | Фикстура создана текущим builder с тестовым ключом, не извлечена из старого релиза; исторический бинарник не запускается |
|
||
| `internal/httpapi/node_legacy_compatibility_test.go` | Node bearer auth и tenant scope для latest revision и bundle; получение ключа с операторским токеном; проверяемый подписанный bundle без новых обязательных полей | In-memory HTTP; не проверяет TLS, внешнюю БД и CLI-процесс |
|
||
| `internal/nodedispatch/legacy_compatibility_test.go` | Sync отправляет только старое поле `revision_id` и Bearer secret; health с отсутствующими дополнительными полями остаётся читаемым | Ответы агента моделируются, реальный старый агент не запущен |
|
||
|
||
В первой реализации B01 подстановка запрошенного ID удалена: `2xx` без `applied_revision_id` остаётся совместимой успешной доставкой с `confirmation=unconfirmed`. Явный совпадающий ID даёт `agent_reported`; он не означает независимую проверку фактического BIRD-конфига. Несовпадающий или устаревший ACK не меняет applied. Запрос sync по-прежнему содержит только `revision_id`, новые поля от старого агента не требуются. Старый health без времени наблюдения принимается; время опроса фиксирует CP, а его источник указан явно.
|
||
|
||
Публикация и обработка ACK теперь дополнены persistent deployment progress и атомарными проверками lease/generation в PostgreSQL. Реальная проверка нескольких CP writers и restart остаётся открытым integration gate. Смешанные старый и новый CP не поддерживаются при миграции очереди; удалённые агенты 2.56.2 при этом сохраняют прежний протокол, см. [порядок обновления](durable-jobs.md).
|
||
|
||
Агент 2.56.2 не сериализует параллельные sync. Сохранённая reservation на две минуты после неоднозначного ответа уменьшает риск перекрывающейся доставки, но timeout не доказывает завершение старой операции. Поэтому CP сохраняет unknown/unconfirmed и сверяет последующий health; exactly-once, отсутствие любых перекрытий и подтверждённый BIRD config hash для старого агента не обещаются.
|
||
|
||
## Что ещё нужно до release gate B08
|
||
|
||
### Ограничения новых сборок bundle/node
|
||
|
||
Полная таблица и настройки: [bundle-limits.md](bundle-limits.md).
|
||
|
||
Формат manifest, Ed25519-подписи и HTTP endpoints сохраняются. Новые сборки ограничивают сжатый архив 128 MiB, распакованный tar и суммарное содержимое 512 MiB, отдельный payload 256 MiB, manifest 2 MiB, число записей 4096 и длину пути 1024 байт. Лимиты проверяются также при создании bundle; downloader ограничивает metadata latest до 64 KiB и текст ошибки до 4 KiB. Для встраиваемого вызова доступны `bundle.Limits` и `SyncConfig.BundleLimits`; отдельные operator CLI flags пока не добавлены.
|
||
|
||
Это верхние защитные пределы, а не обещание низкого RSS на малом VPS: архив и проверенные файлы ещё хранятся в памяти. Тест с миллионом повторяющихся строк IPv6 проверяет вместимость типичного размера текста, не валидность миллиона уникальных маршрутов или нагрузку BIRD. Повторные проверки source-built node/agent 2.56.2 с текущим builder прошли.
|
||
|
||
Новые verifier/extractor отклоняют дубликаты, неописанные manifest файлы, небезопасные пути и ссылки, проверяют gzip trailer. Эти защиты действуют в новых бинарниках; уже установленный 2.56.2 не получает их без обновления. Поддержка его прежнего протокола сохраняется.
|
||
|
||
### Оставшиеся проверки
|
||
|
||
1. Для обязательной версии **2.56.2** подтвердить установленные image digests `evobgp-agent`/`evobgp-node`, BIRD, режим `serve` или pull-only и источник ключа подписи. Сохранить инвентарь смешанного парка; source commit сам по себе не определяет digest опубликованного образа.
|
||
2. Сохранить реальные старые binaries/images и подписанные bundle-артефакты с подтверждённым происхождением. На стенде запустить matrix: новый CP + старый и текущий agent/CLI, предыдущий CP + новый agent, смешанный парк. Проверить pull/sync, auth/TLS, подпись, BIRD parse/apply/rollback и offline/reconnect.
|
||
3. Ввести согласованные capabilities в OpenAPI и совместимый fallback. Новые ACK, config hash, telemetry и формат бандла отправлять по объявленным возможностям. `404/405` документированного endpoint может обозначать legacy; timeout, auth/TLS error и повреждённый ответ — ошибка, без ослабления защиты.
|
||
4. Завершить проверку deploy: разделение `unconfirmed`/`agent_reported`, persistent progress и fencing реализованы; `verified` требует нового подтверждения и проверки хеша. Выполнить PostgreSQL concurrent/restart tests и стендовую проверку поздних ACK, неоднозначных timeout, восстановления и ограниченного повторения доставки.
|
||
5. Проверить BIRD-синтаксис на реально установленной версии и canary без BGP flap; сохранить путь отката CP и предыдущее поколение схемы БД на окно rollback.
|
||
|
||
Пока эти шаги не выполнены, тесты подтверждают только локальный baseline совместимости формата и HTTP-форм, а не готовность смешанного production-парка.
|