API Changelog: Admin Panel 2.4.0
By Volodymyr Lukashkin
4 min
Listen
Add a reaction
Generated from a diff of the sim_api (hai_admin_api) repository between branch europa (old, 2026-05-19, eee4e7d5) and branch ariel (new, 2026-06-01, a30df677). 518 commits in range. Source of truth for endpoints: main.go route registrations, cross-checked against docs/swagger.json for contracts.
1. Summary
Old → New: europa (2026-05-19) → ariel (2026-06-01).
Endpoints: 37 added, 0 removed, 0 modified signatures (net registrations 426 → 463 normalized).
Headline additions: full KVM cluster-node management surface (22 endpoints), Marketplace OAuth/authorize + link-history/purge flow, Pod rootfs + factory-reset + scheduler-config, GPUaaS pool scheduler-config and worker rootfs enablement, and a region leader-secret endpoint.
Contracts: 23 new DTO definitions, ~24 existing DTOs enriched with new fields. All schema changes are additive (no fields removed or retyped) — except one restructured DTO (see Breaking Changes).
Breaking changes: 1.
models.CreateTeamandmodels.UpdateTeam— policy ID fields moved from top-level into a nestedgeneralobject;has_general_policiesflag now required. AffectsPOST /api/teamandPUT /api/team/{team_id}.
2. ⚠️ Breaking Changes
One breaking change. Existing clients sending a flat CreateTeam payload will receive 400: at least one of general or baremetal policies must be enabled. Update before upgrading.
Endpoints | What changed | Action required |
|---|---|---|
|
| Restructure request body — wrap policy IDs under |
| Response shape changed: | Read |
3. Added Endpoints
KVM Cluster Nodes (new domain — 22 endpoints)
Method | Path | Handler | Auth | Purpose |
|---|---|---|---|---|
POST | /api/kvm/node | AddKVMClusterNode | default | Register a KVM cluster node |
GET | /api/kvm/node | GetKVMClusterNodes | default | List KVM cluster nodes |
GET | /api/kvm/node/{id} | GetKVMClusterNode | default | Get a node |
PUT | /api/kvm/node/{id} | UpdateKVMClusterNode | default | Update a node |
DELETE | /api/kvm/node/{id} | DeleteKVMClusterNode | default | Delete a node |
POST | /api/kvm/node/{id}/test-connection | TestKVMClusterNodeConnection | default | Test SSH/connectivity |
POST | /api/kvm/node/{id}/reconcile-tunnels | ReconcileKVMNodeTunnels | default | Reconcile SSH tunnels |
POST | /api/kvm/node/{id}/scan | ScanKVMClusterNode | default | Hardware discovery scan |
GET | /api/kvm/node/{id}/storage_metrics | GetKVMNodeStorageMetrics | default | Storage/disk metrics |
POST | /api/kvm/node/{id}/cluster | KVMClusterNodeClusterAction | default | Cluster join/leave action |
POST | /api/kvm/node/{id}/initialise | InitialiseKVMClusterNode | default | Initialise node |
POST | /api/kvm/node/{id}/reset | ResetKVMClusterNode | default | Reset node |
POST | /api/kvm/node/{id}/reboot | RebootKVMClusterNode | default | Reboot node |
POST | /api/kvm/node/{id}/scan_interfaces | ScanKVMNodeInterfaces | default | Start NIC scan |
GET | /api/kvm/node/{id}/scan_interfaces/{scan_id} | GetKVMNodeInterfaceScan | default | Get NIC scan result |
GET | /api/kvm/node/{id}/interfaces | GetKVMNodeInterfaces | default | List network interfaces |
POST | /api/kvm/node/{id}/network_config | CreateKVMNodeNetworkConfig | default | Create network config |
GET | /api/kvm/node/{id}/network_config | GetKVMNodeNetworkConfig | default | Get network config |
DELETE | /api/kvm/node/{id}/network_config | DeleteKVMNodeNetworkConfig | default | Delete network config |
GET | /api/kvm/node/{id}/ssh_keys | KVMClusterNodeGetSSHKeys | default | Get node SSH keys |
GET | /api/kvm/node/{id}/lifecycle-jobs/{job_id} | GetKVMLifecycleJob | default | Poll a lifecycle job |
POST | /api/kvm/leader-announce | LeaderAnnounce | default | Leader announcement (cluster coordination) |
Marketplace (7 endpoints)
Method | Path | Handler | Auth | Purpose |
|---|---|---|---|---|
GET | /api/marketplace/oauth-info | MarketplaceOAuthInfo | open | OAuth client/config info |
GET | /api/marketplace/authorize | MarketplaceAuthorizeGet | open | OAuth authorize (render) |
POST | /api/marketplace/authorize/login | MarketplaceAuthorizeLogin | open | OAuth authorize login |
POST | /api/marketplace/authorize/submit | MarketplaceAuthorizePost | open | OAuth authorize submit/consent |
GET | /api/marketplace/gpu_pools/{id}/active_workers | GetGPUPoolActiveWorkers | MarketplaceGate + SecureServiceAccount | Active workers for a published pool |
DELETE | /api/marketplace/link/history | DeleteUnlinkedHistory | Secure | Hard-delete revoked link rows (return to never-linked surface) |
POST | /api/marketplace/purge-history | PurgeMarketplaceHistory | hand-rolled (revoked-token bearer) | API-to-API purge from mesh on link deletion |
Pods (4 endpoints)
Method | Path | Handler | Auth | Purpose |
|---|---|---|---|---|
POST | /api/pods/rootfs | PodRootfsAction | default | Rootfs action on a pod |
GET | /api/pods/rootfs-status | ExtractRootfsStatus | default | Rootfs extraction status |
POST | /api/pods/factory_reset | FactoryResetPod | default | Factory-reset a pod |
PUT | /api/pods/{worker_id}/scheduler-config | UpdatePodSchedulerConfig | default | Update pod scheduler config |
GPUaaS (3 endpoints)
Method | Path | Handler | Auth | Purpose |
|---|---|---|---|---|
GET | /api/gpuaas/pool/{pool_id}/scheduler-config | GetPoolSchedulerConfig | default | Get pool scheduler config |
PUT | /api/gpuaas/pool/{pool_id}/scheduler-config | UpdatePoolSchedulerConfig | default | Update pool scheduler config |
PUT | /api/gpuaas/pool-workers/rootfs-enable | EnableWorkerRootfs | default | Enable rootfs persistence on workers |
Regions (1 endpoint)
Method | Path | Handler | Auth | Purpose |
|---|---|---|---|---|
GET | /api/regions/{id}/leader-secret | GetRegionLeaderSecret | Secure | Fetch a region's leader secret |
4. Changed Endpoints
No existing endpoint changed its method, path, or auth wrapper. The only diff on existing route registrations (POST/GET/DELETE /api/marketplace/link*) is code-comment-only — behavior and contract are unchanged. Several existing endpoints return additional response fields; see Section 6. The POST /api/team and PUT /api/team/{team_id} request body was restructured — see Section 2.
5. Removed / Deprecated Endpoints
Method | Path | Status | Replacement |
|---|---|---|---|
POST | /api/gpuaas/pool/{pool_id}/publish | Definition removed from swagger | Marketplace publish flow (publishing is now a marketplace-only action) |
POST | /api/gpuaas/pool/{pool_id}/unpublish | Definition removed from swagger | Marketplace unpublish flow |
These two routes were already absent from main.go on both branches; only the stale swagger definitions were cleaned up in this window. No client impact between europa and ariel.
6. Schema / DTO Changes
Restructured definitions (breaking — request body changed)
Definition | Change |
|---|---|
| Policy ID fields ( |
New definitions (23)
ctrls.marketplaceConnectRequest, ctrls.marketplacePool, models.AsyncOperationInitResponse, models.BaremetalImageSummary, models.BaremetalInstanceTypeSummary, models.BaremetalNodeProvisionLogsResponse, models.BaremetalNodeSummary, models.ExposeServiceResult, models.ExposeServiceStatusResponse, models.FulfillBaremetalSubscriptionPayload, models.GPUaaSTeamMetrics, models.MarketplaceCreateVolumeRequest, models.MarketplaceDeleteServiceRequest, models.MarketplaceDeleteVolumeRequest, models.MarketplaceExposeServiceRequest, models.MarketplacePodActionRequest, models.MarketplacePodDeprovisionRequest, models.MarketplacePodProvisionRequest, models.MarketplacePodResizeRequest, models.MarketplaceVolumeActionRequest, models.PodStatusInfo, models.UpdateBaremetalSubscriptionPayload, models.WorkerSSHInfo.
Enriched definitions (new fields only — no removals/retypes)
Definition | Added fields |
|---|---|
db.Region / models.Region | baremetalEnabled / baremetal_enabled |
models.CreateRegionReq | baremetal_enabled |
models.AddNodeGpuaasOpts | rootfs_persistence_capable |
models.GPUaaSNodeDetails | rootfs_persistence_capable |
models.NodeGpuaasResp | rootfs_persistence_capable |
models.GPUaaSPool | pool_label |
models.BaremetalImageResp | creation_type, description, file_size, hash, is_active, last_used |
models.CreateBaremetalImageOpts / UpdateBaremetalImageOpts | description, file_size, hash, is_active |
models.BaremetalInstanceTypeResp | creation_type, description, is_active, last_used |
models.CreateBaremetalInstanceTypeOpts / UpdateBaremetalInstanceTypeOpts | description, is_active |
models.BaremetalNodeResp | service_status |
models.TransitionBaremetalNodeOpts | service_status |
models.TestConnectionResp | status_transition |
models.BaremetalSubscriptionResp | gpu_type, image, image_hash, image_id, instance_type, name, node, os_type, os_version, service_id, workspace_id |
models.SubscribeToBaremetalPayload | gpu_type, image_hash, image_id, name, os_type, os_version, service_id, workspace_id |
models.MarketplaceUnsubscribeRequest | marketplace_subscription_id |
models.MarketplacePoolResponse / MarketplacePoolDetailResponse | gpu_spec_* (architecture, clockspeed_mhz, cores, id, max_tflops, model_id, vendor_id, vram_gb), region_* (city, country, country_code, lat, lng), time_quantum_in_sec, utilization_percent |
models.ProvisionMarketplacePoolRequest | gpu_spec_* fields, pool_label, region_city |
7. Doc Gaps (QA follow-up)
Mismatches found between main.go (real routes) and docs/swagger.json (generated spec). These are documentation defects, not API changes — worth a ticket:
KVM endpoints undocumented: all 22 new
/api/kvm/*routes are registered inmain.gobut absent fromswagger.jsonon both branches.Documented but not routed: swagger advertises
POST /marketplace/connect,/marketplace/sync,/marketplace/disconnectbut they are not registered inmain.go'sapiRouter.Path mismatch: swagger lists
GET /gpuaas-npu;main.goregistersGET /gpuaas-npu/all.Several swagger "added paths" (e.g.
/marketplace/pods/*,/marketplace/volumes/*,/baremetal/{id}/fulfill) already existed in europa'smain.go— they are newly documented, not new API.