Зафиксированы очередь job, семантика метрик, лимиты бандла и исходящих запросов, а также чеклист продакшена для пула соединений. Co-authored-by: Cursor <cursoragent@cursor.com>
14 KiB
Совместимость 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 при этом сохраняют прежний протокол, см. порядок обновления.
Агент 2.56.2 не сериализует параллельные sync. Сохранённая reservation на две минуты после неоднозначного ответа уменьшает риск перекрывающейся доставки, но timeout не доказывает завершение старой операции. Поэтому CP сохраняет unknown/unconfirmed и сверяет последующий health; exactly-once, отсутствие любых перекрытий и подтверждённый BIRD config hash для старого агента не обещаются.
Что ещё нужно до release gate B08
Ограничения новых сборок bundle/node
Полная таблица и настройки: 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 не получает их без обновления. Поддержка его прежнего протокола сохраняется.
Оставшиеся проверки
- Для обязательной версии 2.56.2 подтвердить установленные image digests
evobgp-agent/evobgp-node, BIRD, режимserveили pull-only и источник ключа подписи. Сохранить инвентарь смешанного парка; source commit сам по себе не определяет digest опубликованного образа. - Сохранить реальные старые binaries/images и подписанные bundle-артефакты с подтверждённым происхождением. На стенде запустить matrix: новый CP + старый и текущий agent/CLI, предыдущий CP + новый agent, смешанный парк. Проверить pull/sync, auth/TLS, подпись, BIRD parse/apply/rollback и offline/reconnect.
- Ввести согласованные capabilities в OpenAPI и совместимый fallback. Новые ACK, config hash, telemetry и формат бандла отправлять по объявленным возможностям.
404/405документированного endpoint может обозначать legacy; timeout, auth/TLS error и повреждённый ответ — ошибка, без ослабления защиты. - Завершить проверку deploy: разделение
unconfirmed/agent_reported, persistent progress и fencing реализованы;verifiedтребует нового подтверждения и проверки хеша. Выполнить PostgreSQL concurrent/restart tests и стендовую проверку поздних ACK, неоднозначных timeout, восстановления и ограниченного повторения доставки. - Проверить BIRD-синтаксис на реально установленной версии и canary без BGP flap; сохранить путь отката CP и предыдущее поколение схемы БД на окно rollback.
Пока эти шаги не выполнены, тесты подтверждают только локальный baseline совместимости формата и HTTP-форм, а не готовность смешанного production-парка.