Skip to main content

Management Plane Migration Validation: Go to Rust

Date: 2026-03-21 Validator: polecat/furiosa (automated) Go source: apps/management-plane/ (deleted after validation) Rust target: rust/management-plane/

Summary

All Go endpoints, services, models, middleware, background workers, and tests have equivalent Rust implementations. Migrations are byte-for-byte identical. The Rust version is a superset of Go (adds Ed25519 token issuance endpoint).

Endpoint Checklist

EndpointMethodGoRustStatus
/management/v1/healthGEThandler/health.gohandlers/health.rsPASS
/management/v1/agents/registerPOSThandler/registration.gohandlers/registration.rsPASS
/management/v1/agents/{agent_id}/heartbeatPOSThandler/heartbeat.gohandlers/heartbeat.rsPASS
/management/v1/releasesPOSThandler/release.gohandlers/release.rsPASS
/management/v1/releasesGEThandler/release.gohandlers/release.rsPASS
/management/v1/releases/latestGEThandler/release.gohandlers/release.rsPASS
/management/v1/releases/{version}/{os}/{arch}/downloadGEThandler/release.gohandlers/release.rsPASS
/management/v1/licensesPOSThandler/license.gohandlers/license.rsPASS
/management/v1/licensesGEThandler/license.gohandlers/license.rsPASS
/management/v1/licenses/{id}GEThandler/license.gohandlers/license.rsPASS
/management/v1/licenses/{id}PUThandler/license.gohandlers/license.rsPASS
/management/v1/licenses/{id}DELETEhandler/license.gohandlers/license.rsPASS (fixed)
/management/v1/licenses/validateGEThandler/license.gohandlers/license.rsPASS
/management/v1/license/statusGEThandler/license_status.gohandlers/license_status.rsPASS (fixed)
/management/v1/agentsGEThandler/fleet.gohandlers/fleet.rsPASS
/management/v1/agents/{agent_id}GEThandler/fleet.gohandlers/fleet.rsPASS
/management/v1/fleet/statsGEThandler/fleet.gohandlers/fleet.rsPASS
/management/v1/alertsGEThandler/alert.gohandlers/alert.rsPASS
/management/v1/alerts/summaryGEThandler/alert.gohandlers/alert.rsPASS
/management/v1/alerts/{id}/acknowledgePUThandler/alert.gohandlers/alert.rsPASS
/management/v1/webhooksPOSThandler/webhook.gohandlers/webhook.rsPASS (fixed)
/management/v1/webhooksGEThandler/webhook.gohandlers/webhook.rsPASS (fixed)
/management/v1/webhooks/{id}GEThandler/webhook.gohandlers/webhook.rsPASS
/management/v1/webhooks/{id}PATCHhandler/webhook.gohandlers/webhook.rsPASS (fixed)
/management/v1/webhooks/{id}DELETEhandler/webhook.gohandlers/webhook.rsPASS (fixed)
/management/v1/webhooks/{id}/deliveriesGEThandler/webhook.gohandlers/webhook.rsPASS
/management/v1/webhooks/deliveriesGEThandler/webhook.gohandlers/webhook.rsPASS
/management/v1/tokensPOSTN/Aservices/token.rsADDED

Issues Found and Fixed

1. Missing auth middleware (CRITICAL)

Problem: Rust middleware.rs defined management_key_auth but it was not applied to any route group. License CRUD, fleet, alert, and webhook endpoints were all unprotected.

Fix: Restructured main.rs router to split authenticated vs unauthenticated routes. Applied management_key_auth middleware layer to authenticated group.

2. Response format mismatches

EndpointGo ResponseRust (before)Rust (after)
DELETE /licenses/{id}200 {"message":"license deactivated"}204 No Content200 {"message":"license deactivated"}
PATCH /webhooks/{id}200 {"message":"webhook updated"}204 No Content200 {"message":"webhook updated"}
DELETE /webhooks/{id}200 {"message":"webhook deleted"}204 No Content200 {"message":"webhook deleted"}
POST /webhooks201 {"webhook":..,"secret":..}201 (raw webhook)201 {"webhook":..,"secret":..}
GET /webhooks{"webhooks":[..]}raw array{"webhooks":[..]}

3. Missing validation

  • Webhook create: Added CreateWebhookRequest.validate() call (was skipped in Rust)
  • License status: Added empty key check (Go returns 400 for missing key)

Component Parity

Services

ServiceGoRustStatus
Registrationservice/registration.goservices/registration.rsPASS
Heartbeatservice/heartbeat.goservices/heartbeat.rsPASS
Licenseservice/license.goservices/license.rsPASS
License Statusservice/license_status.goservices/license_status.rsPASS
Fleetservice/fleet.goservices/fleet.rsPASS
Alertservice/alert.goservices/alert.rsPASS
Webhookservice/webhook.goservices/webhook.rsPASS
Releaseservice/release.gorelease.rsPASS
Health Checkerservice/healthcheck.goservices/healthcheck.rsPASS
TokenN/Aservices/token.rsADDED

Middleware

MiddlewareGoRustStatus
ManagementKeyAuthmiddleware/auth.gomiddleware.rs + handlers/mod.rsPASS
AgentOrManagementAuthmiddleware/auth.gohandlers/mod.rsPASS
CORSmiddleware/cors.gotower_http::corsPASS
RequestLoggermiddleware/logging.gotower_http::tracePASS
Timeoutmiddleware/timeout.gotower_http::timeoutPASS

Background Workers

WorkerGoRustStatus
Health Checkergoroutine in main.gotokio::spawn in main.rsPASS
Webhook Deliverygoroutine in main.gotokio::spawn in main.rsPASS

Migrations

All 8 migration pairs are byte-for-byte identical (verified via diff -rq).

Config

FieldGo (config.Load)Rust (Config::load)Status
database_urlDATABASE_URLDATABASE_URLPASS
portPORTPORTPASS
management_keyMANAGEMENT_KEYMANAGEMENT_KEYPASS
cors_originsCORS_ORIGINSCORS_ORIGINSPASS
log_levelLOG_LEVELLOG_LEVELPASS
gcs_bucketGCS_BUCKETGCS_BUCKETPASS
signed_url_ttlSIGNED_URL_TTL_MINUTESSIGNED_URL_TTL_MINUTESPASS
heartbeat_intervalHEARTBEAT_INTERVAL_SECONDSHEARTBEAT_INTERVAL_SECONDSPASS
health_check_intervalHEALTH_CHECK_INTERVAL_SECONDSHEALTH_CHECK_INTERVAL_SECONDSPASS
stale_threshold_multiplierSTALE_THRESHOLD_MULTIPLIERSTALE_THRESHOLD_MULTIPLIERPASS
inactive_threshold_multiplierINACTIVE_THRESHOLD_MULTIPLIERINACTIVE_THRESHOLD_MULTIPLIERPASS
webhook_worker_intervalWEBHOOK_WORKER_INTERVAL_SECONDSWEBHOOK_WORKER_INTERVAL_SECONDSPASS
webhook_worker_batch_sizeWEBHOOK_WORKER_BATCH_SIZEWEBHOOK_WORKER_BATCH_SIZEPASS

Cleanup Performed

  • Deleted apps/management-plane/ directory
  • Removed management-plane entry from go.work
  • Removed Go dependabot entry from .github/dependabot.yml
  • Removed Go management-plane services from docker-compose.yml
  • Updated Makefile migration path to rust/management-plane/migrations
  • Updated README.md to reference Rust implementation

Test Results

All 74 Rust management-plane tests pass after fixes.