Skip to main content

API Changelog: User Panel 2.4.0


Generated from git diff europa..ariel on the hostedai-user backend. Endpoint changes were verified against actual route registration in main.go, not Swagger annotations alone.

Summary

Metric

Count

Documented endpoints in europa (Swagger)

289

Documented endpoints in ariel (Swagger)

321

Genuinely new endpoints (live routes)

13

Newly documented endpoints (already existed in europa)

~22

Removed endpoints (live routes)

4

Breaking changes

5

New schemas/DTOs

52

Removed schemas/DTOs

5

Modified schemas/DTOs

41

The +32 net Swagger endpoint delta overstates real change. The ariel release added Swagger annotations to many endpoints that already existed as routes in europa (e.g. /gpu-specs, /baremetal/requests*, /instant-stats, /error-log/log, /pricing-policy, /service/image/{image_id}). This changelog reports actual route/behavior changes.

GET /policy-team appears as new in Swagger but the handler (GetPolicyTeamByIDs) is not registered in main.go in either branch — it is documentation-only and not a live endpoint.

⚠️ Breaking Changes

1. [BREAKING] General-image write endpoints removed — use /baremetal/images

The write operations on /general-images were removed. GET /general-images, GET /general-images/{id} and PUT /general-images/{id}/toggle remain (read + toggle only).

Removed (europa)

Replacement (ariel)

POST /general-images

POST /baremetal/images

PUT /general-images/{id}

PUT /baremetal/images/{id}

DELETE /general-images/{id}

DELETE /baremetal/images/{id}

The /baremetal/images CRUD endpoints already existed in europa, so this is a consolidation: baremetal image management moves entirely under /baremetal/images.

Impact: Clients creating/updating/deleting images via /general-images get 404.
Migration: Switch to the corresponding /baremetal/images endpoint. The request/response schema is CreateBaremetalImagePayload / BaremetalImageModel, not CreateGeneralImageOpts / GeneralImageModel (both removed).

2. [BREAKING] Team response model restructured — flat *_policy_id fields removed

The Team response object was reorganized. Flat policy-ID fields were removed and replaced by nested policy sets plus boolean flags.

Removed top-level fields: resource_policy_id, service_policy_id, pricing_policy_id, image_policy_id, instance_type_policy_id, baremetal_workload_image_policy_id.

Added top-level fields: has_general_policies (bool), has_baremetal_policies (bool), general (TeamPolicySet, omitempty), baremetal (TeamPolicySet, omitempty).

PolicyInfo changes: the single baremetal_workload_image_policy field was split into baremetal_image_policy, baremetal_resource_policy, baremetal_service_policy, baremetal_instance_type_policy.

Impact: Clients reading team policy assignments from the flat *_policy_id fields or from baremetal_workload_image_policy will break.
Migration: Read policy data from the new general / baremetal TeamPolicySet objects and the per-type baremetal_*_policy fields. Use has_general_policies / has_baremetal_policies for quick presence checks.

3. [BREAKING] GET /baremetal/instance-types now returns a paginated object, not an array

 

europa

ariel

Response

array of instance types

models.PaginatedBaremetalInstanceTypes

New optional query params added: page, per_page, sort, order, name[contains], gpu_type[eqstr], is_active[eqstr].

Impact: Clients iterating the top-level array break — the list now lives inside the paginated wrapper.
Migration: Read items from the data/items field of PaginatedBaremetalInstanceTypes and handle pagination metadata.

4. [BREAKING] GET /instances/unified/migrated-pods/lookup removed

Before

After

GET /instances/unified/migrated-pods/lookup

❌ Removed

Impact: Clients calling this lookup get 404.
Migration: No direct replacement. Legacy-pod migration status is available via GET /instances/unified/migrate-legacy-pods/status.

5. [BREAKING] Policy type "baremetal" parsing and table mapping changed

In models/types/policy_types.go:

  • PolicyTypeFromString("baremetal") now returns an empty PolicyType (previously returned PolicyTypeBaremetalWorkloadImage).

  • PolicyType.DBTableName() for the baremetal workload-image policy now maps to baremetal_images (previously images).

Impact: Any flow passing the raw string "baremetal" as a policy type (e.g. via /policy/{policy_type}) that relied on it resolving to the baremetal workload-image policy will now resolve to an empty type.
Migration: Confirm the policy-type value expected by the new baremetal policy endpoints; do not rely on the "baremetal" string resolving via PolicyTypeFromString.

New Endpoints

All verified as new route registrations in main.go (not present in europa).

Pods / RootFS

Method

Path

Handler

Purpose

POST

/pods/factory_reset

PodFactoryReset

Wipe the RootFS PVC and re-provision a pod from its original base image (FactoryResetPodOpts).

POST

/pods/rootfs

PodRootfsAction

Enable or disable rootfs for a pod instance (PodRootfsActionOpts).

PUT

/pods/workers/bulk-enable-rootfs

BulkEnableWorkersRootfs

Bulk update rootfs_enabled for a list of worker IDs (BulkUpdateWorkersRootfsOpts). Returns 204.

Scheduler config & pool pricing

Method

Path

Handler

Purpose

PUT

/instance/{instance_id}/scheduler-config

UpdateInstanceSchedulerConfig

Update scheduler config (VIP priority, TQ percentage) for a pod instance (UpdateSchedulerConfigOpts).

GET

/pools/{pool_id}/scheduler-config

GetPoolModeConfigs

Return scheduler mode configs for a pool.

PUT

/resource-policy/pool/{pool_id}/scheduler-config

UpdatePoolSchedulerConfig

Update scheduler config for a pool's resource policy.

POST

/pools/{pool_id}/pricing-suggestions

GeneratePricingSuggestions

Compute weighted price distribution from a full-share price; supports dynamic_mode and vip_ratio overrides (PricingSuggestionRequest[]PricingSuggestionEntry).

Baremetal

Method

Path

Handler

Purpose

GET

/baremetal/instances/{id}/credentials

GetBaremetalInstanceCreds

Retrieve SSH credentials for a baremetal instance the user can access (InstanceCreds).

PUT

/baremetal/images/{id}/toggle

ToggleBaremetalImage

Flip the is_active flag on a baremetal image (local only).

PUT

/baremetal/instance-types/{id}/toggle

ToggleBaremetalInstanceType

Flip the is_active flag on a baremetal instance type (local only).

Images / Teams / Volumes

Method

Path

Handler

Purpose

GET

/all-images

GetAllImages

Retrieve all enabled images, including baremetal images ([]models.Image).

POST

/team/{team_id}/accept-invite

AcceptTeamInvite

Accept the logged-in user's pending invitation to a team.

GET

/shared-volumes/shared-storage-volumes

GetSharedStorageVolumesForTeamInRegion

Get AVAILABLE/IN_USE shared storage volumes for a team in a region (team_id, region_id query params).

Removed Endpoints

Method

Path

Note

POST

/general-images

See Breaking #1 — use POST /baremetal/images.

PUT

/general-images/{id}

See Breaking #1 — use PUT /baremetal/images/{id}.

DELETE

/general-images/{id}

See Breaking #1 — use DELETE /baremetal/images/{id}.

GET

/instances/unified/migrated-pods/lookup

See Breaking #4 — no direct replacement.

Modified Endpoints (non-breaking)

Method

Path

Change

GET

/baremetal/instances

team_id query param relaxed from required → optional (omit to get all teams).

GET

/policy/{policy_type}

Added optional page, per_page, sort, order, filter query params.

GET

/resource-policy

Added optional page, per_page, sort, order, filter query params.

GET

/shared-volumes

Added optional page, per_page, sort, order, filter query params.

GET

/service/i/team-accessible-regions

Added optional nature query param.

DELETE

/baremetal/instances/{id}

Swagger now documents an optional UpdateBaremetalSubscriptionPayload body and a BaremetalSubscriptionResp 200 body. Handler is unchanged — documentation-only clarification.

GET

/general-images/{id}, PUT /general-images/{id}/toggle

Swagger response schema corrected from GeneralImageModel to Image. Handler always returned *models.Imagedocumentation-only fix, not a behavior change.

Schema / DTO Changes

Removed (5): models.GeneralImageModel (was an incorrectly-referenced Swagger schema; the handler always returned Image), models.CreateGeneralImageOpts, models.UpdateGeneralImageOpts, models.ServerDetail, models.ServerUnitDetail.

New (52, selected): enums.DynamicMode (scheduler mode: disabled / user_selected / vip_priority; SchedulerMode is an alias), models.UpdateSchedulerConfigOpts, models.PricingSuggestionRequest, models.PricingSuggestionEntry, models.FactoryResetPodOpts, models.PodRootfsActionOpts, models.BulkUpdateWorkersRootfsOpts, models.InstanceCreds, models.PaginatedBaremetalInstanceTypes, models.CreateBaremetalImagePayload, models.CreateBaremetalInstanceTypePayload, models.TeamPolicySet, db.RootfsStatus, plus a large set of baremetal billing/limits/summary DTOs.

Modified (41): notably models.Team / PolicyInfo (see Breaking #2), baremetal subscription/billing models, pricing-policy and resource-policy models.

Migration Checklist

Replace all POST/PUT/DELETE /general-images* calls with /baremetal/images* (Breaking #1).

Update Team-response parsing: stop reading flat *_policy_id fields; read nested general / baremetalTeamPolicySet and baremetal_*_policy fields (Breaking #2).

Update GET /baremetal/instance-types clients to read from the paginated wrapper (Breaking #3).

Remove usage of GET /instances/unified/migrated-pods/lookup (Breaking #4).

Audit any use of the "baremetal" policy-type string (Breaking #5).