{
"openapi": "3.1.0",
"info": {
"title": "Manta API",
"description": "REST API for managing CSM/OpenCHAMI HPC clusters via manta.",
"contact": {
"name": "Manuel Sopena Ballesteros",
"email": "msopena@cscs.ch"
},
"license": {
"name": ""
},
"version": "2.0.0-beta.61"
},
"servers": [
{
"url": "/api/v1",
"description": "manta API v1"
}
],
"paths": {
"/analysis/images": {
"get": {
"tags": [
"analysis"
],
"summary": "GET /analysis/images — image-centric flat projection of every CFS\nconfiguration, CFS session, BOS session template, and IMS image\nvisible to the caller. One row per IMS image; see\n[`BackendSummary`] for column semantics.",
"operationId": "get_image_analysis",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Image-analysis rows",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/BackendSummary"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/auth/token": {
"post": {
"tags": [
"auth"
],
"summary": "POST /api/v1/auth/token — exchange username/password for a CSM token.",
"operationId": "auth_token",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthTokenRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Token issued",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthTokenResponse"
}
}
}
},
"401": {
"description": "Invalid credentials",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Unknown site",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"429": {
"description": "Rate limit exceeded",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/auth/validate": {
"post": {
"tags": [
"auth"
],
"summary": "POST /api/v1/auth/validate — check whether a CSM token is still valid.",
"operationId": "auth_validate",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ValidateTokenRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Token is valid"
},
"401": {
"description": "Token rejected",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Unknown site",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"429": {
"description": "Rate limit exceeded",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/boot-config": {
"post": {
"tags": [
"boot-parameters"
],
"summary": "`POST /api/v1/boot-config` — apply BSS boot configuration to a set of nodes.",
"operationId": "apply_boot_config",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApplyBootConfigRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Boot config applied or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/boot-parameters": {
"get": {
"tags": [
"boot-parameters"
],
"summary": "GET /boot-parameters — fetch BSS boot parameters for a group or node list.",
"operationId": "get_boot_parameters",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group whose members' boot parameters should be returned.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "nodes",
"in": "query",
"description": "Explicit comma-separated xnames; mutually exclusive with\n`hsm_group`.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Boot parameters",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/BootParameters"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"put": {
"tags": [
"boot-parameters"
],
"summary": "PUT /boot-parameters — update boot image, kernel params, or runtime config for nodes.",
"operationId": "update_boot_parameters",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateBootParametersParams"
}
}
},
"required": true
},
"responses": {
"204": {
"description": "Boot parameters updated"
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"post": {
"tags": [
"boot-parameters"
],
"summary": "POST /boot-parameters — create a new BSS boot parameters entry.",
"operationId": "add_boot_parameters",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BootParameters"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Boot parameters created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreatedResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"delete": {
"tags": [
"boot-parameters"
],
"summary": "DELETE /boot-parameters — remove BSS boot parameter entries for specified hosts.",
"operationId": "delete_boot_parameters",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeleteBootParametersRequest"
}
}
},
"required": true
},
"responses": {
"204": {
"description": "Boot parameters removed"
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/clusters": {
"get": {
"tags": [
"clusters"
],
"summary": "DEPRECATED alias for `GET /groups/nodes`. Logs a server-side warning,\nthen delegates to the canonical handler. Old path kept for one\nrelease.",
"operationId": "get_clusters_deprecated",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group name to list nodes for. When omitted the response\ncovers every group the bearer token can access.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "status",
"in": "query",
"description": "Optional power-status filter (e.g. `ON`, `OFF`, `READY`).",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "[DEPRECATED] use /groups/nodes — list of group nodes",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NodeDetails"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/configurations": {
"get": {
"tags": [
"configurations"
],
"summary": "GET /configurations — list CFS configurations with optional\nname/pattern/group filters. Every row carries the full\n`CfsConfigurationResponse` plus a `safe_to_delete` verdict\nderived from CFS components only (a configuration is unsafe iff\nsome component lists it as `desired_config`).",
"operationId": "get_configurations",
"parameters": [
{
"name": "name",
"in": "query",
"description": "Exact configuration name to fetch.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "pattern",
"in": "query",
"description": "Glob pattern matched against configuration names.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "hsm_group",
"in": "query",
"description": "HSM group whose associated configurations should be returned.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "limit",
"in": "query",
"description": "Cap on the number of configurations returned (most recent first).",
"required": false,
"schema": {
"type": [
"integer",
"null"
],
"format": "int32",
"minimum": 0
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Configurations with components-only safe_to_delete verdict",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ConfigurationAnalysis"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"delete": {
"tags": [
"configurations"
],
"summary": "`DELETE /api/v1/configurations` — delete CFS configurations and all derived artifacts.",
"operationId": "delete_configurations",
"parameters": [
{
"name": "pattern",
"in": "query",
"description": "Glob pattern to match configuration names.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "since",
"in": "query",
"description": "ISO-8601 lower bound — only delete configurations created after\nthis date.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "until",
"in": "query",
"description": "ISO-8601 upper bound — only delete configurations created before\nthis date.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "dry_run",
"in": "query",
"description": "When true, return deletion candidates without removing anything.",
"required": false,
"schema": {
"type": "boolean"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Configurations deleted or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/ephemeral-env": {
"post": {
"tags": [
"ephemeral-env"
],
"summary": "`POST /api/v1/ephemeral-env` — launch an ephemeral CFS environment from an IMS image.",
"operationId": "create_ephemeral_env",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateEphemeralEnvRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Ephemeral env created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EphemeralEnvResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/groups": {
"get": {
"tags": [
"groups"
],
"summary": "GET /groups — list HSM groups, optionally filtered by name.",
"operationId": "get_groups",
"parameters": [
{
"name": "name",
"in": "query",
"description": "Exact group name; returns all groups when `None`.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of groups",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Group"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"post": {
"tags": [
"groups"
],
"summary": "POST /groups — create a new HSM group.",
"operationId": "create_group",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Group"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Group created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreatedResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"409": {
"description": "Conflict",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/groups/available": {
"get": {
"tags": [
"groups"
],
"summary": "GET /groups/available — list HSM group names the token can access.",
"operationId": "get_available_groups",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of accessible group names",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/groups/hardware": {
"get": {
"tags": [
"groups"
],
"summary": "GET /groups/hardware — summarize hardware components per node for a group.",
"operationId": "get_groups_hardware",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group name to inventory. When omitted the response covers\nevery group the bearer token can access.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Hardware summary for group nodes",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/groups/nodes": {
"get": {
"tags": [
"groups"
],
"summary": "GET /groups/nodes — list nodes in a group with optional status filter.",
"operationId": "get_groups_nodes",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group name to list nodes for. When omitted the response\ncovers every group the bearer token can access.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "status",
"in": "query",
"description": "Optional power-status filter (e.g. `ON`, `OFF`, `READY`).",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of group nodes",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NodeDetails"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/groups/{label}": {
"delete": {
"tags": [
"groups"
],
"summary": "DELETE /groups/{label} — remove an HSM group.",
"operationId": "delete_group",
"parameters": [
{
"name": "label",
"in": "path",
"description": "Group label",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "force",
"in": "query",
"description": "Delete even if the group still has members (default: `false`).",
"required": false,
"schema": {
"type": "boolean"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"description": "Group removed"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/groups/{name}/members": {
"post": {
"tags": [
"groups"
],
"summary": "POST /groups/{name}/members — replace a group's member list from a host expression.",
"operationId": "add_nodes_to_group",
"parameters": [
{
"name": "name",
"in": "path",
"description": "Group name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddNodesToGroupRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Members updated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddNodesToGroupResponse"
}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"delete": {
"tags": [
"groups"
],
"summary": "`DELETE /api/v1/groups/{name}/members` — remove nodes from an HSM group.",
"operationId": "delete_group_members",
"parameters": [
{
"name": "name",
"in": "path",
"description": "Group name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeleteGroupMembersRequest"
}
}
},
"required": true
},
"responses": {
"204": {
"description": "Members removed"
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/hardware-clusters": {
"get": {
"tags": [
"hardware"
],
"summary": "DEPRECATED alias for `GET /groups/hardware`. Logs a server-side\nwarning and delegates to the canonical handler. Old path kept for\none release.",
"operationId": "get_hardware_clusters_deprecated",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group name to inventory. When omitted the response covers\nevery group the bearer token can access.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "[DEPRECATED] use /groups/hardware — hardware summary for group nodes",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/hardware-clusters/{target}/configuration": {
"post": {
"tags": [
"hardware"
],
"summary": "`POST /api/v1/hardware-clusters/{target}/configuration` — pin or unpin nodes between clusters by hardware pattern.",
"operationId": "apply_hw_configuration",
"parameters": [
{
"name": "target",
"in": "path",
"description": "Target cluster name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApplyHwConfigurationRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Configuration applied or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/hardware-clusters/{target}/members": {
"post": {
"tags": [
"hardware"
],
"summary": "`POST /api/v1/hardware-clusters/{target}/members` — move nodes matching a hardware pattern into a cluster.",
"operationId": "add_hw_component",
"parameters": [
{
"name": "target",
"in": "path",
"description": "Target cluster name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddHwComponentRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Members added or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"delete": {
"tags": [
"hardware"
],
"summary": "`DELETE /api/v1/hardware-clusters/{target}/members` — move nodes back to parent cluster by hardware pattern.",
"operationId": "delete_hw_component",
"parameters": [
{
"name": "target",
"in": "path",
"description": "Target cluster name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeleteHwComponentRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Members removed or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/hardware-nodes-list": {
"get": {
"tags": [
"hardware"
],
"summary": "GET /hardware-nodes-list — hardware details for an explicit list of xnames.",
"operationId": "get_hardware_nodes_list",
"parameters": [
{
"name": "xnames",
"in": "query",
"description": "Hosts expression (xnames, NIDs, or hostlist notation). The field\nname is retained for wire stability.",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Hardware details for specified nodes",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/health": {
"get": {
"tags": [
"system"
],
"summary": "GET /health — liveness probe; returns `{\"status\":\"ok\"}`.",
"operationId": "health",
"responses": {
"200": {
"description": "Server is healthy"
}
}
}
},
"/images": {
"get": {
"tags": [
"images"
],
"summary": "GET /images — list IMS images sorted by creation time.",
"operationId": "get_images",
"parameters": [
{
"name": "id",
"in": "query",
"description": "Exact IMS image ID; returns just that image when set.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "pattern",
"in": "query",
"description": "Glob pattern matched against image name; applied server-side\n(`service::image::get_images`). Invalid glob returns 400.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "limit",
"in": "query",
"description": "Cap on the number of images returned (most recent first).",
"required": false,
"schema": {
"type": [
"integer",
"null"
],
"format": "int32",
"minimum": 0
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of images",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"delete": {
"tags": [
"images"
],
"summary": "`DELETE /api/v1/images` — delete IMS images by ID; validates only when `dry_run=true`.",
"operationId": "delete_images",
"parameters": [
{
"name": "ids",
"in": "query",
"description": "Comma-separated list of IMS image IDs to delete.",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "dry_run",
"in": "query",
"description": "When true, validate deletion eligibility without removing\nanything.",
"required": false,
"schema": {
"type": "boolean"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Images deleted or validation result",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/kernel-parameters": {
"get": {
"tags": [
"kernel-parameters"
],
"summary": "GET /kernel-parameters — fetch BSS kernel parameters for a group or node list.",
"operationId": "get_kernel_parameters",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group whose members' kernel parameters should be returned.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "nodes",
"in": "query",
"description": "Explicit comma-separated xnames; mutually exclusive with\n`hsm_group`.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Kernel parameters",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/BootParameters"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"delete": {
"tags": [
"kernel-parameters"
],
"summary": "`DELETE /api/v1/kernel-parameters` — remove named kernel parameters from node BSS entries.",
"operationId": "delete_kernel_parameters",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeleteKernelParametersRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Parameters removed or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/kernel-parameters/add": {
"post": {
"tags": [
"kernel-parameters"
],
"summary": "`POST /api/v1/kernel-parameters/add` — merge new kernel parameters into existing node BSS entries.",
"operationId": "add_kernel_parameters",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddKernelParametersRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Parameters added or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/kernel-parameters/apply": {
"post": {
"tags": [
"kernel-parameters"
],
"summary": "`POST /api/v1/kernel-parameters/apply` — add, replace, or delete kernel parameters on nodes.",
"operationId": "apply_kernel_parameters",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApplyKernelParametersRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Kernel parameters applied or preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/migrate/backup": {
"post": {
"tags": [
"migrate"
],
"summary": "`POST /api/v1/migrate/backup` — export BOS session templates to backup files.",
"operationId": "migrate_backup",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MigrateBackupRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Backup completed",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompletedResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/migrate/nodes": {
"post": {
"tags": [
"migrate"
],
"summary": "`POST /api/v1/migrate/nodes` — move nodes between HSM groups.",
"operationId": "migrate_nodes",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MigrateNodesRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Migration result",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MigrateNodesResponse"
}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/migrate/restore": {
"post": {
"tags": [
"migrate"
],
"summary": "`POST /api/v1/migrate/restore` — import BOS session templates and related artifacts from backup.",
"operationId": "migrate_restore",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MigrateRestoreRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Restore completed",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompletedResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/nodes": {
"get": {
"tags": [
"nodes"
],
"summary": "GET /nodes — fetch node details for a given xname expression.",
"operationId": "get_nodes",
"parameters": [
{
"name": "xname",
"in": "query",
"description": "Comma-separated xnames, NIDs, or hostlist expression\n(e.g. `x3000c0s1b0n[0-3]`).",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "include_siblings",
"in": "query",
"description": "Expand results to include nodes sharing the same blade.",
"required": false,
"schema": {
"type": [
"boolean",
"null"
]
}
},
{
"name": "status",
"in": "query",
"description": "Optional power-status filter (e.g. `ON`, `OFF`, `READY`).",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Node details",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NodeDetails"
}
}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"post": {
"tags": [
"nodes"
],
"summary": "POST /nodes — register a new node in HSM and add it to a group.",
"operationId": "add_node",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddNodeRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Node registered",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AddNodeResponse"
}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/nodes/{id}": {
"delete": {
"tags": [
"nodes"
],
"summary": "DELETE /nodes/{id} — remove a node from HSM by xname or NID.",
"operationId": "delete_node",
"parameters": [
{
"name": "id",
"in": "path",
"description": "Node xname or NID",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"description": "Node removed"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/nodes/{xname}/console": {
"get": {
"tags": [
"console"
],
"summary": "`WS /api/v1/nodes/{xname}/console` — attach an interactive PTY console to a node via WebSocket.",
"operationId": "console_node_ws",
"parameters": [
{
"name": "xname",
"in": "path",
"description": "Node xname",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "cols",
"in": "query",
"description": "Initial terminal width in columns (default `80`).",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"minimum": 0
}
},
{
"name": "rows",
"in": "query",
"description": "Initial terminal height in rows (default `24`).",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"minimum": 0
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"101": {
"description": "WebSocket upgrade"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"501": {
"description": "Vault or k8s not configured",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/power": {
"post": {
"tags": [
"power"
],
"summary": "`POST /api/v1/power` — start a PCS power transition (on / off /\nreset) against nodes or all members of a cluster and return the\ntransition id **immediately**. Does not block until the\ntransition completes — the CLI is responsible for polling\n`GET /power/transitions/{id}` until the snapshot reports\n`transitionStatus = \"completed\"`.",
"description": "Returns a `TransitionStartOutput` (`{ transitionID, operation }`)\nas JSON. Callers can hand the `transitionID` to\n[`get_power_transition`].",
"operationId": "post_power",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PowerRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "PCS transition started; returns TransitionStartOutput",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/power/transitions/{id}": {
"get": {
"tags": [
"power"
],
"summary": "`GET /api/v1/power/transitions/{id}` — fetch the current snapshot\nof a PCS power transition (status, task counts, per-task detail).\nCalled by the CLI's poll loop after `POST /power` returns the id.",
"operationId": "get_power_transition",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Transition snapshot",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Unknown transition id",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/redfish-endpoints": {
"get": {
"tags": [
"redfish-endpoints"
],
"summary": "GET /redfish-endpoints — list HSM Redfish endpoints with optional filters.",
"operationId": "get_redfish_endpoints",
"parameters": [
{
"name": "id",
"in": "query",
"description": "Exact endpoint ID (BMC xname) filter.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "fqdn",
"in": "query",
"description": "FQDN substring filter.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "uuid",
"in": "query",
"description": "UUID exact-match filter.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "macaddr",
"in": "query",
"description": "MAC-address exact-match filter (colon-separated hex).",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "ipaddress",
"in": "query",
"description": "IP-address exact-match filter (IPv4 or IPv6).",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of Redfish endpoints",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"put": {
"tags": [
"redfish-endpoints"
],
"summary": "PUT /redfish-endpoints — update an existing Redfish endpoint's properties.",
"operationId": "update_redfish_endpoint",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateRedfishEndpointParams"
}
}
},
"required": true
},
"responses": {
"204": {
"description": "Endpoint updated"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"post": {
"tags": [
"redfish-endpoints"
],
"summary": "POST /redfish-endpoints — register a new Redfish endpoint in HSM.",
"operationId": "add_redfish_endpoint",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateRedfishEndpointParams"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Endpoint registered",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreatedResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/redfish-endpoints/{id}": {
"delete": {
"tags": [
"redfish-endpoints"
],
"summary": "DELETE /redfish-endpoints/{id} — remove a Redfish endpoint from HSM.",
"operationId": "delete_redfish_endpoint",
"parameters": [
{
"name": "id",
"in": "path",
"description": "BMC xname",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"description": "Endpoint removed"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sat-file/configurations": {
"post": {
"tags": [
"sat-file"
],
"summary": "`POST /api/v1/sat-file/configurations` — apply a single SAT\nconfiguration entry. Returns the created `CfsConfigurationResponse`.",
"operationId": "post_sat_configuration",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PostSatConfigurationRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Configuration applied",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"501": {
"description": "Vault or k8s not configured",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sat-file/images/cfs-session": {
"post": {
"tags": [
"sat-file"
],
"summary": "`POST /api/v1/sat-file/images/cfs-session` — translate one SAT\n`images[]` entry into a CFS session payload and create it. Returns\nthe freshly-created [`CfsSessionGetResponse`] so the CLI can drive\nthe monitor + stamp steps itself.",
"operationId": "post_sat_image_cfs_session",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateImageCfsSessionRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "CFS session created",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"501": {
"description": "Vault or k8s not configured",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sat-file/images/stamp": {
"post": {
"tags": [
"sat-file"
],
"summary": "`POST /api/v1/sat-file/images/stamp` — fetch the named CFS session,\nderive the provenance stamp, and PATCH the produced IMS image.",
"description": "Performs two boundary checks before delegating to the backend:\nthe caller must have access to every HSM group the session\ntargets, and the session must have produced a result image. See\n[`crate::service::session::validate_session_access`] +\n[`crate::service::session::require_result_image`].",
"operationId": "post_sat_image_stamp",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StampImageFromSessionRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Image stamped",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Session not complete / no image",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sat-file/session-templates": {
"post": {
"tags": [
"sat-file"
],
"summary": "`POST /api/v1/sat-file/session-templates` — apply a single SAT\nsession_template entry. Returns the created BOS session template\nand (if `create_bos_session` was set and we're not in dry-run) the\nBOS session that was created from the new template to boot the\ntargeted nodes through it.",
"operationId": "post_sat_session_template",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PostSatSessionTemplateRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Session template applied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PostSatSessionTemplateResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sessions": {
"get": {
"tags": [
"sessions"
],
"summary": "GET /sessions — list CFS sessions with optional filters.",
"operationId": "get_sessions",
"parameters": [
{
"name": "hsm_group",
"in": "query",
"description": "HSM group whose sessions should be returned.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "xnames",
"in": "query",
"description": "Filter to sessions whose `ansible_limit` mentions any of these\ncomma-separated xnames.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "min_age",
"in": "query",
"description": "Lower-bound session age expressed as a duration string\n(e.g. `\"1h\"`, `\"2d\"`).",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "max_age",
"in": "query",
"description": "Upper-bound session age expressed as a duration string.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "session_type",
"in": "query",
"description": "Session type filter: `\"image\"` or `\"runtime\"`.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "status",
"in": "query",
"description": "Status filter: `\"pending\"`, `\"running\"`, or `\"complete\"`.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "name",
"in": "query",
"description": "Exact session name.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "limit",
"in": "query",
"description": "Cap on the number of sessions returned (most recent first).",
"required": false,
"schema": {
"type": [
"integer",
"null"
],
"format": "int32",
"minimum": 0
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of sessions",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
},
"post": {
"tags": [
"sessions"
],
"summary": "`POST /api/v1/sessions` — create a CFS session from one or more git repositories.",
"operationId": "create_session",
"parameters": [
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateSessionRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Session created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateSessionResponse"
}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"501": {
"description": "Vault not configured",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sessions/{name}": {
"delete": {
"tags": [
"sessions"
],
"summary": "DELETE /sessions/{name} — cancel and delete a CFS session; `?dry_run=true` previews.",
"operationId": "delete_session",
"parameters": [
{
"name": "name",
"in": "path",
"description": "Session name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "dry_run",
"in": "query",
"description": "When true, return deletion context without actually deleting\n(default: `false`).",
"required": false,
"schema": {
"type": "boolean"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Session deleted or deletion preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sessions/{name}/console": {
"get": {
"tags": [
"console"
],
"summary": "`WS /api/v1/sessions/{name}/console` — attach an interactive PTY console to a CFS session pod via WebSocket.",
"operationId": "console_session_ws",
"parameters": [
{
"name": "name",
"in": "path",
"description": "Session name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "cols",
"in": "query",
"description": "Initial terminal width in columns (default `80`).",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"minimum": 0
}
},
{
"name": "rows",
"in": "query",
"description": "Initial terminal height in rows (default `24`).",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"minimum": 0
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"101": {
"description": "WebSocket upgrade"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"501": {
"description": "Vault or k8s not configured",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/sessions/{name}/logs": {
"get": {
"tags": [
"sessions"
],
"summary": "`GET /api/v1/sessions/{name}/logs` — stream CFS session pod logs via Server-Sent Events.",
"operationId": "get_session_logs",
"parameters": [
{
"name": "name",
"in": "path",
"description": "Session name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "timestamps",
"in": "query",
"description": "When true, prefix each log line with its timestamp.",
"required": false,
"schema": {
"type": "boolean"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "SSE log stream"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"501": {
"description": "Vault or k8s not configured",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/templates": {
"get": {
"tags": [
"templates"
],
"summary": "GET /templates — list BOS session templates with optional filters.",
"operationId": "get_templates",
"parameters": [
{
"name": "name",
"in": "query",
"description": "Exact template name.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "hsm_group",
"in": "query",
"description": "HSM group whose associated templates should be returned.",
"required": false,
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "limit",
"in": "query",
"description": "Cap on the number of templates returned (most recent first).",
"required": false,
"schema": {
"type": [
"integer",
"null"
],
"format": "int32",
"minimum": 0
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "List of session templates",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
},
"/templates/{name}/sessions": {
"post": {
"tags": [
"templates"
],
"summary": "`POST /api/v1/templates/{name}/sessions` — create a BOS session from a session template.",
"operationId": "post_template_session",
"parameters": [
{
"name": "name",
"in": "path",
"description": "Template name",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "X-Manta-Site",
"in": "header",
"description": "Name of the target cluster (matches a site configured in the server).",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PostTemplateSessionRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Dry run preview",
"content": {
"application/json": {
"schema": {}
}
}
},
"201": {
"description": "Session created",
"content": {
"application/json": {
"schema": {}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
]
}
}
},
"components": {
"schemas": {
"AddHwComponentRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/hardware-clusters/{target}/members`.\n\nMoves nodes matching `pattern` out of `parent_cluster` and into\nthe path-level target cluster. The reverse direction lives in\n[`DeleteHwComponentRequest`]; both operations are also expressible\nin unified form via [`ApplyHwConfigurationRequest`] with\n[`HwClusterMode::Pin`] vs [`HwClusterMode::Unpin`].",
"required": [
"parent_cluster",
"pattern"
],
"properties": {
"create_hsm_group": {
"type": "boolean",
"description": "Create the target HSM group if it does not already exist."
},
"dry_run": {
"type": "boolean",
"description": "When true, return the planned changes without modifying group\nmembership."
},
"parent_cluster": {
"type": "string",
"description": "Source HSM group that donates nodes matching `pattern`."
},
"pattern": {
"type": "string",
"description": "Hardware component pattern used to select which nodes to move."
}
}
},
"AddKernelParametersRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/kernel-parameters/add` (append mode).",
"required": [
"params"
],
"properties": {
"dry_run": {
"type": "boolean",
"description": "When true, return the computed changeset without applying it."
},
"hsm_group": {
"type": [
"string",
"null"
],
"description": "Target HSM group; all members are resolved to xnames."
},
"overwrite": {
"type": "boolean",
"description": "When true, overwrite parameters that already exist."
},
"params": {
"type": "string",
"description": "Space-separated kernel parameter `key=value` pairs to add."
},
"project_sbps": {
"type": "boolean",
"description": "Whether to project SBPS images (default `true`)."
},
"xnames_expression": {
"type": [
"string",
"null"
],
"description": "Hosts expression (xnames, NIDs, or hostlist notation); mutually\nexclusive with `hsm_group`."
}
}
},
"AddNodeRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/nodes`.\n\nPaired with [`super::responses::AddNodeResponse`] on success.\n\n# Wire shape\n\n```json\n{\n \"id\": \"x3000c0s1b0n0\",\n \"group\": \"alps\",\n \"enabled\": true,\n \"arch\": \"X86\"\n}\n```",
"required": [
"id",
"group"
],
"properties": {
"arch": {
"type": [
"string",
"null"
],
"description": "Optional architecture tag: `\"X86\"`, `\"ARM\"`, or `\"Other\"`."
},
"enabled": {
"type": "boolean",
"description": "Whether to register the node as enabled. Defaults to `false`\n(disabled) per serde's default for `bool`; the CLI's\n`manta add node` flips the polarity via `--disabled`."
},
"group": {
"type": "string",
"description": "Initial HSM group the node belongs to."
},
"id": {
"type": "string",
"description": "Physical location ID (xname) of the node, e.g. `x3000c0s1b0n0`."
}
}
},
"AddNodeResponse": {
"type": "object",
"description": "Response for `POST /api/v1/nodes` — echoes the registered xname.\n\nPaired with [`super::node::AddNodeRequest`].\n\n# Wire shape\n\n```json\n{ \"id\": \"x3000c0s1b0n0\" }\n```",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Physical location ID (xname) of the registered node."
}
}
},
"AddNodesToGroupRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/groups/{name}/members`.\n\nPaired with [`AddNodesToGroupResponse`] on success.",
"required": [
"hosts_expression"
],
"properties": {
"hosts_expression": {
"type": "string",
"description": "Hostlist expression (xnames, NIDs, or hostlist notation)\nidentifying the new member set for the group."
}
}
},
"AddNodesToGroupResponse": {
"type": "object",
"description": "Response body for `POST /api/v1/groups/{name}/members`.\n\nThe `removed` field name is retained for wire stability; its value\nis the final, sorted membership of the group after the update —\n**not** a list of removed nodes.\n\n`added` and `final_members` are both sorted alphabetically by xname.\n\n# Wire shape\n\n```json\n{\n \"added\": [\"x3000c0s1b0n2\", \"x3000c0s1b0n3\"],\n \"final_members\": [\"x3000c0s1b0n0\", \"x3000c0s1b0n1\", \"x3000c0s1b0n2\", \"x3000c0s1b0n3\"],\n \"removed\": [\"x3000c0s1b0n0\", \"x3000c0s1b0n1\", \"x3000c0s1b0n2\", \"x3000c0s1b0n3\"]\n}\n```",
"required": [
"added",
"final_members"
],
"properties": {
"added": {
"type": "array",
"items": {
"type": "string"
},
"description": "Xnames that were added to the group as part of this request,\nsorted alphabetically."
},
"final_members": {
"type": "array",
"items": {
"type": "string"
},
"description": "Final, sorted membership of the group after the update."
},
"removed": {
"type": "array",
"items": {
"type": "string"
},
"description": "Deprecated alias for [`Self::final_members`]. Carries the same\nvalue so existing clients reading `removed` keep working for one\nrelease; new clients should read `final_members`. Scheduled for\nremoval in the next major bump — at which point the\n`#[serde(alias = \"removed\")]` on `final_members` keeps inbound\ncompatibility for anyone POSTing back the old name."
}
}
},
"ApplyBootConfigRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/boot-config`.\n\nApplies a combined boot configuration (image + runtime config +\nkernel parameters) to the nodes named by `hosts_expression`. The\nfield is a hosts expression — xnames, NIDs, or hostlist notation;\nHSM group names are not accepted here (resolve them client-side\nfirst if needed).\n\nAt least one of `boot_image_id`, `boot_image_configuration`,\n`kernel_parameters`, or `runtime_configuration` should be set;\n`null` fields are left unchanged on the targeted nodes.\n\n# Wire shape\n\n```json\n{\n \"hosts_expression\": \"x3000c0s1b0n[0-3]\",\n \"boot_image_id\": \"0a1b2c3d-...\",\n \"boot_image_configuration\": null,\n \"kernel_parameters\": \"console=ttyS0 nosmt\",\n \"runtime_configuration\": \"cos-2.5\",\n \"dry_run\": false\n}\n```",
"required": [
"hosts_expression"
],
"properties": {
"boot_image_configuration": {
"type": [
"string",
"null"
],
"description": "CFS configuration name associated with the boot image; the\nserver resolves the most recent image built against this\nconfiguration when `boot_image_id` is absent."
},
"boot_image_id": {
"type": [
"string",
"null"
],
"description": "IMS image ID to set as the boot image. Mutually exclusive with\n`boot_image_configuration`: set one or the other, not both."
},
"dry_run": {
"type": "boolean",
"description": "When true, return the computed changeset without persisting it."
},
"hosts_expression": {
"type": "string",
"description": "Hosts expression (xnames, NIDs, or hostlist notation) naming\nthe target nodes."
},
"kernel_parameters": {
"type": [
"string",
"null"
],
"description": "Kernel command-line parameters to apply."
},
"runtime_configuration": {
"type": [
"string",
"null"
],
"description": "CFS configuration to assign as the runtime desired-config."
}
}
},
"ApplyHwConfigurationRequest": {
"type": "object",
"description": "Request body for\n`POST /api/v1/hardware-clusters/{target}/configuration`.",
"required": [
"parent_cluster",
"pattern"
],
"properties": {
"create_target_hsm_group": {
"type": "boolean",
"description": "Create the target HSM group if absent (default `true`)."
},
"delete_empty_parent_hsm_group": {
"type": "boolean",
"description": "Delete the parent HSM group if it becomes empty (default `true`)."
},
"dry_run": {
"type": "boolean",
"description": "When true, return the planned changes without modifying group\nmembership."
},
"mode": {
"$ref": "#/components/schemas/HwClusterMode",
"description": "Whether to pin nodes into the target cluster or unpin them back\nto the parent. Defaults to `Pin`."
},
"parent_cluster": {
"type": "string",
"description": "Source (parent) HSM group supplying nodes."
},
"pattern": {
"type": "string",
"description": "Hardware component pattern selecting which nodes to pin/unpin."
}
}
},
"ApplyKernelParametersRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/kernel-parameters/apply`.\n\nOne of `xnames_expression` or `hsm_group` must be set (not both).\nThe chosen [`KernelParamOp`] determines what `params` means:\nmerge-keys, replace-set, or remove-set.\n\n# Wire shape\n\n```json\n{\n \"xnames_expression\": \"x3000c0s1b0n[0-3]\",\n \"hsm_group\": null,\n \"operation\": \"add\",\n \"params\": \"console=ttyS0 nosmt\",\n \"overwrite\": false,\n \"project_sbps\": true,\n \"dry_run\": false\n}\n```",
"required": [
"operation",
"params"
],
"properties": {
"dry_run": {
"type": "boolean",
"description": "When true, return the computed changeset without applying it."
},
"hsm_group": {
"type": [
"string",
"null"
],
"description": "Target HSM group; all members are resolved to xnames."
},
"operation": {
"$ref": "#/components/schemas/KernelParamOp",
"description": "Which mutation to perform: add, apply (replace), or delete."
},
"overwrite": {
"type": "boolean",
"description": "Only relevant for the `Add` operation."
},
"params": {
"type": "string",
"description": "Space-separated kernel parameter `key=value` pairs."
},
"project_sbps": {
"type": "boolean",
"description": "Whether to project SBPS images (default `true`)."
},
"xnames_expression": {
"type": [
"string",
"null"
],
"description": "Hosts expression (xnames, NIDs, or hostlist notation); mutually\nexclusive with `hsm_group`."
}
}
},
"AuthTokenRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/auth/token`.\n\nPaired with [`AuthTokenResponse`] on success. The `/auth/*`\nsub-router is wrapped by `strip_body_for_logs`, so neither the\nrequest body nor the issued token appears in access logs.\n\n# Wire shape\n\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2\" }\n```",
"required": [
"username",
"password"
],
"properties": {
"password": {
"type": "string",
"description": "Keycloak password. Never logged by the server (the\n`/auth/*` sub-router is wrapped by `strip_body_for_logs`)."
},
"username": {
"type": "string",
"description": "Keycloak username submitted to the configured backend."
}
}
},
"AuthTokenResponse": {
"type": "object",
"description": "Response body for `POST /api/v1/auth/token`.\n\nReturned in exchange for a valid [`AuthTokenRequest`].\n\n# Wire shape\n\n```json\n{ \"token\": \"eyJhbGciOi...\" }\n```",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"description": "Bearer token issued by the backend (CSM or OpenCHAMI Keycloak).\nPass this as `Authorization: Bearer <token>` on every\nsubsequent request."
}
}
},
"BackendSummary": {
"type": "object",
"description": "One row of the backend-data summary, anchored on an IMS image.\n\nEvery IMS image visible to the caller produces exactly one row.\nThe row's `image_id` and `name` are always populated; the rest are\n`Option<String>` and are filled in only when the corresponding\nrelation resolves.\n\nSee also [`super::configuration_analysis::ConfigurationAnalysis`]\nfor the parallel configuration-centric projection.\n\n# Wire shape\n\n```json\n{\n \"image_id\": \"0a1b2c3d-...\",\n \"name\": \"compute-cos-2.5\",\n \"image_created\": \"2026-05-12T10:14:22Z\",\n \"configuration_name\": \"cos-2.5\",\n \"safe_to_delete\": false\n}\n```",
"required": [
"image_id",
"name",
"safe_to_delete"
],
"properties": {
"configuration_name": {
"type": [
"string",
"null"
],
"description": "CFS configuration the image was built with\n(`Image.configuration`)."
},
"image_created": {
"type": [
"string",
"null"
],
"description": "IMS image `created` timestamp (`Image.created`)."
},
"image_id": {
"type": "string",
"description": "IMS image id (`Image.id`). Row anchor."
},
"name": {
"type": "string",
"description": "IMS image name (`Image.name`)."
},
"safe_to_delete": {
"type": "boolean",
"description": "`true` if no BSS boot-parameter record references this image as\nits boot image. An image referenced by BSS is currently booting\n(or scheduled to boot) at least one node, so deleting it would\nbreak that node's next boot."
}
}
},
"BootParameters": {
"type": "object",
"properties": {
"cloud-init": {},
"hosts": {
"type": "array",
"items": {
"type": "string"
}
},
"initrd": {
"type": "string"
},
"kernel": {
"type": "string"
},
"macs": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"nids": {
"type": [
"array",
"null"
],
"items": {
"type": "integer",
"format": "int32",
"minimum": 0
}
},
"params": {
"type": "string"
}
}
},
"BosOperation": {
"type": "string",
"description": "BOS session operation to run against the template's node list.",
"enum": [
"boot",
"reboot",
"shutdown"
]
},
"CompletedResponse": {
"type": "object",
"description": "Response for endpoints that simply confirm a backup / restore /\nlong-running migrate operation finished. Emitted by\n`POST /api/v1/migrate/backup` and `POST /api/v1/migrate/restore`.\n\n# Wire shape\n\n```json\n{ \"completed\": true }\n```",
"required": [
"completed"
],
"properties": {
"completed": {
"type": "boolean",
"description": "Always `true` on success."
}
}
},
"ConfigurationAnalysis": {
"type": "object",
"description": "One row of the configuration-deletion-safety analysis.\n\nConfiguration-centric counterpart to\n[`super::analysis::BackendSummary`]; one entry per CFS\nconfiguration the caller can see.",
"required": [
"configuration",
"safe_to_delete"
],
"properties": {
"configuration": {
"description": "Full CFS configuration record as returned by CFS. `CfsConfigurationResponse`\nlives in `manta-backend-dispatcher` (third-party, no ToSchema), so the\nOpenAPI schema falls back to `serde_json::Value`."
},
"safe_to_delete": {
"type": "boolean",
"description": "`true` if no CFS component lists this configuration as its\n`desired_config`. The verdict is components-only; deletion may\nstill be unsafe if a BSS-referenced image was built from this\nconfiguration — that fuller check isn't surfaced on this wire\nshape."
}
}
},
"CreateEphemeralEnvRequest": {
"type": "object",
"description": "Request body for `POST /ephemeral-env`.",
"required": [
"image_id"
],
"properties": {
"image_id": {
"type": "string",
"description": "IMS image ID to boot the ephemeral environment from."
}
}
},
"CreateImageCfsSessionRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/sat-file/images/cfs-session`.\n\nCarries one entry from the SAT file's `images` section plus the\nCLI's accumulated `ref_lookup` and the ansible knobs the CFS\nsession needs.",
"required": [
"image"
],
"properties": {
"ansible_passthrough": {
"type": [
"string",
"null"
],
"description": "Extra arguments forwarded verbatim to `ansible-playbook`."
},
"ansible_verbosity": {
"type": [
"integer",
"null"
],
"format": "int32",
"description": "Ansible verbosity level (0–4) for the CFS session that builds\nthe image.",
"minimum": 0
},
"dry_run": {
"type": "boolean",
"description": "Validate without creating; the server returns a mocked complete\nsession with a `DRYRUN-<uuid>` result id."
},
"image": {
"description": "One SAT `images[]` entry as a structured value."
},
"ref_lookup": {
"type": "object",
"description": "`ref_name.or(name) -> image_id` map for previously-created\nimages. The backend uses it to resolve `base.image_ref` chains.",
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
}
}
}
},
"CreateSessionRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/sessions`.\n\nThe CLI submits this when the user runs `manta run session`; the\nserver deserialises it in `handlers::session::create_session`.\n`repo_names` and `repo_last_commit_ids` are parallel-indexed —\n`repo_last_commit_ids[i]` is the commit SHA for `repo_names[i]`.\nThe two vectors must therefore have the same length.\n\nPaired with [`super::responses::CreateSessionResponse`].",
"required": [
"repo_names",
"repo_last_commit_ids"
],
"properties": {
"ansible_limit": {
"type": [
"string",
"null"
],
"description": "Ansible `--limit` expression restricting which xnames are\ntargeted (the service-layer authz check rejects group names —\npre-resolve them client-side)."
},
"ansible_passthrough": {
"type": [
"string",
"null"
],
"description": "Extra arguments forwarded verbatim to `ansible-playbook`."
},
"ansible_verbosity": {
"type": [
"string",
"null"
],
"description": "Ansible verbosity level (e.g. `\"-v\"`, `\"-vvv\"`)."
},
"cfs_conf_sess_name": {
"type": [
"string",
"null"
],
"description": "Explicit name for the CFS session and configuration;\nauto-generated when absent."
},
"hsm_group": {
"type": [
"string",
"null"
],
"description": "Target HSM group name."
},
"playbook_yaml_file_name": {
"type": [
"string",
"null"
],
"description": "Ansible playbook filename inside the repository."
},
"repo_last_commit_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Git commit SHAs matching each entry in `repo_names`."
},
"repo_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Git repository names (parallel-indexed with\n`repo_last_commit_ids`)."
}
}
},
"CreateSessionResponse": {
"type": "object",
"description": "Response for `POST /api/v1/sessions` — names of the created CFS\nsession and its underlying configuration.\n\nPaired with [`super::session::CreateSessionRequest`]. When the\ncaller did not supply `cfs_conf_sess_name`, the server-generated\nname is echoed back here.",
"required": [
"session_name",
"configuration_name"
],
"properties": {
"configuration_name": {
"type": "string",
"description": "Name of the CFS configuration the session was attached to."
},
"session_name": {
"type": "string",
"description": "Name of the created CFS session."
}
}
},
"CreatedResponse": {
"type": "object",
"description": "Response for endpoints that simply confirm a write happened.\n\nEmitted by `POST /api/v1/redfish-endpoints`,\n`POST /api/v1/boot-parameters`, and `POST /api/v1/groups`.\n\n# Wire shape\n\n```json\n{ \"created\": true }\n```",
"required": [
"created"
],
"properties": {
"created": {
"type": "boolean",
"description": "Always `true` on success."
}
}
},
"DeleteBootParametersRequest": {
"type": "object",
"description": "Body for `DELETE /boot-parameters`.",
"required": [
"hosts"
],
"properties": {
"hosts": {
"type": "array",
"items": {
"type": "string"
},
"description": "Xnames whose BSS boot-parameter entries should be deleted."
}
}
},
"DeleteGroupMembersRequest": {
"type": "object",
"description": "Request body for `DELETE /api/v1/groups/{name}/members`.",
"required": [
"xnames_expression"
],
"properties": {
"dry_run": {
"type": "boolean",
"description": "When true, validate the request without modifying group\nmembership."
},
"xnames_expression": {
"type": "string",
"description": "Hosts expression (xnames, NIDs, or hostlist notation)\nidentifying nodes to remove."
}
}
},
"DeleteHwComponentRequest": {
"type": "object",
"description": "Request body for `DELETE /api/v1/hardware-clusters/{target}/members`.\n\nReverse of [`AddHwComponentRequest`]: moves nodes matching\n`pattern` out of the path-level target cluster and back to\n`parent_cluster`.",
"required": [
"parent_cluster",
"pattern"
],
"properties": {
"delete_hsm_group": {
"type": "boolean",
"description": "Delete the target HSM group if it becomes empty after the\noperation."
},
"dry_run": {
"type": "boolean",
"description": "When true, return the planned changes without modifying group\nmembership."
},
"parent_cluster": {
"type": "string",
"description": "Destination HSM group that receives nodes moved out of the\ntarget cluster."
},
"pattern": {
"type": "string",
"description": "Hardware component pattern used to select which nodes to move\nback."
}
}
},
"DeleteKernelParametersRequest": {
"type": "object",
"description": "Request body for `DELETE /api/v1/kernel-parameters`.",
"required": [
"params"
],
"properties": {
"dry_run": {
"type": "boolean",
"description": "When true, return the computed changeset without applying it."
},
"hsm_group": {
"type": [
"string",
"null"
],
"description": "Target HSM group; all members are resolved to xnames."
},
"params": {
"type": "string",
"description": "Space-separated parameter names (or `key=value` pairs) to\nremove."
},
"xnames_expression": {
"type": [
"string",
"null"
],
"description": "Hosts expression (xnames, NIDs, or hostlist notation); mutually\nexclusive with `hsm_group`."
}
}
},
"EphemeralEnvResponse": {
"type": "object",
"description": "Response for `POST /api/v1/ephemeral-env` — the freshly provisioned\nephemeral host.",
"required": [
"hostname"
],
"properties": {
"hostname": {
"type": "string",
"description": "Hostname of the ephemeral environment."
}
}
},
"ErrorResponse": {
"type": "object",
"description": "Standard JSON error body returned by all failed endpoints.",
"required": [
"error"
],
"properties": {
"error": {
"type": "string",
"description": "Human-readable explanation of the failure. Never includes\nstack traces, credentials, or internal type names."
}
}
},
"Group": {
"type": "object",
"required": [
"label"
],
"properties": {
"description": {
"type": [
"string",
"null"
]
},
"exclusiveGroup": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
},
"members": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/components/schemas/Member"
}
]
},
"tags": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
}
}
},
"HwClusterMode": {
"type": "string",
"description": "Whether the hw cluster operation moves nodes into the target (Pin) or\nreleases them back (Unpin).",
"enum": [
"pin",
"unpin"
]
},
"KernelParamOp": {
"type": "string",
"description": "Which kernel-parameter mutation to perform on\n`POST /api/v1/kernel-parameters/apply`.",
"enum": [
"add",
"apply",
"delete"
]
},
"Member": {
"type": "object",
"properties": {
"ids": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
}
}
},
"MigrateBackupRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/migrate/backup`.\n\nPaired with [`super::responses::CompletedResponse`] on success.",
"properties": {
"bos": {
"type": [
"string",
"null"
],
"description": "BOS session template name (or filter) to back up."
},
"destination": {
"type": [
"string",
"null"
],
"description": "Filesystem path where backup files will be written."
}
}
},
"MigrateNodesPairResult": {
"type": "object",
"description": "One migration pair's result; mirrors\n`manta_server::service::migrate::NodeMigrationResult` on the wire.\nEmbedded inside [`MigrateNodesResponse`] without importing the\nserver-side type into the shared crate.",
"required": [
"target_hsm_name",
"parent_hsm_name",
"target_members",
"parent_members"
],
"properties": {
"parent_hsm_name": {
"type": "string",
"description": "HSM group that the nodes were moved out of."
},
"parent_members": {
"type": "array",
"items": {
"type": "string"
},
"description": "Remaining member list of the parent group after migration."
},
"target_hsm_name": {
"type": "string",
"description": "HSM group that received the nodes."
},
"target_members": {
"type": "array",
"items": {
"type": "string"
},
"description": "Final member list of the target group after migration."
}
}
},
"MigrateNodesRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/migrate/nodes`.\n\nPaired with [`super::responses::MigrateNodesResponse`] on success.\n`target_hsm_names` and `parent_hsm_names` are length-matched: each\n`parent_hsm_names[i]` donates members to `target_hsm_names[i]`.\n\n# Wire shape\n\n```json\n{\n \"target_hsm_names\": [\"zinal\"],\n \"parent_hsm_names\": [\"alps\"],\n \"hosts_expression\": \"x3000c0s1b0n[0-3]\",\n \"dry_run\": false,\n \"create_hsm_group\": false\n}\n```",
"required": [
"target_hsm_names",
"parent_hsm_names",
"hosts_expression"
],
"properties": {
"create_hsm_group": {
"type": "boolean",
"description": "Create the target HSM group if it does not already exist."
},
"dry_run": {
"type": "boolean",
"description": "When true, validate the migration plan without modifying any\ngroup membership."
},
"hosts_expression": {
"type": "string",
"description": "Node-set expression (xnames, NIDs, or hostlist notation)\nselecting which nodes to migrate."
},
"parent_hsm_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source HSM group names the nodes currently belong to."
},
"target_hsm_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Destination HSM group names to move nodes into."
}
}
},
"MigrateNodesResponse": {
"type": "object",
"description": "Response for `POST /api/v1/migrate/nodes` — moved xnames plus a\nper-(target,parent) result list. Dry-run uses the same shape so the\nCLI consumes one type regardless of mode.\n\nPaired with [`super::migrate::MigrateNodesRequest`]. The `results`\narray runs in lockstep with the request's `target_hsm_names` /\n`parent_hsm_names` pairs.",
"required": [
"xnames",
"results"
],
"properties": {
"results": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MigrateNodesPairResult"
},
"description": "Per (target, parent) pair migration result."
},
"xnames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Xnames moved (or that would have been moved, in dry-run)."
}
}
},
"MigrateRestoreRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/migrate/restore`.\n\nPaired with [`super::responses::CompletedResponse`] on success.\nEvery `*_file` field is optional independently — supplying only\n`cfs_file` restores CFS configurations and leaves BOS, HSM, IMS,\nand image layers untouched.",
"properties": {
"bos_file": {
"type": [
"string",
"null"
],
"description": "Path to the BOS session template backup file."
},
"cfs_file": {
"type": [
"string",
"null"
],
"description": "Path to the CFS configuration backup file."
},
"hsm_file": {
"type": [
"string",
"null"
],
"description": "Path to the HSM group backup file."
},
"image_dir": {
"type": [
"string",
"null"
],
"description": "Directory containing the image layer tarballs."
},
"ims_file": {
"type": [
"string",
"null"
],
"description": "Path to the IMS image metadata backup file."
},
"overwrite": {
"type": "boolean",
"description": "When true, overwrite existing resources that conflict with the\nbackup."
}
}
},
"NodeDetails": {
"type": "object",
"description": "Per-node details returned by `GET /api/v1/nodes`.\n\nMirror of `csm_rs::node::types::NodeDetails` with identical fields\nand identical JSON wire format. No conversion impl is needed in\nthe server crate — the response is serialised straight from the\ncsm-rs type and the CLI deserialises it into this mirror.\n\nAll fields are wire-stringified (CSM serializes them that way);\ncallers parse them as needed for display or comparison. The empty\nstring is the conventional \"unset\" sentinel — see\n`cluster_status::compute_summary_status` for case-insensitive\nmatching on the status fields.\n\n# Wire shape\n\n```json\n{\n \"xname\": \"x3000c0s1b0n0\",\n \"nid\": \"nid001313\",\n \"hsm\": \"alps,zinal\",\n \"power_status\": \"On\",\n \"desired_configuration\": \"cos-2.5\",\n \"configuration_status\": \"configured\",\n \"enabled\": \"true\",\n \"error_count\": \"0\",\n \"boot_image_id\": \"0a1b2c3d-...\",\n \"boot_configuration\": \"cos-2.5\",\n \"kernel_params\": \"console=ttyS0 ...\"\n}\n```",
"required": [
"xname",
"nid",
"hsm",
"power_status",
"desired_configuration",
"configuration_status",
"enabled",
"error_count",
"boot_image_id",
"boot_configuration",
"kernel_params"
],
"properties": {
"boot_configuration": {
"type": "string",
"description": "CFS configuration linked to the boot image."
},
"boot_image_id": {
"type": "string",
"description": "IMS image ID currently set as the boot image."
},
"configuration_status": {
"type": "string",
"description": "CFS configuration status (`\"configured\"`, `\"pending\"`,\n`\"failed\"`, etc.)."
},
"desired_configuration": {
"type": "string",
"description": "CFS desired-configuration name targeting this node."
},
"enabled": {
"type": "string",
"description": "`\"true\"` or `\"false\"` — whether the node is enabled in the\nhardware state manager."
},
"error_count": {
"type": "string",
"description": "Stringified count of recent CFS failures."
},
"hsm": {
"type": "string",
"description": "Comma-separated HSM group names this node belongs to."
},
"kernel_params": {
"type": "string",
"description": "Kernel command-line parameters as last reported by BSS."
},
"nid": {
"type": "string",
"description": "Numeric node ID as a string, e.g. `\"nid001313\"`."
},
"power_status": {
"type": "string",
"description": "Current power state reported by PCS (`\"On\"`, `\"Off\"`, `\"Ready\"`,\netc.)."
},
"xname": {
"type": "string",
"description": "Physical location ID, e.g. `x3000c0s1b0n0`."
}
}
},
"PostSatConfigurationRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/sat-file/configurations`.\n\nCarries one entry from the SAT file's `configurations` section\nplus per-call flags. csm-rs owns the SAT schema; the CLI and server\njust shuttle the entry through as `serde_json::Value`.",
"required": [
"configuration"
],
"properties": {
"configuration": {
"description": "One SAT `configurations[]` entry as a structured value."
},
"dry_run": {
"type": "boolean",
"description": "Validate without creating; the response contains a mock\nconfiguration."
},
"overwrite": {
"type": "boolean",
"description": "Overwrite an existing CFS configuration of the same name."
}
}
},
"PostSatSessionTemplateRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/sat-file/session-templates`.\n\nCarries one entry from the SAT file's `session_templates` section\nplus the CLI's accumulated `ref_lookup` and per-call flags.",
"required": [
"session_template"
],
"properties": {
"create_bos_session": {
"type": "boolean",
"description": "After creating the template, create a BOS session from it so its\ntarget nodes boot via the new template (typically a reboot)."
},
"dry_run": {
"type": "boolean",
"description": "Validate without creating; the response contains a mock template,\nand if `create_bos_session` was set the response also contains a\nmock BOS session (no status, name prefixed with `dry-run-`) so the\nclient can preview the session that would have been created."
},
"ref_lookup": {
"type": "object",
"description": "`ref_name.or(name) -> image_id` map for previously-created\nimages; the backend uses it to resolve `image.image_ref`.",
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
}
},
"session_template": {
"description": "One SAT `session_templates[]` entry as a structured value."
}
}
},
"PostSatSessionTemplateResponse": {
"type": "object",
"description": "Response body for `POST /api/v1/sat-file/session-templates`.\n\n`session` is populated when `create_bos_session` was true. In a real\napply it carries the freshly-created BOS session; in a dry-run it\ncarries a mock with no status and a `dry-run-` name prefix.",
"required": [
"template"
],
"properties": {
"session": {
"description": "The BOS session created from the new template, if any."
},
"template": {
"description": "The created (or mock, in dry-run) BOS session template."
}
}
},
"PostTemplateSessionRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/templates/{name}/sessions`.\n\nCreates a BOS session from an existing session template (the\n`{name}` path segment).\n\n# Wire shape\n\n```json\n{\n \"operation\": \"reboot\",\n \"limit\": \"x3000c0s1b0n[0-3]\",\n \"session_name\": null,\n \"include_disabled\": false,\n \"dry_run\": false\n}\n```",
"required": [
"operation",
"limit"
],
"properties": {
"dry_run": {
"type": "boolean",
"description": "When true, validate the session parameters without creating a\nBOS session."
},
"include_disabled": {
"type": "boolean",
"description": "When true, include nodes marked as disabled."
},
"limit": {
"type": "string",
"description": "Ansible limit expression restricting which template nodes are\ntargeted."
},
"operation": {
"$ref": "#/components/schemas/BosOperation",
"description": "BOS operation to run (boot, reboot, or shutdown)."
},
"session_name": {
"type": [
"string",
"null"
],
"description": "Optional explicit name for the BOS session; auto-generated when\nabsent."
}
}
},
"PowerAction": {
"type": "string",
"description": "The power operation to apply to a list of xnames.",
"enum": [
"on",
"off",
"reset"
]
},
"PowerRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/power`.\n\nThe interpretation of `host_expression` depends on [`PowerTargetType`];\nthe action itself is one of [`PowerAction`]'s variants.\n\n# Wire shape\n\n```json\n{\n \"action\": \"on\",\n \"host_expression\": \"x3000c0s1b0n[0-3]\",\n \"target_type\": \"nodes\",\n \"force\": false\n}\n```",
"required": [
"action",
"host_expression",
"target_type"
],
"properties": {
"action": {
"$ref": "#/components/schemas/PowerAction",
"description": "Power operation to perform."
},
"force": {
"type": "boolean",
"description": "Pass `--force` to the underlying power operation (forceful\nshutdown/reset)."
},
"host_expression": {
"type": "string",
"description": "For `Nodes`: hosts expression (xnames, NIDs, or hostlist\nnotation). For `Cluster`: the HSM group name."
},
"target_type": {
"$ref": "#/components/schemas/PowerTargetType",
"description": "Whether `host_expression` is a node expression or a cluster\nname."
}
}
},
"PowerTargetType": {
"type": "string",
"description": "Whether the caller's `host_expression` is a hosts expression\n(xnames / NIDs / hostlist) or a single HSM group name whose\nmembers should be targeted.",
"enum": [
"nodes",
"cluster"
]
},
"StampImageFromSessionRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/sat-file/images/stamp`.",
"required": [
"cfs_session_name"
],
"properties": {
"cfs_session_name": {
"type": "string",
"description": "Name of the (already terminal-complete) CFS session whose result\nimage should be stamped with `manta.image_session.*` provenance."
}
}
},
"UpdateBootParametersParams": {
"type": "object",
"description": "Typed parameters for updating boot parameters.",
"required": [
"hosts",
"params",
"kernel",
"initrd"
],
"properties": {
"hosts": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target node xnames."
},
"initrd": {
"type": "string",
"description": "S3 path to the initrd image."
},
"kernel": {
"type": "string",
"description": "S3 path to the kernel image."
},
"macs": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "MAC addresses corresponding to `hosts` (optional alternate identifier)."
},
"nids": {
"type": [
"array",
"null"
],
"items": {
"type": "integer",
"format": "int32",
"minimum": 0
},
"description": "Node IDs corresponding to `hosts` (optional alternate identifier)."
},
"params": {
"type": "string",
"description": "Kernel command-line parameters string."
}
}
},
"UpdateRedfishEndpointParams": {
"type": "object",
"description": "Typed parameters for adding or updating a Redfish endpoint.\n\nShared request body for **both** `POST /redfish-endpoints` (add a\nnew endpoint) and `PUT /redfish-endpoints` (replace an existing\none by `id`). PUT is a full replacement — every field is written,\nso partial updates require reading the existing endpoint first.",
"required": [
"id",
"enabled",
"use_ssdp",
"mac_required",
"rediscover_on_update"
],
"properties": {
"domain": {
"type": [
"string",
"null"
],
"description": "Domain portion of the BMC FQDN."
},
"enabled": {
"type": "boolean",
"description": "Whether the endpoint is enabled for discovery."
},
"fqdn": {
"type": [
"string",
"null"
],
"description": "Full FQDN; overrides hostname+domain when set."
},
"hostname": {
"type": [
"string",
"null"
],
"description": "Hostname portion of the BMC FQDN."
},
"id": {
"type": "string",
"description": "Xname identifying the BMC (e.g. `x3000c0s1b0`)."
},
"ip_address": {
"type": [
"string",
"null"
],
"description": "BMC IP address (IPv4 or IPv6)."
},
"mac_addr": {
"type": [
"string",
"null"
],
"description": "BMC MAC address (colon-separated)."
},
"mac_required": {
"type": "boolean",
"description": "Whether a MAC address is required for geolocation."
},
"name": {
"type": [
"string",
"null"
],
"description": "Optional human-readable name."
},
"password": {
"type": [
"string",
"null"
],
"description": "BMC password for Redfish authentication."
},
"rediscover_on_update": {
"type": "boolean",
"description": "Trigger a rediscovery pass when the endpoint is updated."
},
"template_id": {
"type": [
"string",
"null"
],
"description": "ID of a discovery template to apply."
},
"use_ssdp": {
"type": "boolean",
"description": "Use SSDP for automatic endpoint discovery."
},
"user": {
"type": [
"string",
"null"
],
"description": "BMC username for Redfish authentication."
}
}
},
"ValidateTokenRequest": {
"type": "object",
"description": "Request body for `POST /api/v1/auth/validate`.\n\nUsed to check a previously-issued [`AuthTokenResponse::token`]\nbefore relying on it. The server returns `200 OK` for a valid\ntoken and `401` otherwise — there is no dedicated response body.",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"description": "Bearer token to validate against the backend."
}
}
}
},
"securitySchemes": {
"bearerAuth": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT"
}
}
}
}