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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.