API
Compute

Compute

Base path: /api/cloud/compute

Protected endpoints (Keycloak), unless otherwise noted.

GET /api/cloud/compute/overview

  • Auth: Bearer (Keycloak)
  • Description: Returns resource quotas/overview for the authenticated project.
  • Params/Query/Body: none
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/overview

GET /api/cloud/compute/instances/flavors

  • Auth: Bearer (Keycloak)
  • Description: Lists available instance flavors.
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/instances/flavors

Instances

GET /api/cloud/compute/instances/list

  • Auth: Bearer (Keycloak)
  • Description: Lists compute instances for the authenticated project.
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/instances/list

POST /api/cloud/compute/instances/create

  • Auth: Bearer (Keycloak)
  • Description: Starts workflow to create a new compute instance.
  • Body (JSON):
    • name (string, required)
    • image (string, OpenStack image ID, required)
    • imageName (string, required)
    • flavor (string | number ID, required)
    • securityGroups (array of { value: string, label: string }, optional)
    • key_name (string, keypair name, optional but required if enable_ssh is true)
    • network (string, network ID, optional)
    • is_public (string | boolean, whether to make instance public; UI sends string like shouldbetrue/false)
    • dname (string, domain name for public routing, optional)
    • enable_ssh (boolean, optional)
    • user_data (string, cloud-init user data, optional)
    • volume (object | null):
      • name (string)
      • size (number, GiB)
  • Responses: 200 OK { message: "Instance creation started" }, 500 on failure
  • Example:
curl -X POST https://your-host/api/cloud/compute/instances/create \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{
    "name": "web-01",
    "image": "8f0e-...-imgid",
    "imageName": "Ubuntu 22.04",
    "flavor": "3",
    "securityGroups": [{"value":"default","label":"default"}],
    "key_name": "my-keypair",
    "network": "net-uuid",
    "is_public": "shouldbetrue",
    "dname": "app.example.com",
    "enable_ssh": true,
    "user_data": "#cloud-config\nhostname: web-01\n",
    "volume": { "name": "web-01-volume", "size": 20 }
  }'

POST /api/cloud/compute/instances/console

  • Auth: Bearer (Keycloak)
  • Description: Creates/returns console access for an instance.
  • Body: { instanceId: string }
  • Responses: 201 Created with console data; 400/401/500 on error
  • Example:
curl -X POST https://your-host/api/cloud/compute/instances/console \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"instanceId":"INSTANCE_ID"}'

DELETE /api/cloud/compute/instances/delete/:instanceId

  • Auth: Bearer (Keycloak)
  • Params:
    • instanceId (string)
  • Responses: 200 OK { message: "Instance deletion started" }; 400/401/500
  • Example:
curl -X DELETE https://your-host/api/cloud/compute/instances/delete/INSTANCE_ID \
  -H "Authorization: Bearer $TOKEN"

Logs

GET /api/cloud/compute/instances/:id/logs

  • Auth: Bearer (Keycloak)
  • Params:
    • id (string, instance ID)
  • Responses: 200 OK { output: string }; 400/401/500
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/instances/INSTANCE_ID/logs

GET /api/cloud/compute/instances/:id/actionlog

  • Auth: Bearer (Keycloak)
  • Params:
    • id (string, instance ID)
  • Responses: 200 OK action log array/object; 400/401/500
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/instances/INSTANCE_ID/actionlog

Keypairs

GET /api/cloud/compute/keypairs

  • Auth: Bearer (Keycloak)
  • Description: Lists all keypairs for the authenticated user/project.
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/keypairs

POST /api/cloud/compute/keypairs

  • Auth: Bearer (Keycloak)
  • Description: Creates a new keypair.
  • Body (JSON):
    • name (string, required)
    • publicKey (string, required; OpenSSH public key)
  • Responses: 201 Created with keypair object; 400/401/500
  • Example:
curl -X POST https://your-host/api/cloud/compute/keypairs \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"name":"my-keypair","publicKey":"ssh-ed25519 AAAAC3... user@host"}'

DELETE /api/cloud/compute/keypairs/:name

  • Auth: Bearer (Keycloak)
  • Params:
    • name (string, keypair name)
  • Responses: 204 No Content on success; 401/500 on error
  • Example:
curl -X DELETE https://your-host/api/cloud/compute/keypairs/my-keypair \
  -H "Authorization: Bearer $TOKEN"

Networking Actions

POST /api/cloud/compute/instance/make-public

  • Auth: Bearer (Keycloak)
  • Body: { instanceId: string }
  • Responses: 200 OK with result; 400/401/500
  • Example:
curl -X POST https://your-host/api/cloud/compute/instance/make-public \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"instanceId":"INSTANCE_ID"}'

POST /api/cloud/compute/instance/make-private

  • Auth: Bearer (Keycloak)
  • Body: { instanceId: string }
  • Responses: 200 OK with result; 400/401/500
  • Example:
curl -X POST https://your-host/api/cloud/compute/instance/make-private \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"instanceId":"INSTANCE_ID"}'

Snapshots

GET /api/cloud/compute/snapshots

  • Auth: Bearer (Keycloak)
  • Description: Lists snapshots for the project.
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/snapshots

POST /api/cloud/compute/snapshot

  • Auth: Bearer (Keycloak)
  • Body: { instanceId: string, snapshotName: string }
  • Responses: 200 OK with workflow result; 500 on error
  • Example:
curl -X POST https://your-host/api/cloud/compute/snapshot \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"instanceId":"INSTANCE_ID","snapshotName":"snap-2025-12-03"}'

DELETE /api/cloud/compute/snapshot/:snapshotId

  • Auth: Bearer (Keycloak)
  • Params:
    • snapshotId (string)
  • Responses: 204 No Content on success; 401/500
  • Example:
curl -X DELETE https://your-host/api/cloud/compute/snapshot/SNAPSHOT_ID \
  -H "Authorization: Bearer $TOKEN"

Backups

GET /api/cloud/compute/backups

  • Auth: Bearer (Keycloak)
  • Description: Lists backups for the project.
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/backups

POST /api/cloud/compute/backup

  • Auth: Bearer (Keycloak)
  • Body: { volumeId: string, backupName: string }
  • Responses: 200 OK with result; 500 on error
  • Example:
curl -X POST https://your-host/api/cloud/compute/backup \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"volumeId":"VOLUME_ID","backupName":"nightly-2025-12-03"}'

DELETE /api/cloud/compute/backup/:backupId

  • Auth: Bearer (Keycloak)
  • Params:
    • backupId (string)
  • Responses: 204 No Content on success; 401/500
  • Example:
curl -X DELETE https://your-host/api/cloud/compute/backup/BACKUP_ID \
  -H "Authorization: Bearer $TOKEN"

Billing

GET /api/cloud/compute/billing/forecast

  • Auth: Bearer (Keycloak)
  • Description: Returns a billing forecast estimation.
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/billing/forecast

Volume Attachments

Public compute endpoints (router is open, controller still requires Keycloak):

POST /api/cloud/compute/instance/attach-volume

  • Auth: Bearer (Keycloak)
  • Body: { instanceId: string, volumeId: string }
  • Responses: 200 OK { message: "Volume attached successfully" }; 400/401/500
  • Example:
curl -X POST https://your-host/api/cloud/compute/instance/attach-volume \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"instanceId":"INSTANCE_ID","volumeId":"VOLUME_ID"}'

GET /api/cloud/compute/instances/:instanceId/volumes

  • Auth: Bearer (Keycloak)
  • Params:
    • instanceId (string)
  • Responses: 200 OK with attachment list; 400/401/500
  • Example:
curl -H "Authorization: Bearer $TOKEN" \
  https://your-host/api/cloud/compute/instances/INSTANCE_ID/volumes