configure
- POST /configure/decommission/wipe-result
Wipe ISO per-disk result callback (node → management)
Called by the bare wipe ISO (no auth; node matched by NIC MAC) to report per-disk wipe/verify results. Annotates status only — it never transitions node state.
- Request JSON Object:
all_verified (integer) – 1 if every targeted disk verified clean
disks[].name (string)
disks[].verified (boolean)
disks[].wiped (boolean)
macs[] (string)
success (integer)
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
- GET /configure/nodes/{bmcIP}/nics
Get NICs from remote node
Proxies request to karios-bootstrap on remote node to get NIC list
- Parameters:
bmcIP (string) – BMC IP address
- Query Parameters:
status (string) – Filter by link status (e.g., ‘up’)
- Status Codes:
200 OK – OK
404 Not Found – Not Found
500 Internal Server Error – Internal Server Error
- Response JSON Object:
nics[].bondMaster (string) – name of the existing master when IsBondSlave true
nics[].driver (string)
nics[].interfaceName (string)
nics[].ipAddress (string)
nics[].isBondMaster (boolean) – this NIC IS the bond device — never a slave candidate
nics[].isBondSlave (boolean) – already enslaved to a pre-existing bond on the target (kernel EBUSY if re-enslaved)
nics[].isManagementNIC (boolean) – host’s own mgmt-bearing NIC; never eligible for bond enslavement mid-setup
nics[].isPhysical (boolean)
nics[].linkStatus (string)
nics[].macAddress (string)
nics[].pciAddress (string)
nics[].speed (string)
- POST /configure/nodes/{bmcIP}/preflight
Run preflight check for node configuration
Returns the new node’s NICs and existing guest bridges that need NIC assignments
- Parameters:
bmcIP (string) – BMC IP address
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
404 Not Found – Not Found
500 Internal Server Error – Internal Server Error
- Response JSON Object:
bondParams (any) – BondParams (when ControlNodeHasBond) returns the control node’s bond parameters (mode/miimon/hash/rate). UI surfaces these as the negotiated LACP profile this host will join — read-only.
bootstrap_nics[].slot (integer) – 1-indexed slot number
bootstrap_nics[].tagged[].network (string) – Network role (e.g., “storage”, “guest”, “public”)
bootstrap_nics[].tagged[].vlans[] (integer)
bootstrap_nics[].untagged (string) – untagged role (e.g., “management”), empty if none
controlNodeHasBond (boolean) – ControlNodeHasBond surfaces whether the control node is already running an LACP bond. UI defaults the bond toggle to ON when true so day-2 hosts inherit the same fabric layout by default (Model B partial-bond still lets operator pick which subset of this host’s NICs to enslave).
defaultMTU (integer) – DefaultMTU and PublicMTU are read from FabricConfig (VXLAN underlay MTU and public-network MTU). UI shows them so the operator sees the bridge MTUs that will be rendered on this host — read-only, no UI override.
guestMTU (integer)
guest_bridges[].bridge (string) – bridge name (from KVMNetworkLabel on the PN’s traffic type)
guest_bridges[].networks[].name (string) – CS network display name
guest_bridges[].networks[].tagged (boolean) – true = tagged VLAN; false = untagged (native VLAN on switch port)
guest_bridges[].networks[].type (string) – “Isolated” or “Shared”
guest_bridges[].networks[].vlan (string) – VLAN ID (e.g., “4001”) or “untagged”
managementMTU (integer) – Per-role bridge MTUs resolved from control-node NetBox interface rows (cloudbr0 → mgmt, cloudbr1 → storage). 0 = will inherit DefaultMTU at render. NetBox is the canonical store; operator can edit those rows post-deploy for day-2 mutation.
mtu_warnings[] (string)
node_ip (string)
publicMTU (integer)
storageMTU (integer)
- POST /configure/nodes/{nodeIP}/cancel
Cancel a running or rollback a failed node setup
If setup is running, signals it to stop and then runs rollback. If setup already failed, auto-rollback should already be running; returns the existing rollback job if present, or triggers a new one.
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
202 Accepted – Accepted
400 Bad Request – Bad Request
409 Conflict – Conflict
- Response JSON Object:
job_id (string)
message (string)
node_ip (string)
steps[] (string)
- POST /configure/nodes/{nodeIP}/cleanup
Retry node cleanup after failed/partial rollback
Triggers rollback cleanup again for a node stuck after failed configure cancel/rollback
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
202 Accepted – Accepted
400 Bad Request – Bad Request
404 Not Found – Not Found
409 Conflict – Conflict
- Response JSON Object:
job_id (string)
message (string)
node_ip (string)
steps[] (string)
- POST /configure/nodes/{nodeIP}/decommission
Decommission a configured node
Reverts a configured node back to ready. Runs the decommission preflight first; if a check blocks (e.g. the only compute node still runs VMs) the call returns 409 with the report unless force=true. On acceptance the node moves to “decommissioning”, VMs are drained via Compute, the control plane and OS state are torn down, and the node is marked ready. The bmc_infos record is kept — a revert, not a delete. Progress streams over the unified SSE channel.
- Parameters:
nodeIP (string) – BMC IP address
- Query Parameters:
force (boolean) – Decommission even if VMs cannot be migrated (destroys them)
- Status Codes:
200 OK – OK
202 Accepted – Accepted
400 Bad Request – Bad Request
404 Not Found – Not Found
409 Conflict – Conflict
- Response JSON Object:
job_id (string)
message (string)
node_ip (string)
steps[] (string)
job_id
message
node_ip
steps[]
- GET /configure/nodes/{nodeIP}/decommission/logs
Audit log of the latest decommission for a node
Returns the captured audit log (tail) for the latest decommission job — the place to look when a decommission fails partway.
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
200 OK – OK
404 Not Found – Not Found
- Response JSON Object:
audit_log (string)
content (string)
job_id (string)
node_ip (string)
truncated (boolean)
- POST /configure/nodes/{nodeIP}/decommission/preflight
Preflight checks for decommissioning a node
Read-only checks run before a node is decommissioned: node state, competing jobs, and — through Compute — whether the host’s VMs can be migrated. Reports can_proceed and requires_force (the only compute node with running VMs) so the user sees what will happen.
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
404 Not Found – Not Found
- Response JSON Object:
can_proceed (boolean) – no blocking check failed
checks[].message (string)
checks[].name (string)
checks[].status (string) – “pass”, “warn”, “fail”
cpu_demand_mhz (integer)
free_cpu_mhz (integer)
free_mem_bytes (integer)
mem_demand_bytes (integer)
migratable_vm_count (integer) – Per-VM migrate/destroy split (estimate), for the UI’s explicit migrate-vs-destroy choice: MigratableVMCount would fit on the survivors, NonMigratableVMCount would not and gets destroyed if the user proceeds. Names are omitted when there’s nothing to list.
migration_capacity_ok (boolean) – Migration capacity — whether the other Up hosts have enough aggregate CPU and memory to receive this node’s VMs (CPU in MHz, memory in bytes). Populated only when CloudStack placement could be assessed.
migration_targets (integer) – other Up hosts that can take VMs
node_ip (string)
non_migratable_vm_count (integer)
non_migratable_vm_names[] (string)
requires_force (boolean) – proceeding will destroy VMs
router_count (integer)
steps[] (string)
system_vm_count (integer) – System services running on the node (SSVM/CPVM + virtual routers). Non-zero means decommissioning will disrupt zone services until CloudStack recreates them.
vm_count (integer)
- POST /configure/nodes/{nodeIP}/decommission/retry
Retry a failed or stalled decommission
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
200 OK – OK
202 Accepted – Accepted
404 Not Found – Not Found
409 Conflict – Conflict
- Response JSON Object:
job_id (string)
message (string)
node_ip (string)
steps[] (string)
job_id
message
node_ip
steps[]
- GET /configure/nodes/{nodeIP}/decommission/snapshot
One-shot status + log snapshot for a decommission
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
200 OK – OK
404 Not Found – Not Found
- Response JSON Object:
bmc_ip (string)
current_step (string)
failed (integer)
failed_step (string)
job_id (string)
job_status (string) – running | completed | failed
log (string) – audit-log content for backfill
log_truncated (boolean)
next_action (string)
node_ip (string) – OS IP
progress (integer) – 0-100
provision_status (string) – discovered | decommissioning
recoverable (boolean)
status (string) – human status text
steps[].error (string)
steps[].name (string)
steps[].status (string) – “succeeded”, “failed”, “skipped”
succeeded (integer)
total_steps (integer)
unconfigure (boolean) – Unconfigure is true when this teardown keeps the node (back to ready, os_ip kept) rather than a full decommission. The UI uses it to label the row/flow “Unconfiguring” not “Decommissioning” — the two share the job machinery but read differently to the user.
- POST /configure/nodes/{nodeIP}/decommission/status
Status of the latest decommission for a node
Returns the latest decommission job: state, per-step results, the step that failed (if any), whether it can be retried, and the next action for the user. Use the logs endpoint for full detail.
- Parameters:
nodeIP (string) – BMC IP address
- Status Codes:
200 OK – OK
404 Not Found – Not Found
- Response JSON Object:
audit_log (string)
created_at (string)
failed_step (string)
id (string)
job_status (string)
job_type (string)
metadata (string)
next_action (string)
node_ip (string)
parent_id (string)
progress (integer)
provision_status (string)
recoverable (boolean)
resource_name (string) – e.g., network name, node FQDN
status (string)
steps[].error (string)
steps[].name (string)
steps[].status (string) – “succeeded”, “failed”, “skipped”
total_jobs (integer)
updated_at (string)
wipe_report (string) – WipeReport holds the wipe ISO’s per-disk JSON report. The async, unauthenticated ReportWipeResult callback writes it to this dedicated column (a single-column update), NOT into Metadata above — so that best-effort write can neither drop itself nor clobber the decommission orchestrator’s per-step/resume metadata when the two race on the same job row. Read-only here (gorm “->”): it is loaded for the status endpoint but never written by the orchestrator’s full-row Save, which would otherwise overwrite it.
- GET /configure/nodes/{nodeIP}/health
Check remote node health
Verifies that karios-bootstrap agent is running on the remote node
- Parameters:
nodeIP (string) – Remote node IP address
- Status Codes:
200 OK – OK
500 Internal Server Error – Internal Server Error
- POST /configure/nodes/{nodeIP}/nics/blink
Blink NIC LED on remote node
Proxies request to karios-bootstrap on remote node to blink NIC LED
- Parameters:
nodeIP (string) – BMC IP address
- Request JSON Object:
duration (integer) – seconds, default 10
interfaceName (string) – (required)
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
500 Internal Server Error – Internal Server Error
- POST /configure/nodes/{nodeIP}/setup
Complete node setup
Executes complete node setup: NIC assignments, bridges, KVM, CloudStack, Ceph
- Parameters:
nodeIP (string) – BMC IP address
- Request JSON Object:
assignments (object) – NIC assignments (required) - maps interface name to network roles VLAN IDs in tagged networks will be populated from NetBox if empty (required)
bondSlaveOverride[] (string)
guest_bridges[].bridge (string) – bridge name (= network name, e.g., “sandeep1”) (required)
guest_bridges[].nic (string) – NIC name on the new node (e.g., “ens4”) (required)
role (string) – Role selects the node persona: “compute” (default) or “management”. Compute: KVM host + CloudStack agent + Ceph OSD (if disks available). Management: Joins HA cluster (MySQL/PG replication, keepalived, DNS). No KVM, no CS agent, no addHost.
siteId (integer) – SiteID for VLAN lookup from NetBox (optional - defaults to NETBOX_SITE_ID env var)
- Status Codes:
200 OK – OK
202 Accepted – Accepted
400 Bad Request – Bad Request
500 Internal Server Error – Internal Server Error
- Response JSON Object:
job_id (string)
message (string)
node_ip (string)
steps[] (string)
- POST /configure/setup/status
Get latest node setup status
Returns the latest setup job status for a node identified by BMC IP
- Request JSON Object:
bmc_ip (string) – (required)
- Status Codes:
200 OK – OK
400 Bad Request – Bad Request
404 Not Found – Not Found
- Response JSON Object:
created_at (string)
id (string)
job_status (string)
job_type (string)
metadata (string)
node_ip (string)
parent_id (string)
progress (integer)
provision_status (string)
resource_name (string) – e.g., network name, node FQDN
status (string)
total_jobs (integer)
updated_at (string)
wipe_report (string) – WipeReport holds the wipe ISO’s per-disk JSON report. The async, unauthenticated ReportWipeResult callback writes it to this dedicated column (a single-column update), NOT into Metadata above — so that best-effort write can neither drop itself nor clobber the decommission orchestrator’s per-step/resume metadata when the two race on the same job row. Read-only here (gorm “->”): it is loaded for the status endpoint but never written by the orchestrator’s full-row Save, which would otherwise overwrite it.