feat(control): add operator endpoint for node enrollment code (SMMNODE2) #53
No reviewers
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: ochenstarik/server-monitor-manager#53
Loading…
Reference in a new issue
No description provided.
Delete branch "antigravity/node-enrollment-endpoint"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Antigravity: выдача кода регистрации узла из приложения — Этап 1
Реализован HTTP-эндпоинт для выпуска кода регистрации узла (
SMMNODE2...) из Control в соответствии с требованиямиsmm-antigravity-task-web-console-2026-08-17.md.Что сделано
POST /api/v1/control/agents/{nodeId}/enrollment-code(дублирующий маршрут/nodes/...удален в соответствии с требованиями доработки).Operator(политика авторизацииOperatorна группе/api/v1/control). РолиAgentиAutomation, а также неаутентифицированные запросы отклоняются (401/403)."enrollment".SMMNODE2:create_node_code:SMMNODE2.<control_url>.<ca_pem>.<node_id>.<token>.<hub_endpoint>.<hub_public_key>.<node_address>.<mesh_network>=).10.77.0.0/24):NodeEnrollmentServiceв полном соответствии с поведениемreserve_node_address:10.77.0.2..10.77.0.254и фиксируются вnodes.tsv.node_idвозвращается ранее выделенный IP-адрес, и для него генерируется новый одноразовый 10-минутный токен.node_idгарантированно получают уникальные непересекающиеся адреса.NodeIdValidator.IsValid(nodeId)до создания токена и до выделения адреса.auditс действиемagent.enrollment_code.issued(актор,node_id, выделенный адрес, дата истечения).ControlEventBrokerдля real-time подписчиков.Отчёт о тестировании
1. Локальные тесты (PASS)
dotnet build— 0 ошибок.dotnet test— 134 пройденных теста (включая 8 новых тестов вNodeEnrollmentCodeTests.cs):AnonymousRequestIsRejectedWithUnauthorized— 401 Unauthorized;AgentRoleIsRejectedWithForbidden— 403 Forbidden;AutomationRoleIsRejectedWithForbidden— 403 Forbidden;InvalidNodeIdIsRejectedWithBadRequestBeforeTokenCreation— 400 Bad Request, токены в БД не создаются;EmptyNodeIdThrowsArgumentExceptionInService— отказ на уровне сервиса;OperatorCanRequestNodeEnrollmentCodeWithCorrectStructure— 200 OK, 9 сегментовSMMNODE2, валидация содержимого каждого сегмента;TwoDifferentNodeIdsGetDistinctMeshAddresses— разным узлам выдаются разные адреса;RepeatedRequestForSameNodeIdReusesReservedAddress— повторный запрос возвращает тот же IP с новым токеном;AuditLogRecordsEnrollmentCodeIssuance— проверка записи в таблицуaudit;CodeStructureMatchesBashReferenceFormatFixture— посимвольная проверка структуры алфавита base64url против эталона.2. CI Workflows (PASS, все зелёные)
build-and-test: https://github.com/ochenstarik-ui/server-monitor-manager/actions/runs/32051030829/job/95450174266build: https://github.com/ochenstarik-ui/server-monitor-manager/actions/runs/32051030871/job/954501732563. Что не проверялось и почему
main. Структурная и побайтовая эквивалентность выданного кодаSMMNODE2подтверждена тестомCodeStructureMatchesBashReferenceFormatFixture.