Appendix B. Schema Index
Every schema referenced anywhere in this guide, alphabetically, with a one-line description and the fields of any object schema. Enum schemas (such as VolumeLayout or EfsaMode) show their allowed values instead of a field table. Field tables include an Example column drawn from the specification’s own sample values where the field carries one, and a schema carrying a whole-object example (such as AboutResponse) shows it as a JSON block after its field table. Request and response bodies in Chapters 3 through 14 already expand the schema they use directly, examples included; this appendix is for looking up a schema named only in passing, such as a nested field’s type.
Schema entries below have been deliberately left out of the table of contents. Use the index table here or the in-page search to jump to an entry.
AboutResponse
About response exposing service identity and version.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
name |
string | yes | n/a | PanAPI |
Service name |
panfs_version |
string, nullable | no | null |
freebsd_142_amd64/release 2026.18.0-pioneer_swift.1885669 |
PanFS realm software version read from the local filesystem; null when unavailable |
version |
string | yes | n/a | 1.2.3 |
Service version, derived from the package metadata at build time |
Action
RBAC actions that can be performed on resources.
Allowed values: list, view, create, update, delete, action, read-s3-secret, rotate-s3-secret, switch, finalize-delete
AlertEvent
One alert vmalert is currently firing, projected from an ALERTS series.
The server-shaped payload for both the alerts snapshot (GET /observability/alerts) and the added / resolved SSE deltas.
Which fields carry a value depends on the rule that fired: only alert_rule, message, severity, alert_group and source come from every rule. There is no timestamp - an alert states that a condition is true now.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action_message |
string | no | (empty string) | Recommended action (“User Action”); empty when none. | |
alert_code |
string | no | (empty string) | PanFS alert code, shown as #CODE in the UI. Empty on non-PanFS rules. |
|
alert_group |
string | no | (empty string) | Rule group, e.g. panfs.alerts, panfs.processes. |
|
alert_name |
string | no | (empty string) | PanFS event constant, e.g. PAN_MGMT_EV_BRICK_NIC6_NOT_ACTIVE. |
|
alert_rule |
string | yes | n/a | vmalert rule that fired, e.g. PanFSAlertActive, ProcessDown. |
|
category |
string | no | (empty string) | Condition category, e.g. hardware, software. |
|
id |
string | yes | n/a | Stable alert id (alert_rule\|node_name\|message). |
|
ip_address |
string | no | (empty string) | That node’s management IP address. | |
is_manually_clearable |
boolean | no | false |
Whether the alert can be cleared by a user. | |
kind |
string | no | (empty string) | Condition kind, e.g. state. |
|
message |
string | yes | n/a | Human-readable alert message. | |
node_dataserial |
string | no | (empty string) | That node’s data serial, for linking to its detail page. | |
node_name |
string | no | (empty string) | Name of the node the alert is about; empty on realm-wide alerts. | |
node_type |
string | no | (empty string) | Type of that node (e.g. vpod, vdp, director_l). | |
process_name |
string | no | (empty string) | Process the alert is about (ProcessDown only). |
|
severity |
one of: error, warning, info |
yes | n/a | Normalized severity level. | |
source |
string | no | (empty string) | Signal source, e.g. panfs. |
|
tenant_id |
string | no | (empty string) | Tenant the alert is about; the platform tenant on a realm-wide condition. Attribution only - it does not scope who may read the alert. |
ApiTokenCreateRequest
Request to issue a long-lived API token for the caller.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
description |
string, nullable | no | null |
What this token is for. Optional; name remains the handle an operator identifies it by. |
|
expires_in_days |
integer | yes | n/a | 30, 90, 180, 365 |
Lifetime in days. Required, and must name one of the offered values (30, 90, 180, 365), so a long lifetime is always a deliberate choice. |
name |
string | yes | n/a | Name for this token, unique among the caller’s usable tokens. An operator identifies a token by it. A revoked or expired token releases its name, so a rotated credential can keep the name it had. |
Example
{
"description" : "Nightly backup runner",
"expires_in_days" : 90,
"name" : "nightly-backup@ci-runner-04"
}ApiTokenCreatedResponse
The issuance response - the only one that ever contains the secret.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
created_at |
string (date-time) | yes | n/a | When the secret was created. Never changes. | |
created_by |
Principal object |
yes | n/a | Who issued the token. | |
description |
string, nullable | no | null |
What this token is for, if a description was given. | |
expires_at |
string (date-time) | yes | n/a | Absolute expiry. | |
id |
string | yes | n/a | Public token identifier. Appears in audit events; not a secret. | |
name |
string | yes | n/a | The handle given at issuance, unique among the owner’s usable tokens. | |
revoked_at |
string (date-time), nullable | no | null |
When the token was revoked, if it was. The only lifecycle fact the record stores. | |
revoked_by |
Principal object, nullable |
no | null |
Who revoked the token, if it was. | |
roles |
array of string, nullable | no | null |
The role ceiling held in the record: the owner’s own roles as at issuance. Not chosen - a token carries what its owner held, and never more than they hold now. Null for a service account key, which carries no ceiling: it resolves whatever the account holds at the time of each request. | |
state |
ApiTokenState (active, disabled) |
yes | n/a | Whether the token still authenticates. Computed per response, never stored. | |
state_reason |
ApiTokenStateReason (expired, revoked), nullable |
no | null |
Why the token is disabled. Null while it is active. Revocation outranks expiry. | |
token |
string | yes | n/a | vdt1_6XuU1pyDS0abcDEF12345w_9fK3mZq7Xw2Lb1cD_hT8n...7bQ2xM |
The token. Returned once and never retrievable again; a lost token must be replaced. |
warning |
string | no | Store this token now. It cannot be retrieved again. |
Reminder that the secret is shown exactly once. |
ApiTokenListResponse
The caller’s own tokens.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
tokens |
array of ApiTokenResponse object |
yes | n/a | Token metadata, newest first. | |
total |
integer | yes | n/a | Number of tokens returned. |
ApiTokenResponse
A token’s metadata. Carries neither the secret nor its digest.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
created_at |
string (date-time) | yes | n/a | When the secret was created. Never changes. | |
created_by |
Principal object |
yes | n/a | Who issued the token. | |
description |
string, nullable | no | null |
What this token is for, if a description was given. | |
expires_at |
string (date-time) | yes | n/a | Absolute expiry. | |
id |
string | yes | n/a | Public token identifier. Appears in audit events; not a secret. | |
name |
string | yes | n/a | The handle given at issuance, unique among the owner’s usable tokens. | |
revoked_at |
string (date-time), nullable | no | null |
When the token was revoked, if it was. The only lifecycle fact the record stores. | |
revoked_by |
Principal object, nullable |
no | null |
Who revoked the token, if it was. | |
roles |
array of string, nullable | no | null |
The role ceiling held in the record: the owner’s own roles as at issuance. Not chosen - a token carries what its owner held, and never more than they hold now. Null for a service account key, which carries no ceiling: it resolves whatever the account holds at the time of each request. | |
state |
ApiTokenState (active, disabled) |
yes | n/a | Whether the token still authenticates. Computed per response, never stored. | |
state_reason |
ApiTokenStateReason (expired, revoked), nullable |
no | null |
Why the token is disabled. Null while it is active. Revocation outranks expiry. |
ApiTokenState
Whether a token still authenticates. Derived per response from the record’s own dates.
Allowed values: active, disabled
ApiTokenStateReason
Why a disabled token stopped authenticating.
Allowed values: expired, revoked
ArchivedTenantSchema
A deleted tenant, as the platform archive kept it.
Its own entity, not a tenant with fields missing: nothing here can be acted on, and the tenant it describes exists in neither the storage fabric nor the configuration store. display_name and email are the values it was deleted with - the archive is the only remaining copy - while created_at and updated_at are the RM timestamps as they stood at that moment.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
created_at |
string (date-time) | yes | n/a | 2026-01-10T08:00:00Z |
Tenant creation timestamp. |
deleted_at |
string (date-time) | yes | n/a | 2026-04-02T11:20:00Z |
When the tenant was deleted. |
description |
string | yes | n/a | Decommissioned engineering tenant |
Free-form description the tenant held when it was deleted. |
display_name |
string, nullable | no | null |
Engineering (retired) |
Human-readable name the tenant held when it was deleted. Null when its configuration detail was already gone at that point, so the name was never captured. |
email |
string, nullable | no | null |
eng-owner@vdura.example.com |
Contact email the tenant held when it was deleted. Null when its configuration detail was already gone at that point. |
id |
string (uuid) | yes | n/a | 3f2b1c0d-5e4a-4b8c-9d7e-6a5b4c3d2e1f |
Identifier (UUID) of the deleted tenant. |
name |
string | yes | n/a | oldeng |
Name the tenant held when it was deleted. Free for reuse by a new tenant. |
status |
TenantStatus (pending, configuring, active, archived) |
no | archived |
archived |
Always archived, so a client merging this list with the live one can tell them apart. |
updated_at |
string (date-time) | yes | n/a | 2026-04-02T11:15:00Z |
Tenant last-modification timestamp, as it stood when the tenant was deleted. |
Example
{
"created_at" : "2026-01-10T08:00:00Z",
"deleted_at" : "2026-04-02T11:20:00Z",
"description" : "Decommissioned engineering tenant",
"display_name" : "Engineering (retired)",
"email" : "eng-owner@vdura.example.com",
"id" : "3f2b1c0d-5e4a-4b8c-9d7e-6a5b4c3d2e1f",
"name" : "oldeng",
"status" : "archived",
"updated_at" : "2026-04-02T11:15:00Z"
}Attachment
One host’s binding to one subnet, as reads and creates return it.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
hostname |
string | no | (empty string) | Host name as supplied at create. Informational. | |
id |
string (uuid) | yes | n/a | Unique identifier of the attachment. | |
joined_at |
string (date-time) | yes | n/a | First attach time (UTC). | |
mtu |
integer | yes | n/a | The MTU the host sets on its tenant interface, which is the MTU the realm nodes run the subnet at: the subnet’s declared MTU, or the realm’s primary network MTU less the encapsulation overhead when the subnet declares 0. Never 0. | |
overlay_ip |
string | yes | n/a | The host’s address on the tenant network. | |
overlay_prefix |
integer | yes | n/a | CIDR prefix length of the subnet, which the host applies to its own address. | |
segment_id |
integer | yes | n/a | The subnet VLAN ID under one segment type and its VNI under the other. 0 means unassigned. | |
segment_type |
SubnetSegmentType (none, vlan, vxlan) |
yes | n/a | Kind of network segment the subnet is placed on, as the realm has it configured. | |
subnet_id |
string (uuid) | yes | n/a | UUID of the subnet the host is attached to. | |
tenant_id |
string (uuid) | yes | n/a | UUID of the tenant owning the subnet. | |
tunnel |
AttachmentTunnel object, nullable |
no | null |
Tunnel recipe, present only when the segment is tunnelled and null otherwise. | |
underlay_ip |
string | yes | n/a | 10.128.9.0 |
The host’s address on the realm underlay. Identifies the attachment inside its subnet, and on a tunnelled segment it is the endpoint the realm sends the host traffic to. |
Example
{
"hostname" : "client-0",
"id" : "8f14e45f-ceea-467a-9575-5c4bcbdcd2f1",
"joined_at" : "2026-08-28T12:00:00Z",
"mtu" : 1450,
"overlay_ip" : "192.168.50.100",
"overlay_prefix" : 24,
"segment_id" : 4257216,
"segment_type" : "vxlan",
"subnet_id" : "36a8995f-026b-47e1-88bd-7fb9e7239995",
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"tunnel" : {
"mac" : "92:b2:99:59:f3:fa",
"udp_port" : 4789,
"vteps" : [
"10.128.1.0",
"10.128.1.1",
"10.128.1.2"
]
},
"underlay_ip" : "10.128.9.0"
}AttachmentCreateRequest
Request body for attaching one host to a subnet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
hostname |
string | no | (empty string) | client-0 |
Informational host name, carried for the operator and never interpreted. |
overlay_ip |
string, nullable | no | null |
192.168.50.100 |
Requested address on the tenant network. Must sit inside the subnet, outside the realm node pool and be unallocated. Omit to let the backend allocate one. Applied on first attach only, so a repeated create never moves a host. |
underlay_ip |
string | yes | n/a | 10.128.9.0 |
The host’s address on the realm underlay. Identifies the attachment inside its subnet, and on a tunnelled segment it is the endpoint the realm sends the host traffic to. |
Example
{
"hostname" : "client-0",
"overlay_ip" : "192.168.50.100",
"underlay_ip" : "10.128.9.0"
}AttachmentListResponse
A collection of attachments with a total count.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
attachments |
array of Attachment object |
no | n/a | Array of attachment objects. Empty array if none are found. | |
total |
integer | yes | n/a | 0, 1, 12 |
Total count of attachments returned. |
Example
{
"attachments" : [
{
"hostname" : "client-0",
"id" : "8f14e45f-ceea-467a-9575-5c4bcbdcd2f1",
"joined_at" : "2026-08-28T12:00:00Z",
"mtu" : 1450,
"overlay_ip" : "192.168.50.100",
"overlay_prefix" : 24,
"segment_id" : 4257216,
"segment_type" : "vxlan",
"subnet_id" : "36a8995f-026b-47e1-88bd-7fb9e7239995",
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"tunnel" : {
"mac" : "92:b2:99:59:f3:fa",
"udp_port" : 4789,
"vteps" : [
"10.128.1.0",
"10.128.1.1",
"10.128.1.2"
]
},
"underlay_ip" : "10.128.9.0"
}
],
"total" : 1
}AttachmentTunnel
The tunnel recipe, present only on a tunnelled segment.
A VLAN fabric forwards, learns and floods on its own, so a subnet on it produces no tunnel: no link-layer address is assigned, no encapsulation port applies and no flood list exists.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
mac |
string | yes | n/a | 92:b2:99:59:f3:fa |
Link-layer address assigned by the backend, derived from the subnet and the host so that every realm node computes the same value without the host publishing it. The host must set it on its interface, because the realm programs a static entry for it. |
udp_port |
integer | yes | n/a | 4789 |
UDP port carrying the encapsulation. |
vteps |
array of string | no | n/a | The realm nodes’ underlay addresses, which are the host’s flood list. Realm nodes only: another attached host is deliberately absent. |
AuditDiagnostics
Failure diagnostics for one audit record, parsed from the correlated pan-api ERROR line.
Attached to the single-record get (GET /observability/audit/{request_id}) response, never to the list. Every structured field is empty when its source is absent - parsed, never guessed. log_lines is returned to platform callers only; tenant callers always receive it empty.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
code |
string | no | (empty string) | Error code token parsed from the error line, e.g. 11411. |
|
log_lines |
array of string | no | n/a | Correlated pan-api log lines, ascending time. Always empty for a non-platform caller. | |
message |
string | no | (empty string) | Human-readable message parsed from the error line. | |
subsystem |
string | no | (empty string) | Subsystem token parsed from the error line, e.g. rmm. |
|
summary |
string | no | (empty string) | Error classification, e.g. RpcUnexpected subsystem=rmm code=11411. |
|
symbol |
string | no | (empty string) | Error symbol token parsed from the error line, e.g. PANFS_11411. |
AuditRecord
One audit record, projected from the API’s own audit-trail log line.
The payload for the audit snapshot (GET /observability/audit).
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
string | no | (empty string) | Action performed on that resource, e.g. create. |
|
auth_token_id |
string | no | (empty string) | Id of the API token that authenticated the request; empty for a session. | |
client_ip |
string | no | (empty string) | Client IP address of the request. | |
duration_ms |
number | no | 0 |
Request duration in milliseconds. | |
id |
string | yes | n/a | The record’s own identifier, which is its request_id. |
|
method |
string | yes | n/a | HTTP method of the audited request. | |
principal_id |
string | no | (empty string) | Who acted, as <tenant id>/<principal id>. Under a tenant switch this is the person who switched, in their own tenant. Empty when the request was not authenticated. |
|
principal_name |
string | no | (empty string) | <tenant name>/<name>, or the bare name when the tenant name was not known. |
|
principal_type |
string | no | (empty string) | user | service-account. |
|
query |
string | no | (empty string) | Query string of the audited request. | |
reason |
any, nullable | no | null |
Reason for a denied or failed result, if recorded. | |
request_body |
any, nullable | no | null |
Request body, secret-redacted at write time. | |
request_id |
string | yes | n/a | Audit request id; the identity used for deduplication. | |
resource |
string | no | (empty string) | Resource the request acted on, e.g. volumes. |
|
result |
string | yes | n/a | Outcome of the request: success | denied | failed. |
|
severity |
string | yes | n/a | Audit-significance severity: INFO | WARNING. |
|
status_code |
integer, nullable | no | null |
HTTP response status code. | |
target_id |
string | no | (empty string) | Id of the specific instance acted on, if any. | |
tenant_id |
string | no | (empty string) | The tenant the credential acts in: the caller’s own, or under a tenant switch the tenant switched into. It differs from the tenant half of principal_id only under a switch. |
|
time |
string | yes | n/a | When the request was audited (RFC 3339, from VictoriaLogs _time). |
|
url |
string | yes | n/a | URL path of the audited request. | |
user_agent |
string | no | (empty string) | Client User-Agent header of the request. |
AuditRecordDetail
The single-record get’s response (GET /observability/audit/{request_id}).
Shared fields agree field-for-field with the list’s AuditRecord, which stays unchanged.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
string | no | (empty string) | Action performed on that resource, e.g. create. |
|
auth_token_id |
string | no | (empty string) | Id of the API token that authenticated the request; empty for a session. | |
client_ip |
string | no | (empty string) | Client IP address of the request. | |
diagnostics |
AuditDiagnostics object |
no | n/a | Correlated pan-api log detail for this request. | |
duration_ms |
number | no | 0 |
Request duration in milliseconds. | |
id |
string | yes | n/a | The record’s own identifier, which is its request_id. |
|
method |
string | yes | n/a | HTTP method of the audited request. | |
principal_id |
string | no | (empty string) | Who acted, as <tenant id>/<principal id>. Under a tenant switch this is the person who switched, in their own tenant. Empty when the request was not authenticated. |
|
principal_name |
string | no | (empty string) | <tenant name>/<name>, or the bare name when the tenant name was not known. |
|
principal_type |
string | no | (empty string) | user | service-account. |
|
query |
string | no | (empty string) | Query string of the audited request. | |
reason |
any, nullable | no | null |
Reason for a denied or failed result, if recorded. | |
request_body |
any, nullable | no | null |
Request body, secret-redacted at write time. | |
request_id |
string | yes | n/a | Audit request id; the identity used for deduplication. | |
resource |
string | no | (empty string) | Resource the request acted on, e.g. volumes. |
|
result |
string | yes | n/a | Outcome of the request: success | denied | failed. |
|
severity |
string | yes | n/a | Audit-significance severity: INFO | WARNING. |
|
status_code |
integer, nullable | no | null |
HTTP response status code. | |
target_id |
string | no | (empty string) | Id of the specific instance acted on, if any. | |
tenant_id |
string | no | (empty string) | The tenant the credential acts in: the caller’s own, or under a tenant switch the tenant switched into. It differs from the tenant half of principal_id only under a switch. |
|
time |
string | yes | n/a | When the request was audited (RFC 3339, from VictoriaLogs _time). |
|
url |
string | yes | n/a | URL path of the audited request. | |
user_agent |
string | no | (empty string) | Client User-Agent header of the request. |
Body_refresh_api_v1_auth_refresh_post
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
refresh_token |
string | yes | n/a |
ChangePasswordRequest
Self-service change-password payload. Carries no user/tenant id - the caller comes from the token.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
current_password |
string (password) | yes | n/a | The caller’s current password, verified server-side. | |
new_password |
string (password) | yes | n/a | New password. Must contain at least 8 characters with an upper-case letter, a lower-case letter, a digit, and a special character, and must not exceed 72 bytes. |
Example
{
"current_password" : "Curr3nt!pw",
"new_password" : "N3w!password"
}DelegatedTokenResponse
Assumed-tenant token issued by the tenant-switch endpoint. Deliberately carries no refresh token.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_token |
string | yes | n/a | Short-lived JWT scoped to the target tenant. | |
expires_in |
integer | yes | n/a | 3600 |
Granted token lifetime in seconds. |
tenant_id |
string (uuid) | yes | n/a | Target tenant the token acts in (tid claim). |
|
token_type |
literal bearer |
no | bearer |
DirectorEntry
One realm director’s address on the subnet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
dataserial |
string | yes | n/a | SN-D01 |
The director’s serial, which is how the realm’s own tooling names the node. |
ip |
string | yes | n/a | 10.20.0.11 |
The director’s address on this tenant subnet, which a client mounts to. |
repset |
boolean | yes | n/a | True when the node carries a replica of the realm database. These are the realm managers a client bootstraps against, so rmlist is built from them. | |
status |
NodeStatus (unknown, new, secure_erase, fsck, booting, shutdown, online, offline, mia_timer, dead, mia_notimer, lowbattery, clocksync, not_ready, network_err, not_reconciled, config_err) |
yes | n/a | Operational state of the node, as the realm manager reports it, carried for the operator to read. An address for a node that is down is inert and starts working the moment that node returns, so it stays in the list. |
Example
{
"dataserial" : "SN-D01",
"ip" : "10.20.0.11",
"repset" : true,
"status" : "online"
}EfsaMode
Extended File System Availability (EFSA) mode.
Mirrors CLI EFSA Mode column and volume list options.
Modes: - retry: clients block and retry I/O until storage recovers (default) - file-unavailable: I/O requests fail with errors when FT is exceeded - default: apply system default EFSA setting
Allowed values: retry, file-unavailable, default
FsUser
A PanFS user as published.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
gid |
integer | yes | n/a | 65534 |
POSIX group id. Always concrete. |
id |
string (uuid) | yes | n/a | b7c1f0e2-3a4d-4c5e-8f90-1a2b3c4d5e6f |
PanFS user identifier (UUID). |
name |
string | yes | n/a | alice |
Unique handle within the tenant. A POSIX short name by convention. |
s3 |
FsUserS3View object, nullable |
no | null |
S3 access, or null if the user has none. | |
uid |
integer | yes | n/a | 65534 |
POSIX user id. Always concrete. |
Example
{
"gid" : 65534,
"id" : "b7c1f0e2-3a4d-4c5e-8f90-1a2b3c4d5e6f",
"name" : "alice",
"s3" : {
"access_key" : "alice",
"profile" : "user"
},
"uid" : 65534
}FsUserCreateRequest
Request payload for creating a PanFS user.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_key |
string, nullable | no | null |
S3 access key. Defaults to name, which is why both carry the same charset rule. | |
gid |
integer, nullable | no | null |
POSIX group id. Same defaulting and bounds as uid. | |
name |
string | yes | n/a | Unique handle within the tenant. | |
profile |
S3Profile (disabled, user, privileged) |
no | user |
S3 access profile. | |
uid |
integer, nullable | no | null |
POSIX user id. Omit to take the tenant’s configured default, or nobody (65534) when it has none or when that default is not a usable id, 0 included. The resolved value is written onto the record, so a later change to the tenant default does not move this identity. 0 is not accepted: it would name root. Nor is anything above 4294967294, the last id a 32-bit uid_t can hold. |
Example
{
"gid" : 1000,
"name" : "alice",
"uid" : 1000
}FsUserListResponse
Envelope for a PanFS user listing.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
fs_users |
array of FsUser object |
yes | n/a | ||
total |
integer | yes | n/a | How many users the listing carries. |
FsUserPatchRequest
Request payload for updating a PanFS user. The secret is not among the fields.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_key |
string, nullable | no | null |
Updated S3 access key. | |
gid |
integer, nullable | no | null |
Updated POSIX group id. | |
profile |
S3Profile (disabled, user, privileged), nullable |
no | null |
Updated S3 access profile. | |
uid |
integer, nullable | no | null |
Updated POSIX user id. |
FsUserResponse
Envelope for a single PanFS user.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
fs_user |
FsUser object |
yes | n/a | A PanFS user as published. |
FsUserS3View
The S3 half of a PanFS user, as published. No secret.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_key |
string | yes | n/a | S3 access key. The handle the gateway resolves a request by. | |
profile |
S3Profile (disabled, user, privileged) |
yes | n/a | S3 access profile. | |
secret_rotated_at |
string (date-time), nullable | no | null |
When the S3 secret was last rotated, or null if it never has been. |
FsUserSecretResponse
The one place an S3 secret reaches a caller.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_key |
string | yes | n/a | The access key the secret belongs to. | |
secret_key |
string | yes | n/a | The S3 secret key. |
Example
{
"access_key" : "alice",
"secret_key" : "..."
}GetS3ConfigResponse
Response wrapper for S3 config retrieval.
Returned on GET /api/v1/tenants/{tenant_id}/s3.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
s3_config |
S3ConfigSchema object |
yes | n/a | Tenant S3 gateway configuration. |
Example
{
"s3_config" : {
"default_dir_mode" : "755",
"default_group" : "gid:65534",
"default_obj_mode" : "644",
"default_owner" : "uid:65534",
"default_prefix" : "/vol1/t1",
"enabled" : true,
"tls" : {}
}
}GetTenantResponse
Detailed view of a single tenant.
Returned on GET /api/v1/tenants/{tenant_id}.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
tenant |
Tenant object |
yes | n/a | Tenant entity with all available details. |
GetTenantStorageSetResponse
Detailed view of a single tenant storageset assignment.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
storageset |
StorageSetAssignment object |
yes | n/a | Storageset assignment (id + quota + name). |
Example
{
"storageset" : {
"quota_bytes" : 2199023255552,
"storageset_id" : 1,
"storageset_name" : "Set 1"
}
}GetUserResponse
Detailed view of a single Tenant User.
Returned on GET /tenants/{tenant_id}/users/{user_id}.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
user |
User object |
yes | n/a | Tenant User entity with all available details. |
Example
{
"user" : {
"auth_settings" : {
"auth_mode" : "local"
},
"created_at" : "2026-01-01T00:00:00Z",
"display_name" : "Alice Anderson",
"email" : "alice@fintech.example.com",
"id" : "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"updated_at" : "2026-01-01T00:00:00Z",
"username" : "alice"
}
}HTTPValidationError
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
detail |
array of ValidationError object |
no | n/a |
Hardware
A single hardware model from the catalog.
Declared attributes are typed for documentation; any further catalog fields are preserved as-is. Only id is guaranteed to be present.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
allow_lacp_link_agg |
integer, nullable | no | null |
Whether LACP link aggregation is allowed. | |
allow_static_link_agg |
integer, nullable | no | null |
Whether static link aggregation is allowed. | |
allow_upgrade |
integer, nullable | no | null |
Whether upgrade is allowed (0 or 1). | |
arch |
integer, nullable | no | null |
64 |
CPU architecture width. |
capacity_gb |
integer, nullable | no | null |
Storage capacity in GB. | |
codename |
string, nullable | no | null |
Internal codename(s). | |
compatibility_type |
string, nullable | no | null |
bravo |
Compatibility line. |
component_type |
string, nullable | no | null |
node, enclosure |
Component type. |
cpu |
string, nullable | no | null |
CPU description. | |
data_sector_size |
integer, nullable | no | null |
Drive data sector size in bytes. | |
datastores |
array of any, nullable | no | null |
Datastore definitions. | |
deny_downgrade_to |
string, nullable | no | null |
Version this model must not be downgraded to. | |
drives |
object, nullable | no | null |
Drive definitions keyed by drive number. | |
generation |
string, nullable | no | null |
100 |
Hardware generation. |
has_bladeset_affinity |
boolean, nullable | no | null |
Whether the model has bladeset affinity. | |
hdinfo |
string, nullable | no | null |
(1) 512GB SSD |
Human-readable drive summary. |
id |
string | yes | n/a | 301002001 |
Catalog identifier of the hardware model. |
intent_log |
object, nullable | no | null |
Intent log configuration. | |
introduced |
string, nullable | no | null |
7.0.0 |
First version to support this model. |
loops |
object, nullable | no | null |
Loop device definitions. | |
manufacturer |
string, nullable | no | null |
Hardware manufacturer. | |
memory |
string, nullable | no | null |
96GB |
Amount of memory. |
metadatastores |
array of any, nullable | no | null |
Metadata store definitions. | |
name |
string, nullable | no | null |
ASD-1-100-96-80 |
Model name (SKU). |
network |
string, nullable | no | null |
2x200GbE |
Network interface summary. |
node_osd_filesystem_version |
integer, nullable | no | null |
Node OSD filesystem version. | |
node_role_ids |
array of integer, nullable | no | null |
Node role identifiers. | |
nvdimm_namespaces |
object, nullable | no | null |
NVDIMM namespace definitions. | |
osd_filesystem_version |
integer, nullable | no | null |
OSD filesystem version. | |
platform |
string, nullable | no | null |
freebsd_142_amd64 |
OS/platform identifier. |
powerdraw |
integer, nullable | no | null |
400 |
Power draw in watts. |
product_name |
string, nullable | no | null |
Product name (product type plus generation). | |
product_type |
string, nullable | no | null |
Product type (name without generation). | |
role |
string, nullable | no | null |
director |
Software role the device serves. |
storage_controller |
string, nullable | no | null |
Storage controller description. | |
tlsize |
integer, nullable | no | null |
Transaction log size in GB. | |
vpod_skus |
object, nullable | no | null |
Associated VPOD SKUs and counts. | |
watts |
integer, nullable | no | null |
Power supply rating in watts. |
Example
{
"arch" : 64,
"compatibility_type" : "bravo",
"component_type" : "node",
"cpu" : "Intel Xeon E5-1630 v4 3.7GHz",
"generation" : "100",
"hdinfo" : "(1) 512GB SSD",
"id" : "301002001",
"introduced" : "7.0.0",
"memory" : "96GB",
"name" : "ASD-1-100-96-80",
"network" : "2x200GbE",
"platform" : "freebsd_142_amd64",
"powerdraw" : 400,
"product_name" : "Bravo Director Node 100",
"product_type" : "Bravo Director Node",
"role" : "director"
}HardwareBlinkDriveLedActionRequest
Request to turn on a drive’s identify (‘locate’) LED so the drive can be found physically.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal blink_drive_led |
yes | n/a | The action to perform on the component. | |
params |
HardwareDriveLedActionParams object |
yes | n/a | Identifies the drive on the hosting node. |
HardwareBlinkNodeLedActionRequest
Request to turn on a node’s identify (‘locate’) LED so the component can be found physically.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal blink_node_led |
yes | n/a | The action to perform on the component. | |
params |
null (not used) | no | n/a |
HardwareDriveLedActionParams
Identifies the drive whose LED to drive, by its number on the hosting node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
drive_number |
integer | yes | n/a | 1, 3 |
The drive’s number on the hosting node (the panfs_drive drive_number). Numbering starts at 1, so a node with four drives accepts 1 to 4. |
HardwareGetResponse
Detailed representation of a single hardware model.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
hardware |
Hardware object |
yes | n/a | Hardware model with all available details. |
Example
{
"hardware" : {
"arch" : 64,
"compatibility_type" : "bravo",
"component_type" : "node",
"cpu" : "Intel Xeon E5-1630 v4 3.7GHz",
"generation" : "100",
"hdinfo" : "(1) 512GB SSD",
"id" : "301002001",
"introduced" : "7.0.0",
"memory" : "96GB",
"name" : "ASD-1-100-96-80",
"network" : "2x200GbE",
"platform" : "freebsd_142_amd64",
"powerdraw" : 400,
"product_name" : "Bravo Director Node 100",
"product_type" : "Bravo Director Node",
"role" : "director"
}
}HardwareListResponse
A collection of hardware models with the total number available.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
hardware |
array of Hardware object |
no | n/a | Array of hardware models present in the current realm. Empty array if none are found. | |
total |
integer | yes | n/a | 0, 1, 3 |
Total count of hardware models present in the current realm. |
Example
{
"hardware" : [
{
"arch" : 64,
"compatibility_type" : "bravo",
"component_type" : "node",
"cpu" : "Intel Xeon E5-1630 v4 3.7GHz",
"generation" : "100",
"hdinfo" : "(1) 512GB SSD",
"id" : "301002001",
"introduced" : "7.0.0",
"memory" : "96GB",
"name" : "ASD-1-100-96-80",
"network" : "2x200GbE",
"platform" : "freebsd_142_amd64",
"powerdraw" : 400,
"product_name" : "Bravo Director Node 100",
"product_type" : "Bravo Director Node",
"role" : "director"
}
],
"total" : 1
}HardwareStopDriveLedActionRequest
Request to turn off a drive’s identify (‘locate’) LED.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal stop_drive_led |
yes | n/a | The action to perform on the component. | |
params |
HardwareDriveLedActionParams object |
yes | n/a | Identifies the drive on the hosting node. |
HardwareStopNodeLedActionRequest
Request to turn off a node’s identify (‘locate’) LED.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal stop_node_led |
yes | n/a | The action to perform on the component. | |
params |
null (not used) | no | n/a |
ListArchivedTenantResponse
Collection response for the archive listing.
Returned on GET /api/v1/tenants/archived (Platform Admin only), newest deletion first.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
tenants |
array of ArchivedTenantSchema object |
no | n/a | Array of archived tenants, newest deletion first. Empty array if none were ever deleted. | |
total |
integer | yes | n/a | 0, 5, 50 |
Total count of archived tenants in this response. |
Example
{
"tenants" : [
{
"created_at" : "2026-01-10T08:00:00Z",
"deleted_at" : "2026-04-02T11:20:00Z",
"description" : "Decommissioned engineering tenant",
"display_name" : "Engineering (retired)",
"email" : "eng-owner@vdura.example.com",
"id" : "3f2b1c0d-5e4a-4b8c-9d7e-6a5b4c3d2e1f",
"name" : "oldeng",
"status" : "archived",
"updated_at" : "2026-04-02T11:15:00Z"
}
],
"total" : 1
}ListS3BucketsResponse
Response wrapper for listing S3 buckets.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
s3_buckets |
array of S3BucketSchema object |
yes | n/a | List of S3 buckets. |
ListTenantResponse
Collection response for tenant list operations.
Returned on GET /api/v1/tenants, to any platform role holding tenants:list. Returns summary info for each tenant, not full details.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
tenants |
array of TenantSummarySchema object |
no | n/a | Array of tenant summary objects. Empty array if no tenants found | |
total |
integer | yes | n/a | 0, 5, 50 |
Total count of tenants in this response. |
Example
{
"tenants" : [
{
"created_at" : "2026-03-02T12:00:00Z",
"description" : "FinTech tenant",
"id" : "e97b94d6-9cc1-4325-a267-1064ae538ccd",
"name" : "fintech",
"status" : "active",
"updated_at" : "2026-03-02T12:00:00Z"
}
],
"total" : 1
}ListTenantStorageSetResponse
Collection response listing a tenant’s storageset assignments.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
storagesets |
array of StorageSetAssignment object |
no | n/a | Array of storageset assignments (id + quota + name). Empty array if none are assigned. | |
total |
integer | yes | n/a | 0, 2, 5 |
Total count of storageset assignments in this response. |
Example
{
"storagesets" : [
{
"quota_bytes" : 2199023255552,
"storageset_id" : 1,
"storageset_name" : "Set 1"
},
{
"quota_bytes" : 5497558138880,
"storageset_id" : 3,
"storageset_name" : "Set 3"
}
],
"total" : 2
}LocalAuthSettings
Local bcrypt-based authentication.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_mode |
literal local |
no | local |
LoginForm
Credentials for POST /auth/login, where the user name carries the tenant.
Any other form field an OAuth2 client sends is accepted and ignored.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
password |
string (password) | yes | n/a | The user password. | |
username |
string | yes | n/a | User name, tenant-qualified as <tenant-name>/<user> (for example fintech/alice). An unprefixed name belongs to the platform tenant. |
Example
{
"password" : "Secret1!",
"username" : "admin"
}MeResponse
Current user identity, and what it may do in the effective tenant.
roles and permissions are the same policy read from either end: the roles are the bindings the caller holds, permissions the effective set they resolve to. A client that only gates on capability reads permissions; one that also names the caller’s role reads roles. Both are scoped to tenant_id, so a tenant switch reports the target tenant.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
actor_tenant_id |
string (uuid), nullable | no | null |
00000000-0000-0000-0000-000000000000 |
Home tenant of the acting user; set only while a tenant switch is active. |
actor_user_id |
string (uuid), nullable | no | null |
00000000-0000-0000-0000-000000000001 |
The user that asked for the switch; set only while a tenant switch is active. |
is_delegated |
boolean | no | false |
True while the caller acts in another tenant through a tenant switch. user_id is then the platform-support principal, and the delegation fields name the real caller. |
|
is_platform_admin |
boolean | yes | n/a | True if the authenticated user is the built-in Platform Admin account acting in its own tenant. Informational only - it grants nothing that the platform policy does not already grant. Always false while a tenant switch is active. | |
permissions |
array of string | no | n/a | ["volumes:list","volumes:create","users:view"] |
Every permission the caller’s roles grant, as resource:action, deduplicated and in policy order. This is the effective set the server enforces against, so a client can gate a control on membership alone without knowing which role supplied it. |
roles |
array of string | no | n/a | ["admin"] |
Roles the caller holds in the effective tenant. Empty when the caller is bound to no role there - a role defined by another tenant grants nothing here. The full catalog, with the permissions of every role the tenant defines, is at GET /tenants/roles. |
tenant_id |
string (uuid) | yes | n/a | 123e4567-e89b-12d3-a456-426614174000 |
Effective tenant UUID. Resolved from the tid claim in the JWT. |
user_id |
string (uuid) | yes | n/a | 123e4567-e89b-12d3-a456-426614174000 |
The authenticated user identifier (JWT sub claim). |
Example
{
"is_delegated" : false,
"is_platform_admin" : false,
"permissions" : [
"tenants:view",
"volumes:list",
"volumes:view",
"users:list",
"users:view",
"users:update",
"users:delete",
"observability:list",
"observability:view",
"roles:view",
"roles:update"
],
"roles" : [
"admin"
],
"tenant_id" : "123e4567-e89b-12d3-a456-426614174000",
"user_id" : "123e4567-e89b-12d3-a456-426614174000"
}MountInfoResponse
The mount targets a client on one tenant subnet can use.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
directors |
array of DirectorEntry object |
no | n/a | The realm directors holding an address on this subnet, nodes carrying a realm-database replica first and then ordered by address. Every such director appears here, in either address family. An empty array means the subnet exists and carries no address records yet. | |
rmlist |
string | yes | n/a | 10.20.0.11;10.20.0.12 |
The addresses for mount_panfs, joined with “;” in the order above and wrapped by the caller as rmlist=( |
subnet_id |
string (uuid) | yes | n/a | UUID of the subnet the addresses belong to. | |
tenant_id |
string (uuid) | yes | n/a | UUID of the tenant owning the subnet. |
Example
{
"directors" : [
{
"dataserial" : "SN-D01",
"ip" : "10.20.0.11",
"repset" : true,
"status" : "online"
},
{
"dataserial" : "SN-D02",
"ip" : "10.20.0.12",
"repset" : true,
"status" : "online"
},
{
"dataserial" : "SN-D03",
"ip" : "10.20.0.13",
"repset" : false,
"status" : "online"
}
],
"rmlist" : "10.20.0.11;10.20.0.12",
"subnet_id" : "36a8995f-026b-47e1-88bd-7fb9e7239995",
"tenant_id" : "e97b94d6-9cc1-4325-a267-1064ae538ccd"
}Node
Node representation.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
capacity_bytes |
integer | no | 0 |
55650025472, 0 |
Storage capacity of the node in bytes. |
dataserial |
string | yes | n/a | e9ff4075d18233 |
The data serial identifier used for data replication and recovery processes |
flags |
array of NodeFlag (impaired, jettisoned, upgrade, reinit, offline, reinit_pending, recon_pending, need_to_offline, draining, alias_uncommitted, disallow_aliases, repset, drained, activated, 10ge_secondary_only, admin_nic_disabled) |
yes | n/a | repset, activated |
Operational flags indicating special conditions or states of the node |
hw_serial |
string | yes | n/a | 3e7e0000310fff001 |
The hardware serial identifier used for inventory tracking and support |
ip_address |
string | yes | n/a | 10.97.18.200 |
The management interface IP address used to reach the node for control and monitoring |
name |
string | yes | n/a | ASD-1,1, VCH-2,2 |
Human-readable node name formed as <node group>,<slot> (e.g. ASD-1,1, VCH-2,2). |
role |
NodeRole (none, any, any_director, any_storage, qnode, snode, ibr_node, vhost, vosd) |
yes | n/a | any_director |
The functional role of the node indicating how the node is used in the system |
shelf_id |
string | yes | n/a | 3e7e0001402001001 |
Unique identifier of a storage shelf |
status |
NodeStatus (unknown, new, secure_erase, fsck, booting, shutdown, online, offline, mia_timer, dead, mia_notimer, lowbattery, clocksync, not_ready, network_err, not_reconciled, config_err) |
yes | n/a | online |
The status of the node |
storageset_id |
integer | no | 0 |
1, 2, 5 |
StorageSet ID where this node resides |
vhost_id |
string | yes | n/a | bf806fa0c17feb |
Identifier of the virtual host (vhost) the node belongs to; empty if not associated with a vhost |
Example
{
"capacity_bytes" : 55650025472,
"dataserial" : "e9ff4075d18233",
"flags" : [
"repset",
"activated"
],
"hw_serial" : "3e7e0000310fff001",
"ip_address" : "10.97.18.200",
"name" : "ASD-1,1",
"role" : "any_director",
"shelf_id" : "3e7e0001402001001",
"status" : "online",
"storageset_id" : 1,
"vhost_id" : "bf806fa0c17feb"
}NodeDrainState
High-level state of an OSD drain operation.
Allowed values: draining, not_draining, suspended, unknown
NodeDrainStatusResponse
Progress of an OSD drain, including derived completion percentage and ETA.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
amount_error |
integer | yes | n/a | Bytes that could not be migrated. | |
amount_moved |
integer | yes | n/a | Bytes already migrated off the node. | |
amount_remaining |
integer | yes | n/a | Bytes still to be migrated off the node. | |
eta_seconds |
integer, nullable | yes | n/a | 51, 0, null |
Estimated seconds to completion at the current rate, or null when the rate is zero. |
objects_error |
integer | yes | n/a | Objects that could not be migrated. | |
objects_moved |
integer | yes | n/a | Objects already migrated off the node. | |
objects_remaining |
integer | yes | n/a | Objects still to be migrated off the node. | |
percent_complete |
number, nullable | yes | n/a | 50, 100, null |
Percentage of bytes migrated, or null when there is nothing to drain. |
pm_id |
integer | yes | n/a | Identifier of the performance manager (PM) reporting this drain. | |
rate_bytes_per_sec |
integer | yes | n/a | Current data-movement rate for the drain, in bytes per second. | |
state |
NodeDrainState (draining, not_draining, suspended, unknown) |
yes | n/a | High-level state of the drain operation. |
Example
{
"amount_error" : 0,
"amount_moved" : 5368709120,
"amount_remaining" : 5368709120,
"eta_seconds" : 51,
"objects_error" : 0,
"objects_moved" : 1024,
"objects_remaining" : 1024,
"percent_complete" : 50,
"pm_id" : 4,
"rate_bytes_per_sec" : 104857600,
"state" : "draining"
}NodeFlag
Node flags.
Allowed values: impaired, jettisoned, upgrade, reinit, offline, reinit_pending, recon_pending, need_to_offline, draining, alias_uncommitted, disallow_aliases, repset, drained, activated, 10ge_secondary_only, admin_nic_disabled
NodeGetResponse
Detailed representation of a single node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
node |
Node object |
yes | n/a | Node entity with all available details. |
Example
{
"node" : {
"capacity_bytes" : 55650025472,
"dataserial" : "e9ff4075d18233",
"flags" : [
"repset",
"activated"
],
"hw_serial" : "3e7e0000310fff001",
"ip_address" : "10.97.18.200",
"name" : "ASD-1,1",
"role" : "any_director",
"shelf_id" : "3e7e0001402001001",
"status" : "online",
"storageset_id" : 1,
"vhost_id" : "bf806fa0c17feb"
}
}NodeHaltActionRequest
Request to perform a halt (power-down without auto-restart) action on a Node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal halt |
yes | n/a | The action to perform on the node. | |
params |
null (not used) | no | n/a |
NodeListResponse
Represents a collection of node objects along with the total number of available objects.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
nodes |
array of Node object |
no | n/a | Array of node objects matching the query. Empty array if no nodes found | |
total |
integer | yes | n/a | 0, 2, 150 |
Total count of nodes available (may exceed returned array size if paginated). |
Example
{
"nodes" : [
{
"capacity_bytes" : 55650025472,
"dataserial" : "e9ff4075d18233",
"flags" : [
"repset",
"activated"
],
"hw_serial" : "3e7e0000310fff001",
"ip_address" : "10.97.18.200",
"name" : "ASD-1,1",
"role" : "any_director",
"shelf_id" : "3e7e0001402001001",
"status" : "online",
"storageset_id" : 1,
"vhost_id" : "bf806fa0c17feb"
}
],
"total" : 1
}NodeRebootActionRequest
Request to perform a reboot action on a Node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal reboot |
yes | n/a | The action to perform on the node. | |
params |
null (not used) | no | n/a |
NodeRole
Node roles.
Allowed values: none, any, any_director, any_storage, qnode, snode, ibr_node, vhost, vosd
NodeStartDrainRequest
Request to start draining a node (migrate its data onto other nodes in the StorageSet).
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal start_drain |
yes | n/a | The drain action to perform. | |
params |
null (not used) | no | n/a |
NodeStatus
Node operational statuses.
Allowed values: unknown, new, secure_erase, fsck, booting, shutdown, online, offline, mia_timer, dead, mia_notimer, lowbattery, clocksync, not_ready, network_err, not_reconciled, config_err
NodeStopDrainRequest
Request to stop an in-progress node drain.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal stop_drain |
yes | n/a | The drain action to perform. | |
params |
null (not used) | no | n/a |
ObservabilityLabels
Labels for observability targets.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
__meta_node_state |
string | yes | n/a | online, offline |
The PanFS node state (mgmt node status) of the nodes in this group. It describes the node, not whether the scrape endpoint answers. |
__meta_node_type |
string | yes | n/a | any_director, vhost, vosd |
The type/role of the node |
Example
{
"__meta_node_state" : "online",
"__meta_node_type" : "any_director"
}ObservabilityTarget
Target for observability metrics collection.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
labels |
ObservabilityLabels object |
yes | n/a | Labels associated with these targets | |
targets |
array of string | yes | n/a | ["10.97.15.200:9273"] |
Scrape endpoints as host:port. The port is the observability agent (telegraf) Prometheus exporter on each node, which serves /metrics; 9273 unless the deployment overrides it. |
Example
{
"labels" : {
"__meta_node_state" : "online",
"__meta_node_type" : "any_director"
},
"targets" : [
"10.97.15.200:9273"
]
}PamAuthSettings
PAM-based authentication.
The service field maps to /etc/pam.d/<service>.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_mode |
literal pam |
no | pam |
||
service |
string | no | login |
PanfsEvent
One PanFS management event, projected from a job="EVENTS" log record.
The payload for both the events snapshot (GET /observability/events) and the append SSE deltas. Every field describes the event’s subject node; the record’s stream labels name the director that shipped the log line and are not carried here.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
blade_serial |
string | no | (empty string) | Blade serial of the subject node. | |
category |
string | no | (empty string) | Event category, e.g. hardware, volume. |
|
component_type |
string | no | (empty string) | Subject component type, e.g. Director, VPOD Container. |
|
event_code |
string | no | (empty string) | PanFS event code, shown as #CODE in the UI. |
|
event_name |
string | no | (empty string) | PanFS event constant, e.g. PAN_MGMT_EV_BRICK_ONLINE. |
|
hw_serial |
string | no | (empty string) | Subject node’s hardware serial. | |
id |
string | yes | n/a | PanFS event_id - a hash of the event, unique per occurrence. |
|
ip_address |
string | no | (empty string) | Subject node’s management IP address. | |
message |
string | yes | n/a | Human-readable event message. | |
node_dataserial |
string | no | (empty string) | Subject node’s data serial, for linking to its detail page. | |
severity |
one of: error, warning, info |
yes | n/a | Normalized severity level. | |
shelf_id |
string | no | (empty string) | Serial of the shelf holding the subject node. | |
slot_id |
string | no | (empty string) | Slot the subject node occupies in that shelf. | |
tenant_id |
string | no | (empty string) | Tenant the event belongs to; empty for a realm-wide event. | |
time |
string | yes | n/a | When the event occurred (ISO 8601). | |
volume_service_id |
string | no | (empty string) | Volume-service handle for volume events, e.g. 0x0400000000000005. |
Principal
A principal as a token record names it: ids and names, recorded at the time and never re-read.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
string (uuid) | yes | n/a | Principal id. | |
kind |
SubjectKind (user, service-account) |
yes | n/a | user | service-account. |
|
name |
string | yes | n/a | Username or service account name. | |
tenant_id |
string (uuid) | yes | n/a | The principal’s own tenant. | |
tenant_name |
string | yes | n/a | The principal’s tenant name. |
QuotasPolicy
User and Group Quotas Policy status.
Determines whether user and group quota enforcement is enabled on the volume.
States: - DISABLE: quotas enforcement is disabled - ENABLE: quotas enforcement is enabled and active - REPORT: quota reporting mode without enforcement - INHERIT: quota policy inherited from system defaults - INVALID: invalid quota state, indicates an error condition
Allowed values: disable, enable, report, inherit, invalid
RaidType
RAID types supported by volume layout.
Allowed values: raid6+, raid5+, raid10+, raid5, raid10, default
Realm
Realm for the API response.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
boot_epoch_seconds |
number | yes | n/a | Realm boot epoch timestamp in seconds | |
clientmode_current |
RealmClientMode (invalid, balanced, favor_df) |
yes | n/a | Current client mode | |
clientmode_next |
RealmClientMode (invalid, balanced, favor_df) |
yes | n/a | Next client mode (after reboot) | |
data_generation |
integer | yes | n/a | Data generation counter | |
heartbeat_failure_grace_seconds |
number | yes | n/a | Heartbeat failure grace period in seconds | |
heartbeat_period_seconds |
number | yes | n/a | Heartbeat period in seconds | |
id |
string | yes | n/a | Realm unique identifier as a hex string | |
locked |
boolean | yes | n/a | Whether the realm is locked to new node joins (via PanDHCP). true prevents new nodes from joining; false allows joins. Independent of state - a realm can be online and locked at the same time. | |
log_sizing |
RealmLogSizing (invalid, 4g, 12g, dm1, custom_1, custom_2, custom_3, custom_4, custom_5, current) |
yes | n/a | Log sizing configuration | |
mem_sizing_current |
integer | yes | n/a | Current memory sizing level | |
mem_sizing_next |
integer | yes | n/a | Next memory sizing level (after reboot) | |
mia_timer |
integer | yes | n/a | MIA timer in seconds | |
name |
string | yes | n/a | Realm display name | |
panfs_mounted |
boolean | yes | n/a | Whether the realm root filesystem is mounted. Creating a tenant, and creating or renaming a volume, need it: while it is false, those calls answer 503. Each API host checks its own mount on every request, so two hosts behind a load balancer may disagree. | |
president_flags |
array of RealmPresidentFlag (settled_storage, settled_mgr, vsm_backup_rebal) |
yes | n/a | President flags | |
state |
RealmState (invalid, unknown, online, going_offline, offline, powered_down, rebooting, snapping, powering_down, reinitializing, pausing, paused, upgrade_quiescing, upgrade) |
yes | n/a | Current operational state of the realm | |
state_flags |
array of RealmStateFlag (offline, paused, upgrade, ure_default, log_sizing_bad) |
yes | n/a | Active realm state flags | |
volume_layout_type_default |
RaidType (raid6+, raid5+, raid10+, raid5, raid10, default) |
yes | n/a | Default volume RAID layout type | |
volume_max_vols_realm |
integer | yes | n/a | Maximum number of volumes in the realm | |
volume_recovery_priority_default |
integer | yes | n/a | Default volume recovery priority |
Example
{
"boot_epoch_seconds" : 0,
"clientmode_current" : "balanced",
"clientmode_next" : "balanced",
"data_generation" : 6,
"heartbeat_failure_grace_seconds" : 30,
"heartbeat_period_seconds" : 30,
"id" : "a538deadbeef0001889abcdef1234567",
"locked" : false,
"log_sizing" : "12g",
"mem_sizing_current" : 1,
"mem_sizing_next" : 1,
"mia_timer" : 360,
"name" : "exp-aic-97-5",
"panfs_mounted" : true,
"president_flags" : [
"settled_storage",
"settled_mgr"
],
"state" : "online",
"state_flags" : [],
"volume_layout_type_default" : "raid6+",
"volume_max_vols_realm" : 1200,
"volume_recovery_priority_default" : 50
}RealmClientMode
Realm client modes.
Allowed values: invalid, balanced, favor_df
RealmLockActionRequest
Request to lock the realm (prevent new nodes from joining via PanDHCP).
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal lock |
yes | n/a | The action to perform on the realm. | |
params |
null (not used) | no | n/a |
RealmLogSizing
Realm log sizing options.
Allowed values: invalid, 4g, 12g, dm1, custom_1, custom_2, custom_3, custom_4, custom_5, current
RealmMoveServiceActionParams
Parameters for moving a service to a different director node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
node_dataserial |
string | yes | n/a | 50f6dd3e7103a9, 253d193e710424 |
Dataserial of the destination director node that will host the service. |
service_id |
string | yes | n/a | 0x0400000000000004, 0x0400000000000005 |
Hexadecimal manager id of the service to move, e.g. “0x0400000000000004”. A volume service’s volume_service_id (from the volumes API) is one such id. |
service_type |
ServiceInstance (primary, backup) |
yes | n/a | primary, backup |
Which service instance to move: “primary” (live failover) or “backup” (standby). |
RealmMoveServiceActionRequest
Request to move a service to a different director node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal move_service |
yes | n/a | The action to perform on the realm. | |
params |
RealmMoveServiceActionParams object |
yes | n/a | Parameters identifying the service to move and its destination node. |
RealmOfflineActionParams
Parameters for the offline realm action.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
mode |
RealmOfflineMode (paused, unavailable) |
no | paused |
paused, unavailable |
How to take the realm offline. paused performs a graceful drain; unavailable makes volumes inaccessible immediately. Defaults to paused. |
RealmOfflineActionRequest
Request to take the realm offline.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal offline |
yes | n/a | The action to perform on the realm. | |
params |
RealmOfflineActionParams object |
no | n/a | Parameters for taking the realm offline. |
RealmOfflineMode
Mode for the offline realm action.
Allowed values: paused, unavailable
RealmOnlineActionRequest
Request to bring the realm online.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal online |
yes | n/a | The action to perform on the realm. | |
params |
null (not used) | no | n/a |
RealmPresidentFlag
Realm president flags.
Allowed values: settled_storage, settled_mgr, vsm_backup_rebal
RealmRebootActionRequest
Request to reboot the realm.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal reboot |
yes | n/a | The action to perform on the realm. | |
params |
null (not used) | no | n/a |
RealmRehomeRootActionParams
Parameters required to reassign the realm root volume to a different StorageSet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
raid_type |
VolumeLayout (raid6+, raid5+, raid10+, raid5, raid10) |
no | raid6+ |
raid6+, raid5+, raid10+ |
RAID layout for the new realm root volume. Defaults to raid6+ when omitted. |
storageset_id |
integer | yes | n/a | 1, 3, 5 |
Identifier of the StorageSet that will host the new realm root volume. |
RealmRehomeRootActionRequest
Request to reassign the realm root volume to a different StorageSet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal rehome_root |
yes | n/a | The action to perform on the realm. | |
params |
RealmRehomeRootActionParams object |
yes | n/a | Parameters required to reassign the realm root volume to a different StorageSet. |
RealmResponse
Response wrapper for realm, plus the API host’s timezone.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
realm |
Realm object |
yes | n/a | Realm details | |
server_tzone |
string | yes | n/a | America/Los_Angeles, UTC |
IANA timezone name of the API server’s host (e.g. ‘America/Los_Angeles’). |
Example
{
"realm" : {
"boot_epoch_seconds" : 0,
"clientmode_current" : "balanced",
"clientmode_next" : "balanced",
"data_generation" : 6,
"heartbeat_failure_grace_seconds" : 30,
"heartbeat_period_seconds" : 30,
"id" : "a538deadbeef0001889abcdef1234567",
"locked" : false,
"log_sizing" : "12g",
"mem_sizing_current" : 1,
"mem_sizing_next" : 1,
"mia_timer" : 360,
"name" : "exp-aic-97-5",
"panfs_mounted" : true,
"president_flags" : [
"settled_storage",
"settled_mgr"
],
"state" : "online",
"state_flags" : [],
"volume_layout_type_default" : "raid6+",
"volume_max_vols_realm" : 1200,
"volume_recovery_priority_default" : 50
},
"server_tzone" : "America/Los_Angeles"
}RealmSegmentTypeRequest
Set the network segment type new subnets are placed on.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
segment_type |
one of: vlan, vxlan |
yes | n/a | vlan, vxlan |
The segment type new subnets are placed on. |
Example
{
"segment_type" : "vlan"
}RealmSegmentTypeResponse
The network segment type every new subnet of this realm is placed on.
Realm-wide rather than a property of any subnet, so it answers before the first one exists, which is what a client building a create request needs.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
segment_type |
SubnetSegmentType (none, vlan, vxlan) |
yes | n/a | vxlan, vlan, none |
The segment type a new subnet is placed on. vlan carries a VLAN ID in segment_id and vxlan a VNI. none is the realm naming no segment at all, which is a state to report rather than an error: a create on such a realm is refused, with a reason. |
Example
{
"segment_type" : "vxlan"
}RealmState
Realm operational states.
Allowed values: invalid, unknown, online, going_offline, offline, powered_down, rebooting, snapping, powering_down, reinitializing, pausing, paused, upgrade_quiescing, upgrade
RealmStateFlag
Realm state flags.
Allowed values: offline, paused, upgrade, ure_default, log_sizing_bad
RealmUnlockActionRequest
Request to unlock the realm (re-enable PanDHCP joins).
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal unlock |
yes | n/a | The action to perform on the realm. | |
params |
null (not used) | no | n/a |
Resource
RBAC-protected resources.
Allowed values: tenants, storagesets, nodes, hardware, volumes, subnets, attachments, users, service-accounts, s3-config, s3-instances, fs-users, s3-buckets, s3-admin, s3-reconcile-state, realm, observability, observability-realm, roles, tokens
RolesResponse
The current role set of a principal, returned by every GET and PATCH on a roles route.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
roles |
array of string | yes | n/a | ["admin"] |
Roles currently bound to the principal. |
S3AggregatorConfigSchema
Per-tenant tenant-level aggregator policy.
Opt-in, and defaulting to off. The per-instance endpoints are the tenant’s data plane: the same fixed port on every node, inside the tenant’s own network namespace, on a subnet its clients are already attached to. enabled=true adds an agg_<uuid> frontend and backend on each director, scoped to the tenant namespace.
There is no port field. The aggregator binds a fixed realm-wide port inside that namespace, so there is nothing to allocate or report.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
enabled |
boolean | no | false |
Whether the tenant-level S3 aggregator is generated for this tenant. |
Example
{
"enabled" : false
}S3BucketCreateRequest
Request payload for creating an S3 bucket.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
name |
string | yes | n/a | Bucket name. | |
owner |
string | yes | n/a | S3 access_key of the PanFS user the bucket belongs to. Required, and must name a PanFS user in this tenant: the gateway resolves the owner through its IAM backend, so a value that is not a PanFS user cannot be resolved there at all. |
Example
{
"name" : "my-bucket",
"owner" : "alice"
}S3BucketSchema
S3 bucket data model for API responses.
owner names a PanFS user, by access key. It is not an authorization input: deletion is governed by s3-buckets:delete and ownership is not consulted, matching S3’s own s3:DeleteBucket semantics. It is the owner in the bucket’s ACL on the gateway, which the create sets, so the owning user holds the bucket creator’s rights.
The caller is a control-plane principal and has no S3 identity of its own, which is why the owner is named in the request rather than derived from whoever made it.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
name |
string | yes | n/a | Bucket name. | |
owner |
string | no | (empty string) | S3 access_key of the PanFS user the bucket belongs to, as the bucket ACL on the gateway records it. Empty string for a bucket whose ACL names no owner. |
S3ConfigCreateRequest
Request payload for creating a tenant’s S3 configuration.
Every field carries a default, so PUT /s3 {} is a complete request: it creates the disabled config with the empty prefix and the POSIX defaults a tenant starts with. Those defaults live here rather than in a factory beside the service, because this is the only place that can publish them - an operator reading the API document sees what an omitted field will be, and there is no second copy to drift from it.
access_key, secret_key and control_plane have no field here at all; :mod:app.use_cases.create_s3_config mints all three.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_log |
boolean | no | true |
Whether the S3 access log is enabled for this tenant (the S3 gateway’s –access-log audit log). Defaults to true. | |
aggregator |
S3AggregatorConfigSchema object |
no | n/a | Tenant-level S3 aggregator policy (opt-in via enabled=true). |
|
debug_log |
boolean | no | false |
Whether the S3 debug request log is enabled for this tenant. Defaults to false. | |
default_dir_mode |
string | no | 755 |
755, 0755 |
Default directory permission mode in octal (e.g. 755). |
default_group |
string | no | gid:65534 |
gid:65534, gid:1000 |
Default POSIX group for objects (e.g. gid:65534). An fs-user created without a gid takes it. gid:65534 (nogroup) is the unset value; an empty string is not accepted. |
default_obj_mode |
string | no | 644 |
644, 0644 |
Default object/file permission mode in octal (e.g. 644). |
default_owner |
string | no | uid:65534 |
uid:65534, uid:1000 |
Default POSIX owner for objects (e.g. uid:65534). An fs-user created without a uid takes it. uid:65534 (nobody) is the unset value; an empty string is not accepted. |
default_prefix |
string | no | (empty string) | /vol1, /vol1/data |
Tenant-relative path served by S3 (e.g. /vol1 or /vol1/data). Must name an existing volume of the tenant (or a directory inside one); stored resolved into the tenant volume namespace. Optional: omit it to create the config before the tenant has a volume to serve. The empty value skips volume validation and cannot be enabled until a real prefix is set by PATCH. |
dns |
S3DnsConfigSchema object |
no | n/a | DNS/named-access policy (default mode=off). | |
enabled |
boolean | no | false |
Whether S3 access is enabled for this tenant. | |
metrics_enabled |
boolean | no | true |
Whether S3 metrics are collected for this tenant (the S3 gateway’s StatsD counters to the node-local Telegraf listener). Defaults to true. | |
tls |
S3TlsConfigSchema object |
no | n/a | TLS configuration for the S3 gateway. |
Example
{
"aggregator" : {
"enabled" : false
},
"default_dir_mode" : "755",
"default_group" : "gid:65534",
"default_obj_mode" : "644",
"default_owner" : "uid:65534",
"default_prefix" : "/vol1/t1",
"enabled" : true,
"tls" : {}
}S3ConfigPatchRequest
Request payload for partially updating a tenant’s S3 configuration.
At least one field must be provided. Null values are not allowed - omit fields that should not change.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_log |
boolean, nullable | no | null |
Whether the S3 access log is enabled for this tenant. | |
aggregator |
S3AggregatorConfigSchema object, nullable |
no | null |
Tenant-level S3 aggregator policy (opt-in via enabled=true). |
|
debug_log |
boolean, nullable | no | null |
Whether the S3 debug request log is enabled for this tenant. | |
default_dir_mode |
string, nullable | no | null |
Default directory permission mode in octal. | |
default_group |
string, nullable | no | null |
Default POSIX group for objects. To unset it, send gid:65534 (nogroup), the value a new config starts with; an empty string is not accepted. | |
default_obj_mode |
string, nullable | no | null |
Default object/file permission mode in octal. | |
default_owner |
string, nullable | no | null |
Default POSIX owner for objects. To unset it, send uid:65534 (nobody), the value a new config starts with; an empty string is not accepted. | |
default_prefix |
string, nullable | no | null |
Tenant-relative path served by S3. Must name an existing volume of the tenant (or a directory inside one); immutable while the tenant has S3 enabled. | |
dns |
S3DnsConfigSchema object, nullable |
no | null |
DNS/named-access policy (mode off/panfs/external). | |
enabled |
boolean, nullable | no | null |
Whether S3 access is enabled for this tenant. | |
metrics_enabled |
boolean, nullable | no | null |
Whether S3 metrics are collected for this tenant. | |
tls |
S3TlsConfigSchema object, nullable |
no | null |
TLS configuration for the S3 gateway. |
Example
{
"default_prefix" : "/vol1/t1",
"enabled" : false
}S3ConfigSchema
S3 configuration data model for API responses.
The tenant-root access_key/secret_key are not returned by this API at all, neither in full nor redacted: they are the gateway’s own administrator account, internal to PanFS. tls.private_key is the one value still redacted rather than dropped - it has a field because a tenant supplies it, so the response has to say whether one is set.
That is what makes s3-config:view an ordinary read, held by the read-only platform roles like any other: it describes a configuration and hands over no credential at all.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_log |
boolean | no | true |
Whether the S3 access log is enabled for this tenant. | |
aggregator |
S3AggregatorConfigSchema object |
yes | n/a | Tenant-level S3 aggregator policy. | |
debug_log |
boolean | no | false |
Whether the S3 debug request log is enabled for this tenant. | |
default_dir_mode |
string | yes | n/a | Default directory permission mode in octal. | |
default_group |
string | yes | n/a | Default POSIX group for objects. | |
default_obj_mode |
string | yes | n/a | Default object/file permission mode in octal. | |
default_owner |
string | yes | n/a | Default POSIX owner for objects. | |
default_prefix |
string | yes | n/a | Filesystem path served by S3. | |
enabled |
boolean | yes | n/a | Whether S3 access is enabled for this tenant. | |
metrics_enabled |
boolean | no | true |
Whether S3 metrics are collected for this tenant. | |
tls |
S3TlsConfigResponseSchema object |
yes | n/a | TLS configuration for the S3 gateway. |
Example
{
"aggregator" : {
"enabled" : false
},
"default_dir_mode" : "755",
"default_group" : "gid:65534",
"default_obj_mode" : "644",
"default_owner" : "uid:65534",
"default_prefix" : "/vol1/t1",
"enabled" : true,
"tls" : {
"ca_certificate" : "-----BEGIN CERTIFICATE-----\n...",
"certificate" : "-----BEGIN CERTIFICATE-----\n...",
"mode" : "realm-generated",
"private_key" : "***"
}
}S3ConfigUpdateResponse
What a PATCH of the S3 config could not apply to the gateways already running.
It is a body so the answer travels in the OpenAPI document and through a JSON client, which is what a header or a log line could not do. An empty list is the ordinary case and is a positive statement - every change this request made is in effect now.
restart_required names the fields this request actually changed whose new value a running gateway will only pick up when it is restarted - never the tenant’s other standing configuration, and never a field re-sent at the value it already held. A tenant with no started instance always answers []: there is nothing holding the old values. Which instances those are is deliberately not repeated here - GET /tenants/{tenant_id}/s3/instances already answers that, and a second copy could disagree with it.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
restart_required |
array of string | yes | n/a | Names of S3 config fields this request changed whose new value reaches already-running S3 gateway instances only after those instances are restarted. Empty when every change is in effect now, when the request changed nothing, or when the tenant has no started instance. The set of names can change between releases. |
Example
{
"restart_required" : [
"access_log",
"debug_log"
]
}S3CredentialsRevealResponse
Everything the S3 gateway needs to build an auth.Account from an access key.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_key |
string | yes | n/a | The access key that was resolved. | |
gid |
integer | yes | n/a | POSIX group id objects written by this user are owned by. | |
profile |
S3Profile (disabled, user, privileged) |
yes | n/a | S3 access profile. The gateway maps it to a role: privileged carries bucket-creation rights, anything else is an ordinary user. |
|
secret_key |
string | yes | n/a | Plaintext S3 secret key. | |
uid |
integer | yes | n/a | POSIX user id objects written by this user are owned by. |
Example
{
"access_key" : "alice",
"gid" : 65534,
"profile" : "user",
"secret_key" : "7f9a3d2e8c1b4a6f0d5e2c8b9f1a3d7e",
"uid" : 65534
}S3DnsConfigSchema
Per-tenant DNS / named-access policy.
mode selects whether the realm publishes DNS records; it is never a precondition for reachability (every endpoint is reachable by IP:port) and drives no routing:
off(default): IP:port only - no DNS records.panfs:pan_dns_serverpublishes the aggregator + per-instance records. Not supported for a tenant other than the platform tenant, and refused with 400: the realm DNS server cannot publish addresses on a tenant subnet.external: the customer runs their own DNS at the tenant’s addresses; PanFS publishes nothing.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
mode |
S3DnsMode (off, panfs, external) |
no | off |
DNS/named-access mode: off (default), panfs, or external. panfs is supported for the platform tenant only; any other tenant is refused with 400. |
Example
{
"mode" : "off"
}S3DnsMode
Per-tenant DNS / named-access mode.
DNS records are optional, never a precondition for reachability - every endpoint is reachable by IP:port in all modes, and no mode drives routing. The mode is tenant-scoped (the aggregator apex is a tenant name; per-instance names are derived subdomains).
Allowed values: off, panfs, external
S3EnabledRequest
Request body for PUT /s3/enabled.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
enabled |
boolean | yes | n/a | Realm-wide S3 enable flag. |
Example
{
"enabled" : true
}S3EnabledResponse
Response body for GET /s3/enabled and PUT /s3/enabled.
When PUT disables S3 at the realm level while at least one tenant still has tenant-level S3 enabled, warning carries a human- readable message and tenants_with_s3_enabled lists the short names of the offending tenants. Both fields are absent on GET and on PUT-enable.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
enabled |
boolean | yes | n/a | Realm-wide S3 enable flag. | |
tenants_with_s3_enabled |
array of string, nullable | no | null |
Tenant short names that still have tenant-level S3 enabled after the realm-wide disable. Absent on get and on enable. | |
warning |
string, nullable | no | null |
Warning surfaced when realm-disable leaves tenants with S3 enabled. |
Example
{
"enabled" : false,
"tenants_with_s3_enabled" : [
"tn1"
],
"warning" : "1 tenant(s) still have S3 enabled at the tenant level"
}S3InstanceCreateRequest
Create a new S3 gateway instance for a tenant on a specific node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
dataserial |
string | yes | n/a | Target node’s dataserial (14 hex chars) as returned by GET /nodes and consumed by every /nodes/{dataserial} endpoint (e.g. 08823f71a1eecc). The stable placement identity - unaffected by node renames. |
|
instance_id |
string | yes | n/a | Instance identifier: exactly 5 alphanumeric characters (D10). |
Example
{
"dataserial" : "08823f71a1eecc",
"instance_id" : "abc12"
}S3InstanceCreateResponse
Response body for a successful instance create.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
instance |
S3InstanceSchema object |
yes | n/a | Desired-state view of an S3 gateway instance. |
S3InstanceFanoutResponse
Aggregate body for fan-out verbs (start / stop / delete / show).
aggregate_status reflects the worst-case per-node outcome. Callers that want a single success/failure signal should inspect this field; detail-level consumers should walk results.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
aggregate_status |
integer | yes | n/a | Aggregate HTTP status: the rows’ shared success code (202 for a recorded state change, 200 for a read) if every node succeeded, the shared error code if every node failed with the same code, otherwise 207. delete-all answers 200 once every instance is gone, and start-all/stop-all answer 200 with no results for a tenant with no instances. | |
confirmed |
boolean | no | true |
For delete fan-out, true once the caller has confirmed the destructive operation. When false, the request body enumerates matches without deleting anything. | |
results |
array of S3InstancePerNodeResult object |
yes | n/a |
S3InstanceHealthSchema
Observed/health view merged in by the reader path.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
consecutive_failures |
integer | yes | n/a | ||
last_error |
string, nullable | no | null |
||
last_seen_ts |
integer, nullable | yes | n/a | When a probe last reached the gateway (epoch seconds); null until one has. | |
restart_count_60s |
integer | yes | n/a |
S3InstanceListResponse
Response body for list and fan-out operations.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
instances |
array of S3InstanceViewSchema object |
yes | n/a |
S3InstancePerNodeResult
Per-node outcome inside a fan-out response body (D10).
status is the HTTP status the call would have returned if it had targeted this single node; error carries the detail message on non-2xx cases. instance is populated on read verbs; null for start/stop/delete outcomes, which record the new desired state without waiting for the instance to reach it (show the instance for its observed state). data_serial identifies the target node.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
data_serial |
string | yes | n/a | ||
error |
string, nullable | no | null |
||
instance |
S3InstanceViewSchema object, nullable |
no | null |
||
status |
integer | yes | n/a | Per-node HTTP status (200, 202, 404, 409, 503, …). |
S3InstanceSchema
Desired-state view of an S3 gateway instance.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
created_at |
integer | yes | n/a | ||
data_serial |
string | yes | n/a | ||
desired |
string | yes | n/a | created | started | stopped | deleting | |
instance_id |
string | yes | n/a | ||
last_transition_at |
integer | yes | n/a | ||
module_instance_token |
string | yes | n/a |
S3InstanceViewSchema
Merged desired + observed/health row returned by list/show.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
desired |
S3InstanceSchema object |
yes | n/a | Desired-state view of an S3 gateway instance. | |
dns_name |
string, nullable | no | null |
Optional DNS endpoint https:// |
|
endpoint |
string, nullable | no | null |
Primary S3 endpoint as https:// |
|
health |
S3InstanceHealthSchema object, nullable |
no | null |
Null when the observed state could not be read: nothing was measured. | |
last_health_transition_at |
integer, nullable | no | null |
When observed last changed (epoch seconds); null when it could not be read or is not yet known. | |
observed |
string | yes | n/a | unknown | starting | running | unresponsive | crashloop | stopped; unknown, with observed_reason, when the hosting node has no provider for the instance yet or cannot be reached. | |
observed_reason |
string, nullable | no | null |
Why PanAPI could not read the instance’s observed state, when observed is unknown for that reason. Never the gateway’s own error, which is health.last_error. | |
tenant_id |
string | yes | n/a |
S3PrefixRequest
Request body for PUT /s3/prefix.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
prefix |
string | yes | n/a | Realm-wide POSIX-style path prefix. Empty string means “no realm-wide prefix”; otherwise the value MUST begin with “/” and MUST NOT contain trailing whitespace. |
Example
{
"prefix" : "/realm-root"
}S3PrefixResponse
Response body for GET /s3/prefix and PUT /s3/prefix.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
prefix |
string | yes | n/a | Current realm-wide path prefix. |
Example
{
"prefix" : "/realm-root"
}S3Profile
S3 access profile of a PanFS user.
DISABLED- credentials are stored but the reveal endpoint returns 404 (which the S3 gateway maps toauth.ErrNoSuchUser).USER- S3 gatewayrole=user.PRIVILEGED- S3 gatewayrole=userplus(bucket-creation rights). The operator-facing profile name isprivileged; the gateway-internal role string it maps to staysuserplus.
This docstring is published as the enum’s description in the OpenAPI document, so it says what a caller may choose and nothing else.
Allowed values: disabled, user, privileged
S3TlsConfigResponseSchema
TLS settings as returned by GET /tenants/{tid}/s3.
Same fields as the TLS settings accepted on write, but with private_key redacted, so the response body never carries the tenant TLS private key in plaintext.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
ca_certificate |
string, nullable | no | null |
PEM-encoded CA certificate. | |
certificate |
string, nullable | no | null |
PEM-encoded server certificate. | |
mode |
S3TlsMode (realm-generated, tenant-provided) |
no | realm-generated |
Source of the tenant-wide S3 edge cert. | |
private_key |
string, nullable | no | null |
PEM-encoded private key. Redacted to *** on response when present; null when no key is configured. |
Example
{
"ca_certificate" : "-----BEGIN CERTIFICATE-----\n...",
"certificate" : "-----BEGIN CERTIFICATE-----\n...",
"mode" : "realm-generated",
"private_key" : "***"
}S3TlsConfigSchema
Tenant-wide TLS material for the S3 gateway.
The S3 data plane is always TLS-terminated. A single cert+key is served by the whole tenant S3 surface (the aggregator frontend and every per-instance endpoint), whatever SNI the client sends.
mode selects the cert source explicitly - never inferred from the presence of cert material:
realm-generated(default): the realm mints the cert and stores it, with the SANs*.s3-<short>.<zone>,s3-<short>.<zone>when the aggregator is on, and the addresses on the tenant’s subnets of the nodes that serve it. The request body MUST NOT carry cert material in this mode.tenant-provided: the tenant suppliescertificateandprivate_key(and optionallyca_certificate); the realm validates them at config-set. The cert carries the names and addresses its clients use; only withdns.mode=panfsmust it also carry the names the realm publishes (*.s3-<short>.<zone>, pluss3-<short>.<zone>when the aggregator is on).
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
ca_certificate |
string, nullable | no | null |
PEM-encoded CA certificate. | |
certificate |
string, nullable | no | null |
PEM-encoded server certificate. | |
mode |
S3TlsMode (realm-generated, tenant-provided) |
no | realm-generated |
Explicit source of the tenant-wide S3 edge cert: realm-generated (the realm mints it) or tenant-provided (tenant supplies the cert+key). |
|
private_key |
string, nullable | no | null |
PEM-encoded private key. |
Example
{
"ca_certificate" : "-----BEGIN CERTIFICATE-----\n...",
"certificate" : "-----BEGIN CERTIFICATE-----\n...",
"mode" : "tenant-provided",
"private_key" : "-----BEGIN PRIVATE KEY-----\n..."
}S3TlsMode
Explicit source of the tenant-wide S3 edge cert.
The cert source is an explicit, tenant-wide choice - never inferred from the presence of cert material. A single cert+key in the blob is served by the whole tenant S3 surface in both modes; the mode decides who produced the bytes, and with it which names the cert must carry ().
Allowed values: realm-generated, tenant-provided
ServiceAccountCreateRequest
Request to create a service account.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
description |
string, nullable | no | null |
What this account is for. Newlines and tabs are allowed; other control characters are not. | |
display_name |
string, nullable | no | null |
Human-readable label. Control and invisible characters are not allowed. | |
name |
string | yes | n/a | Unique name within the tenant, 4-30 characters of lowercase letters, digits and hyphens, starting with a letter. Identifies the account wherever it appears; it cannot be changed afterwards. |
Example
{
"display_name" : "Nightly CI",
"name" : "ci-nightly"
}ServiceAccountListResponse
Every service account in the caller’s tenant, newest first.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
service_accounts |
array of ServiceAccountResponse object |
yes | n/a | The accounts. | |
total |
integer | yes | n/a | How many accounts are listed. |
ServiceAccountResponse
One service account.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
created_at |
string (date-time) | yes | n/a | When the account was created. | |
created_by |
string (uuid) | yes | n/a | The user that created it. | |
description |
string, nullable | no | null |
What this account is for. | |
display_name |
string, nullable | no | null |
Human-readable label. | |
id |
string (uuid) | yes | n/a | Identifier of the service account. | |
name |
string | yes | n/a | Unique name within the tenant, 4-30 characters of lowercase letters, digits and hyphens, starting with a letter. Identifies the account wherever it appears; it cannot be changed afterwards. | |
updated_at |
string (date-time) | yes | n/a | When the account was last changed. |
ServiceAccountUpdateRequest
Request to update a service account. Only the fields present are applied.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
description |
string, nullable | no | null |
What this account is for. Newlines and tabs are allowed; other control characters are not. | |
display_name |
string, nullable | no | null |
Human-readable label. Control and invisible characters are not allowed. |
Example
{
"description" : "Nightly backup runner"
}ServiceInstance
Which instance of a service the move_service action targets.
Allowed values: primary, backup
SetRolesRequest
Request payload for replacing the full role set of a Tenant User.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
roles |
array of string | yes | n/a | ["admin"] |
Roles to assign to the user; replaces the current set. A role the target tenant does not define, or a reserved one, is rejected with HTTP 400. |
StorageSet
StorageSet for list/detail responses.
Only fields relevant for the API response are included; more can be added in future versions.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
capacity_balancing |
boolean | yes | n/a | Whether automatic capacity balancing across nodes is enabled | |
encrypted |
boolean | yes | n/a | Whether the StorageSet encrypts data at rest | |
fips_mode |
boolean | yes | n/a | Whether the StorageSet operates in FIPS mode | |
id |
integer | yes | n/a | StorageSet ID | |
mlec |
boolean | yes | n/a | Whether Multi-Level Erasure Coding is enabled. Fixed when the StorageSet is created | |
name |
string | yes | n/a | StorageSet name | |
nodes_not_responding |
integer | yes | n/a | Number of offline nodes/OSDs that are unreachable with a recovery timer still running | |
nodes_offline |
integer | yes | n/a | Number of nodes/OSDs not online for any reason. Includes nodes_not_responding | |
nodes_online |
integer | yes | n/a | Number of nodes/OSDs currently online in this StorageSet | |
nodes_reconstructing |
integer | yes | n/a | Number of nodes/OSDs with a pending data rebuild, whether or not they are online | |
nodes_total |
integer | yes | n/a | Total number of nodes/OSDs assigned to this StorageSet | |
spares_available |
integer | yes | n/a | Current number of spare units available for reconstruction | |
spares_requested |
integer | yes | n/a | Configured number of requested spare units | |
state |
StorageSetState object |
yes | n/a | Conditions the StorageSet currently holds, and their severity. | |
topology_aware_placement |
boolean | yes | n/a | Whether objects are placed with the enclosure topology in mind | |
ure_default |
boolean | yes | n/a | Whether the StorageSet uses the default unrecoverable-read-error handling | |
vhosts_total |
integer | yes | n/a | Total number of virtual storage hosts assigned to this StorageSet |
Example
{
"capacity_balancing" : true,
"encrypted" : false,
"fips_mode" : false,
"id" : 1,
"mlec" : false,
"name" : "Set 1",
"nodes_not_responding" : 0,
"nodes_offline" : 0,
"nodes_online" : 6,
"nodes_reconstructing" : 0,
"nodes_total" : 6,
"spares_available" : 2,
"spares_requested" : 2,
"state" : {
"conditions" : [],
"status" : "ok"
},
"topology_aware_placement" : false,
"ure_default" : false,
"vhosts_total" : 6
}StorageSetAddStorageActionRequest
Request to perform an add_storage action on a StorageSet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal add_storage |
yes | n/a | The action to perform on the storageset. | |
params |
StorageSetAddStorageParams object |
yes | n/a | Parameters required to perform the add_storage action. |
StorageSetAddStorageMode
Operation mode for add_storage action.
Allowed values: add_spare, migration
StorageSetAddStorageParams
Parameters for the add_storage action on a StorageSet.
Supports two modes: - add_spare: Expand capacity and adjust spare storage node count - migration: Add storage to help drain another enclosure
Dataserials are storage nodes (OSDs/VPODs) by name or serial. If not specified, all unassigned nodes are added.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
dataserials |
array of string | no | n/a | List of dataserial names or serial numbers (OSD and VPOD nodes) to add. If omitted or provided as an empty list ([]), the behavior is the same: all unassigned OSD and VPOD nodes in the system are added. | |
mode |
StorageSetAddStorageMode (add_spare, migration) |
yes | n/a | Operation mode: “add_spare” to expand capacity while adjusting spare storage nodes, “migration” to add storage for draining another enclosure | |
spares_requested |
integer, nullable | no | null |
For add_spare mode: count of spare storage nodes to add (0 or greater). A value of 0 means add zero spare nodes, keeping the current spare count unchanged. For migration mode: must not be provided (omit from request). Providing this field in migration mode will fail validation. |
StorageSetAlertStatus
Active-alert presence for one storage set.
Feeds the storage-set status badge, which the frontend computes by combining this with the set’s node/spare counts. Only sets carrying at least one active PanFS alert appear in the response; absence means “no alerts”.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
has_critical |
boolean | yes | n/a | At least one active critical/error alert. | |
has_warning |
boolean | yes | n/a | At least one active warning alert. | |
storageset_name |
string | yes | n/a | Storage set name as it appears in the alert message. |
StorageSetAssignment
Storage set assignment with per-tenant quota.
Represents the allocation of a specific storage set to a tenant, including the maximum storage quota the tenant can consume within that storage set.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
quota_bytes |
integer | yes | n/a | 2199023255552, 5497558138880 |
Maximum storage quota in bytes that the tenant can consume within this storage set. |
storageset_id |
integer | yes | n/a | 1, 2, 5 |
Identifier of the assigned storage set. |
storageset_name |
string | no | (empty string) | Set 1, Production Set |
Name of the assigned storage set, resolved server-side so tenant callers need no access to the platform storageset endpoints. Empty only if the storage set is no longer present on the cluster. |
Example
{
"quota_bytes" : 2199023255552,
"storageset_id" : 1,
"storageset_name" : "Set 1"
}StorageSetCondition
A condition a storageset can be in. Several hold at once; each carries a status.
Allowed values: no_osds_assigned, activating, partly_offline, all_nodes_offline, reconstructing, spare_shortfall, recon_reserve_not_enough_osds, recon_reserve_not_enough_space
StorageSetCreateRequest
Request payload for creating a StorageSet.
Requires a unique StorageSet name. Optional parameters use system defaults when omitted.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
flags |
array of StorageSetFlag (ure_default, capacity_balancing_disabled, encrypted, fips_mode, topology_aware_placement, mlec) |
no | n/a | ["mlec"], [] |
Flags to set during StorageSet creation. |
name |
string | yes | n/a | Set 2, Production Set |
Unique display name of the StorageSet. Must be unique within the realm. |
spares_requested |
integer | no | 2 |
2, 4, 6 |
Number of VPODs to be reserved for reconstruction within the new StorageSet. Default: 2. |
Example
{
"flags" : [
"mlec"
],
"name" : "Set 1",
"spares_requested" : 4
}StorageSetCreateResponse
Minimal response for successful StorageSet creation.
Returned on POST /storagesets to signal successful creation. Clients should fetch full details via GET /storagesets if needed.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
integer | yes | n/a | 1, 2, 3 |
Unique StorageSet identifier assigned by the system |
Example
{
"id" : 3
}StorageSetFlag
Flags a client may set when creating a storageset. The realm’s own flags are read back as fields.
Allowed values: ure_default, capacity_balancing_disabled, encrypted, fips_mode, topology_aware_placement, mlec
StorageSetGetResponse
Detailed view of a single StorageSet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
storageset |
StorageSet object |
yes | n/a | StorageSet entity with all available details. |
Example
{
"storageset" : {
"capacity_balancing" : true,
"encrypted" : false,
"fips_mode" : false,
"id" : 1,
"mlec" : false,
"name" : "Set 1",
"nodes_not_responding" : 0,
"nodes_offline" : 0,
"nodes_online" : 6,
"nodes_reconstructing" : 0,
"nodes_total" : 6,
"spares_available" : 2,
"spares_requested" : 2,
"state" : {
"conditions" : [],
"status" : "ok"
},
"topology_aware_placement" : false,
"ure_default" : false,
"vhosts_total" : 6
}
}StorageSetListResponse
Collection response for StorageSet list operations.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
storagesets |
array of StorageSet object |
no | n/a | Array of StorageSet objects | |
total |
integer | yes | n/a | 1, 5, 10 |
Total count of StorageSets in this response. |
Example
{
"storagesets" : [
{
"capacity_balancing" : true,
"encrypted" : false,
"fips_mode" : false,
"id" : 1,
"mlec" : false,
"name" : "Set 1",
"nodes_not_responding" : 0,
"nodes_offline" : 0,
"nodes_online" : 6,
"nodes_reconstructing" : 0,
"nodes_total" : 6,
"spares_available" : 2,
"spares_requested" : 2,
"state" : {
"conditions" : [],
"status" : "ok"
},
"topology_aware_placement" : false,
"ure_default" : false,
"vhosts_total" : 6
}
],
"total" : 1
}StorageSetPatchRequest
Request payload for updating an existing StorageSet via PATCH.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
capacity_balancing_disabled |
boolean, nullable | no | null |
true, false |
True to disable capacity balancing (set flag), False to enable it (clear flag). |
name |
string, nullable | no | null |
Set 3, Production Set |
Updated StorageSet name. Must be unique within the realm. |
spares_requested |
integer, nullable | no | null |
1, 2, 4 |
Optional updated number of VPOD spares reserved for reconstruction. If provided, must be at least 1. |
Example
{
"capacity_balancing_disabled" : false,
"name" : "Set 3",
"spares_requested" : 3
}StorageSetSpaceCapacity
Capacity bucket with total, free, and used bytes.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
free |
integer | yes | n/a | 278234398720, 55650041856 |
Free (available) capacity in this bucket in bytes. |
total |
integer | yes | n/a | 333900152832, 278250110976 |
Total capacity of this bucket in bytes. |
used |
integer | yes | n/a | 15712256, 0 |
Used capacity in this bucket in bytes (total - free). |
StorageSetSpaceResponse
Space usage response for a StorageSet.
Three capacity buckets: raw - overall physical capacity across all buckets. usable - capacity available for data storage. reserved - reconstruction reserve held for spare rebuilds.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
capacity_balancing_active |
boolean | yes | n/a | true, false |
Whether automatic capacity balancing is currently active for this StorageSet. |
node_count |
integer | yes | n/a | 12, 6 |
Number of OSD nodes (storage blades) in this StorageSet. |
raw |
StorageSetSpaceCapacity object |
yes | n/a | Overall physical capacity across all buckets in this StorageSet. | |
reserved |
StorageSetSpaceCapacity object |
yes | n/a | Reconstruction reserve capacity. Held for spare rebuilds; not available for regular data storage. | |
usable |
StorageSetSpaceCapacity object |
yes | n/a | Capacity available for data storage (usable bucket). | |
volume_hard_quota |
integer | yes | n/a | 524288000, 0 |
Sum of hard quotas for all volumes in this StorageSet, in bytes. A create is reflected immediately; after a delete the RM releases the quota asynchronously, so this figure can briefly overstate the true sum. |
Example
{
"capacity_balancing_active" : true,
"node_count" : 6,
"raw" : {
"free" : 333884440576,
"total" : 333900152832,
"used" : 15712256
},
"reserved" : {
"free" : 55650041856,
"total" : 55650041856,
"used" : 0
},
"usable" : {
"free" : 278234398720,
"total" : 278250110976,
"used" : 15712256
},
"volume_hard_quota" : 524288000
}StorageSetState
Conditions a StorageSet currently holds, and the status they reduce to.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
conditions |
array of StorageSetCondition (no_osds_assigned, activating, partly_offline, all_nodes_offline, reconstructing, spare_shortfall, recon_reserve_not_enough_osds, recon_reserve_not_enough_space) |
no | n/a | ["partly_offline","reconstructing"], [] |
Every condition currently active. More than one can hold at a time; an empty list means “ok”. |
status |
StorageSetStatus (ok, informational, warning, critical) |
yes | n/a | ok, warning |
Severity of the most severe active condition, ordered “ok” < “informational” < “warning” < “critical”. “ok” means no condition is active. |
StorageSetStatus
Severity of a storageset’s worst active condition. Declared in ascending severity.
Allowed values: ok, informational, warning, critical
SubjectKind
What a token authenticates as.
Allowed values: user, service-account
Subnet
Subnet representation.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
addr_count |
integer | no | 0 |
Number of addresses bound to this subnet. Computed by the server. | |
addr_external |
boolean | no | false |
True when an outside allocator hands out the addresses. Fixed at create. | |
created_at |
string (date-time) | yes | n/a | Creation timestamp (UTC). | |
gateway |
string, nullable | no | null |
Default gateway address, or null when none is configured. | |
id |
string (uuid) | yes | n/a | Unique identifier of the subnet. | |
ip_range_base |
string | yes | n/a | Base IP address of the subnet range (IPv4 or IPv6). | |
ip_range_prefix |
integer | yes | n/a | CIDR prefix length. | |
mtu |
integer | yes | n/a | Maximum transmission unit (0 means the platform default). | |
name |
string | yes | n/a | Subnet name, unique per tenant. | |
range_end |
string, nullable | no | null |
Upper bound of the usable-address window, or null when the subnet has no window. | |
range_start |
string, nullable | no | null |
Lower bound of the usable-address window, or null when the subnet has no window. | |
segment_id |
integer | no | 0 |
Network segment identifier: a VLAN ID when segment_type is vlan and a VNI when it is vxlan. 0 means the identifier is unassigned. Bounded by 0-16777215, the wider of the two identifier spaces, so the document states the same ceiling a create request is held to. Fixed at create. | |
segment_type |
SubnetSegmentType (none, vlan, vxlan) |
no | none |
Kind of network segment the subnet is placed on. The realm owns the choice, so this is returned and never accepted. Fixed at create. | |
tenant_id |
string (uuid) | yes | n/a | UUID of the owning tenant, which is always a named tenant. | |
tunnel_udp_port |
integer | no | 0 |
UDP port carrying a tunnelled segment. 0 means unset, and the realm manager applies its own default. Bounded by 0-65535, the width of a UDP port. Fixed at create. | |
updated_at |
string (date-time) | yes | n/a | Last-modification timestamp (UTC). |
Example
{
"addr_count" : 12,
"addr_external" : false,
"created_at" : "2026-06-29T12:00:00Z",
"gateway" : "192.168.50.1",
"id" : "36a8995f-026b-47e1-88bd-7fb9e7239995",
"ip_range_base" : "192.168.50.0",
"ip_range_prefix" : 24,
"mtu" : 1450,
"name" : "storage-net",
"range_end" : "192.168.50.200",
"range_start" : "192.168.50.10",
"segment_id" : 10,
"segment_type" : "vlan",
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"tunnel_udp_port" : 0,
"updated_at" : "2026-06-29T12:30:00Z"
}SubnetCreateRequest
Request payload for creating a subnet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
addr_external |
boolean | no | false |
false, true |
Selects the address-allocation model. False leaves PanFS managing the addresses, true hands that to an outside allocator. Fixed at create and cannot be changed afterwards. |
gateway |
string, nullable | no | null |
192.168.50.1, null |
Optional default gateway address, in the same family as ip_range_base. |
ip_range_base |
string | yes | n/a | 192.168.50.0, fd00:dead:beef:: |
Base IP address of the subnet range (IPv4 or IPv6). |
ip_range_prefix |
integer | yes | n/a | 24, 64 |
CIDR prefix length. 1-32 for IPv4, 1-128 for IPv6. |
mtu |
integer | no | 0 |
0, 1450, 8950 |
The MTU of the subnet’s tenant interface on every realm node and every attached host. 0 selects the default, which is the realm’s primary network MTU less the encapsulation overhead (50 bytes on vxlan, 4 bytes on vlan): 1450 on vxlan over a 1500-byte primary network. Any other value, from 68 to 9216, has to leave that overhead within the primary network MTU. A larger one is refused with 400 naming the largest value that fits. |
name |
string | yes | n/a | storage-net, tenant_a-vlan10 |
Subnet name, unique per tenant. 3-31 chars from [A-Za-z0-9_-]. |
range_end |
string, nullable | no | null |
192.168.50.200, null |
Upper bound of the usable-address window, which is the range the realm allocates its own node addresses from. Supply it together with range_start, or omit both and let the realm derive the window, as range_start describes. |
range_start |
string, nullable | no | null |
192.168.50.10, null |
Lower bound of the usable-address window, which is the range the realm allocates its own node addresses from. The window must hold at least as many addresses as the realm primary pool. A host attached from outside the realm is placed outside this window. Supply it together with range_end, or omit both and the realm derives the window from the first usable host, as deep as its primary pool, so the subnet as stored reports a window this request did not carry. The realm refuses with 400 when it cannot read that pool, and then the window has to be named. Nothing is derived for a subnet whose addresses an outside allocator owns. |
segment_id |
integer | no | 0 |
0, 10, 100100 |
Network segment identifier: a VLAN ID when the realm runs 802.1Q and a VNI when it runs VXLAN. 0 leaves it unassigned. Otherwise the bound here is the wider of the two spaces, 1-16777215. The realm manager owns the narrower range that follows the realm segment type, and the uniqueness of the identifier across the realm. Fixed at create and cannot be changed afterwards. |
tunnel_udp_port |
integer | no | 0 |
0, 4789 |
UDP port carrying a tunnelled segment, which is meaningful when the realm runs VXLAN. 0 leaves it unset and the realm manager applies its own default. Otherwise the bound is 1-65535. Fixed at create and cannot be changed afterwards. |
Example
{
"addr_external" : false,
"gateway" : "192.168.50.1",
"ip_range_base" : "192.168.50.0",
"ip_range_prefix" : 24,
"mtu" : 1450,
"name" : "storage-net",
"range_end" : "192.168.50.200",
"range_start" : "192.168.50.10",
"segment_id" : 10,
"tunnel_udp_port" : 0
}SubnetCreateResponse
Minimal response for successful subnet creation.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
string (uuid) | yes | n/a | Server-assigned unique identifier of the created subnet. |
Example
{
"id" : "36a8995f-026b-47e1-88bd-7fb9e7239995"
}SubnetGetResponse
Detailed representation of a single subnet.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
subnet |
Subnet object |
yes | n/a | Subnet entity with all available details. |
Example
{
"subnet" : {
"addr_count" : 12,
"addr_external" : false,
"created_at" : "2026-06-29T12:00:00Z",
"gateway" : "192.168.50.1",
"id" : "36a8995f-026b-47e1-88bd-7fb9e7239995",
"ip_range_base" : "192.168.50.0",
"ip_range_prefix" : 24,
"mtu" : 1450,
"name" : "storage-net",
"range_end" : "192.168.50.200",
"range_start" : "192.168.50.10",
"segment_id" : 10,
"segment_type" : "vlan",
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"tunnel_udp_port" : 0,
"updated_at" : "2026-06-29T12:30:00Z"
}
}SubnetListResponse
A collection of subnets with a total count.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
subnets |
array of Subnet object |
no | n/a | Array of subnet objects. Empty array if none are found. | |
total |
integer | yes | n/a | 0, 1, 12 |
Total count of subnets returned. |
Example
{
"subnets" : [
{
"addr_count" : 12,
"addr_external" : false,
"created_at" : "2026-06-29T12:00:00Z",
"gateway" : "192.168.50.1",
"id" : "36a8995f-026b-47e1-88bd-7fb9e7239995",
"ip_range_base" : "192.168.50.0",
"ip_range_prefix" : 24,
"mtu" : 1450,
"name" : "storage-net",
"range_end" : "192.168.50.200",
"range_start" : "192.168.50.10",
"segment_id" : 10,
"segment_type" : "vlan",
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"tunnel_udp_port" : 0,
"updated_at" : "2026-06-29T12:30:00Z"
}
],
"total" : 1
}SubnetPatchRequest
Request payload for updating a subnet via PATCH (partial update).
Only the supplied fields are modified, and a patch carrying no field at all is refused here, so it answers 422 with the same envelope every other patch schema uses. A field supplied as null is cleared, which is how a gateway is removed and how a usable window is withdrawn by clearing both of its endpoints. name and mtu carry no meaning when cleared, so an explicit null is refused for them.
addr_external is absent by design: the flag is fixed at create, and extra='forbid' refuses a request that carries it. The four network segment values are absent for the same reason, and a patch naming any of them is refused with that field in the error location.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
gateway |
string, nullable | no | null |
192.168.50.254, null |
New default gateway address (IPv4 or IPv6). Null clears the gateway. |
mtu |
integer, nullable | no | null |
1450, 8950 |
New MTU. The MTU of the subnet’s tenant interface on every realm node and every attached host. 0 selects the default, which is the realm’s primary network MTU less the encapsulation overhead (50 bytes on vxlan, 4 bytes on vlan): 1450 on vxlan over a 1500-byte primary network. Any other value, from 68 to 9216, has to leave that overhead within the primary network MTU. A larger one is refused with 400 naming the largest value that fits. |
name |
string, nullable | no | null |
||
range_end |
string, nullable | no | null |
192.168.50.220, null |
New upper bound of the usable-address window. Patchable on its own. Null clears it, and clearing both bounds together has the realm derive the window anew, as range_start describes. |
range_start |
string, nullable | no | null |
192.168.50.20, null |
New lower bound of the usable-address window. Patchable on its own, and the realm manager validates the resulting pair against the subnet CIDR. Null clears it. Clearing both bounds together has the realm derive the window anew, on the same terms a create naming none gets one, and is refused with 409 while a subnet the realm addresses itself has an attached host. |
Example
{
"gateway" : "192.168.50.254",
"mtu" : 1500,
"name" : "storage-net-2",
"range_end" : "192.168.50.220",
"range_start" : "192.168.50.20"
}SubnetSegmentType
Kind of network segment a subnet is placed on.
The realm owns the choice, so a create request never names it. none means the realm named no type when the subnet was created.
none: the subnet’s segment is not describedvlan: 802.1Q, and the segment identifier is a VLAN IDvxlan: VXLAN, and the segment identifier is a VNI
Allowed values: none, vlan, vxlan
Tenant
Core tenant data model.
Represents a tenant with all its attributes. Used as the inner model in response wrappers (GetTenantResponse, ListTenantResponse).
The two names are published the other way round from the domain: name is the handle the domain calls short_name, and display_name is the label the domain calls name. The aliases hold that mapping, so a domain object validates straight into this view.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_settings |
LocalAuthSettings object or PamAuthSettings object |
yes | n/a | {"auth_mode":"local"}, {"auth_mode":"pam","service":"login"} |
Tenant authentication settings. |
created_at |
string (date-time) | yes | n/a | 2026-03-02T12:00:00Z |
Tenant creation timestamp. |
description |
string, nullable | no | null |
FinTech department tenant, Engineering team workspace |
Tenant description. |
display_name |
string | yes | n/a | FinTech, Engineering |
Human-readable tenant name. |
email |
string | yes | n/a | admin@fintech.example.com |
Tenant contact email address. |
id |
string (uuid) | yes | n/a | e97b94d6-9cc1-4325-a267-1064ae538ccd |
Tenant identifier (UUID). |
name |
string | yes | n/a | fintech, eng |
Tenant name used for volume mounting (3-10 alphanumeric characters). |
status |
TenantStatus (pending, configuring, active, archived) |
yes | n/a | pending, configuring, active |
How far the tenant’s network has been provisioned, as the realm manager reports it on every read: pending owns no subnet, configuring owns subnets that hold no node address yet, and active carries at least one node address. |
storageset_assignments |
array of StorageSetAssignment object |
no | n/a | List of storage sets assigned to the tenant, with per-set quotas and names. | |
updated_at |
string (date-time) | yes | n/a | 2026-03-15T09:30:00Z |
Last update timestamp. |
TenantCreateRequest
Request payload for creating a tenant.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_settings |
LocalAuthSettings object or PamAuthSettings object |
yes | n/a | {"auth_mode":"local"}, {"auth_mode":"pam","service":"login"} |
Tenant authentication settings. Discriminated on auth_mode. |
description |
string, nullable | no | null |
FinTech department tenant, Engineering team workspace |
Tenant description. |
display_name |
string | yes | n/a | FinTech, Engineering, Data Science |
Human-readable tenant name. Must be 1-255 printable characters. |
email |
string | yes | n/a | admin@fintech.example.com, ops@vdura.example.com |
Tenant contact email address. |
name |
string | yes | n/a | fintech, eng, datasci |
Tenant name, used for volume mounting and as the prefix of a tenant-qualified username. Must be 3-10 alphanumeric characters and unique within the system. Stored in lower case. platform is reserved. Immutable after creation. |
TenantCreateResponse
Minimal response for successful tenant creation.
Returned on POST /tenants to signal successful creation. Clients should fetch full details via GET /tenants/{tenant_id} if needed.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
string (uuid) | yes | n/a | e97b94d6-9cc1-4325-a267-1064ae538ccd |
Unique tenant identifier (UUID) assigned by the system |
Example
{
"id" : "e97b94d6-9cc1-4325-a267-1064ae538ccd"
}TenantPatchRequest
Request payload for updating a tenant via PATCH.
Allows partial updates. At least one field must be provided. Patchable fields: display_name, email, description, auth_settings. Tenant Admin can update display_name, email, description and auth_settings. name is the immutable handle and is not patchable.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_settings |
LocalAuthSettings object or PamAuthSettings object, nullable |
no | null |
{"auth_mode":"local"}, {"auth_mode":"pam","service":"login"} |
Updated tenant authentication settings. |
description |
string, nullable | no | null |
Updated tenant description, New department focus |
Updated tenant description. |
display_name |
string, nullable | no | null |
FinTech Renamed, Engineering 2.0 |
Updated human-readable tenant name. Must be 1-255 printable characters. |
email |
string, nullable | no | null |
admin@fintech.example.com |
Updated tenant contact email address. |
TenantRole
One role of the tenant catalog: its id, and the actions it allows on each resource.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
string | yes | n/a | admin |
Role identifier, as sent and received on the roles endpoints. |
permissions |
object | no | n/a | Resource to the actions this role may perform on it. | |
reserved |
boolean | no | false |
false |
Whether the role is reserved: a reserved role cannot be assigned to or revoked from any principal through the API. |
Example
{
"id" : "admin",
"permissions" : {
"roles" : [
"view",
"update"
],
"tenants" : [
"view"
],
"users" : [
"list",
"view",
"create",
"update",
"delete"
],
"volumes" : [
"list",
"view",
"create",
"update",
"delete",
"action"
]
},
"reserved" : false
}TenantRolesResponse
Catalog of roles available on the current tenant.
Returned on GET /tenants/roles.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
roles |
array of TenantRole object |
no | n/a | Array of roles the tenant policy defines. Empty array if the policy defines none. | |
total |
integer | yes | n/a | 2, 5 |
Total count of roles in this response. |
Example
{
"roles" : [
{
"id" : "admin",
"permissions" : {
"roles" : [
"view",
"update"
],
"tenants" : [
"view"
],
"users" : [
"list",
"view",
"create",
"update",
"delete"
],
"volumes" : [
"list",
"view",
"create",
"update",
"delete",
"action"
]
},
"reserved" : false
},
{
"id" : "s3-gateway",
"permissions" : {
"fs-users" : [
"read-s3-secret",
"list"
]
},
"reserved" : true
}
],
"total" : 2
}TenantStatus
Tenant lifecycle statuses.
States: - PENDING: tenant owns no subnet - CONFIGURING: the tenant owns subnets and no node has taken an address on any of them - ACTIVE: at least one node holds an address on one of the tenant’s subnets - ARCHIVED: tenant deleted and its data removed, and only the archive entry remains
Allowed values: pending, configuring, active, archived
TenantStorageSetQuotaRequest
Request body for assigning or resizing a tenant storageset quota.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
quota_bytes |
integer | yes | n/a | 2199023255552, 5497558138880 |
Maximum storage quota in bytes that the tenant can consume within this storageset. |
Example
{
"quota_bytes" : 2199023255552
}TenantSummarySchema
Short tenant info visible to platform admin.
The display_name and email are returned only by GET /tenants/{tenant_id}, not in this list view.
Deleted tenants are not here at all: they have their own entity and their own endpoint, GET /tenants/archived.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
created_at |
string (date-time) | yes | n/a | 2026-03-02T12:00:00Z |
Tenant creation timestamp. |
description |
string | yes | n/a | FinTech tenant |
Free-form tenant description. |
id |
string (uuid) | yes | n/a | e97b94d6-9cc1-4325-a267-1064ae538ccd |
Tenant identifier (UUID). |
name |
string | yes | n/a | fintech, eng |
Tenant name used for volume mounting. |
status |
TenantStatus (pending, configuring, active, archived) |
yes | n/a | pending, configuring, active |
How far the tenant’s network has been provisioned, as the realm manager reports it on every read: pending owns no subnet, configuring owns subnets that hold no node address yet, and active carries at least one node address. |
updated_at |
string (date-time) | yes | n/a | 2026-03-02T12:00:00Z |
Tenant last-modification timestamp. |
Example
{
"created_at" : "2026-03-02T12:00:00Z",
"description" : "FinTech tenant",
"id" : "e97b94d6-9cc1-4325-a267-1064ae538ccd",
"name" : "fintech",
"status" : "active",
"updated_at" : "2026-03-02T12:00:00Z"
}TenantSwitchRequest
Platform Admin request to exchange the current access token for a target-tenant one.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
tenant_id |
string (uuid) | yes | n/a | e97b94d6-9cc1-4325-a267-1064ae538ccd |
Target tenant to act in. |
ttl_minutes |
integer, nullable | no | null |
60, 480 |
Requested lifetime in minutes. Clamped server-side to the supported range (30 minutes - 12 hours); the granted lifetime is returned in expires_in. |
Example
{
"tenant_id" : "e97b94d6-9cc1-4325-a267-1064ae538ccd",
"ttl_minutes" : 60
}TokenResponse
Issued token pair returned by login and refresh endpoints.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_token |
string | yes | n/a | Short-lived JWT access token. | |
expires_in |
integer | yes | n/a | 3600 |
Access token lifetime in seconds. |
refresh_token |
string | yes | n/a | Long-lived JWT refresh token. | |
token_type |
literal bearer |
no | bearer |
User
Core Tenant User data model.
Represents a user account scoped to a single tenant. Used as the inner model in response wrappers (GetUserResponse, UserListResponse).
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_settings |
LocalAuthSettings object or PamAuthSettings object |
yes | n/a | {"auth_mode":"local"}, {"auth_mode":"pam","service":"login"} |
Authentication backend for this user, discriminated on auth_mode. |
created_at |
string (date-time) | yes | n/a | When the user was created. | |
created_by |
string (uuid), nullable | no | null |
The user that created it. Null for the built-in admin, which the bootstrap seeds. | |
display_name |
string, nullable | no | null |
Alice Anderson |
Human-readable full name. Optional; username remains the unique handle. |
email |
string, nullable | no | null |
alice@fintech.example.com |
Contact email for the Tenant User, or null if none is on file. |
id |
string (uuid) | yes | n/a | a1b2c3d4-e5f6-7890-abcd-ef1234567890 |
Tenant User identifier (UUID). |
updated_at |
string (date-time) | yes | n/a | When the user was last changed. | |
username |
string | yes | n/a | alice |
Tenant User username. |
Example
{
"auth_settings" : {
"auth_mode" : "local"
},
"created_at" : "2026-01-01T00:00:00Z",
"display_name" : "Alice Anderson",
"email" : "alice@fintech.example.com",
"id" : "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"updated_at" : "2026-01-01T00:00:00Z",
"username" : "alice"
}UserCreateRequest
Request payload for creating a Tenant User.
The password is hashed server-side before storage; the plaintext value is never persisted. The name must be unique within the tenant.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_settings |
LocalAuthSettings object or PamAuthSettings object |
yes | n/a | {"auth_mode":"local"}, {"auth_mode":"pam","service":"login"} |
Authentication backend for this user, discriminated on auth_mode. |
display_name |
string, nullable | no | null |
Alice Anderson |
Human-readable full name. Optional; username remains the unique handle. |
email |
string, nullable | no | null |
alice@fintech.example.com |
Optional contact email for the Tenant User. |
password |
string (password) | yes | n/a | Tenant User password (min 8 characters). Hashed server-side before storage. | |
username |
string | yes | n/a | alice |
Tenant User username. Must be unique within the tenant. Whitespace, control and invisible characters are not allowed. |
Example
{
"auth_settings" : {
"auth_mode" : "local"
},
"display_name" : "Alice Anderson",
"email" : "alice@fintech.example.com",
"password" : "secure-password",
"username" : "alice"
}UserCreateResponse
Minimal response for successful Tenant User creation.
Returned on POST /tenants/{tenant_id}/users. Clients should fetch full details via GET /tenants/{tenant_id}/users/{user_id} if needed.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
string (uuid) | yes | n/a | a1b2c3d4-e5f6-7890-abcd-ef1234567890 |
Unique Tenant User identifier (UUID) assigned by the system. |
Example
{
"id" : "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}UserListResponse
Collection response for Tenant User list operations.
Returned on GET /tenants/{tenant_id}/users.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
total |
integer | yes | n/a | 0, 5, 50 |
Total count of Tenant Users in this response. |
users |
array of User object |
no | n/a | Array of Tenant User objects. Empty array if no users found. |
Example
{
"total" : 1,
"users" : [
{
"auth_settings" : {
"auth_mode" : "local"
},
"created_at" : "2026-01-01T00:00:00Z",
"display_name" : "Alice Anderson",
"email" : "alice@fintech.example.com",
"id" : "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"updated_at" : "2026-01-01T00:00:00Z",
"username" : "alice"
}
]
}UserPatchRequest
Request payload for updating a Tenant User.
Allows partial updates of new_password, auth_settings, email and/or display_name; at least one must be supplied. Administrative operation - the caller does not need to supply the current password. Intended for Tenant Admin or Platform Admin use only.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
auth_settings |
LocalAuthSettings object or PamAuthSettings object, nullable |
no | null |
{"auth_mode":"local"}, {"auth_mode":"pam","service":"login"} |
Updated authentication backend for this user, discriminated on auth_mode. |
display_name |
string, nullable | no | null |
Alice Anderson |
Updated human-readable full name for the Tenant User. |
email |
string, nullable | no | null |
alice@fintech.example.com |
Updated contact email for the Tenant User. |
new_password |
string (password), nullable | no | null |
New password for the Tenant User (min 8 characters). Hashed server-side before storage. |
ValidationError
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
ctx |
object | no | n/a | ||
input |
any | no | n/a | ||
loc |
array of string or integer | yes | n/a | ||
msg |
string | yes | n/a | ||
type |
string | yes | n/a |
VictoriaLogsLogsqlEndpoint
Allowed path segments under VictoriaLogs /select/logsql/ (HTTP API).
Allowed values: query, tail, hits, facets, stats_query, stats_query_range, stream_ids, streams, stream_field_names, stream_field_values, field_names, field_values
Volume
Storage volume representation.
A volume is a logical storage container within a StorageSet that provides isolated namespace, quota management, and configurable data protection. Volumes can be exported via NFS and support features like snapshots, quotas, and recovery operations.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
efsa_mode |
EfsaMode (retry, file-unavailable, default) |
yes | n/a | retry, file-unavailable, default |
Current Extended File System Availability (EFSA) mode. Defines volume behavior during partial storage unavailability. |
hard_quota_bytes |
integer, nullable | no | null |
549755813888, 1099511627776 |
Configured hard quota limit in bytes. null indicates that no hard limit is enforced. |
id |
integer | yes | n/a | 1, 2, 42 |
Unique volume identifier within the system |
max_width |
integer, nullable | no | null |
12, 20 |
Configured maximum number of VPODs used for striping data in the volume. |
object_id |
string | yes | n/a | I-xD0200000000000005-xG82c418af-xU00004a75726a656e |
Root object ID as compound identifier string |
pathname |
string | yes | n/a | /, /home, /data |
Unique volume pathname within the system. |
quotas_policy |
QuotasPolicy (disable, enable, report, inherit, invalid) |
yes | n/a | disable, report, enable |
User and Group Quotas Policy status indicating whether quota enforcement is active |
raid_type |
string | yes | n/a | raid6+, raid5+, raid10+ |
Configured RAID layout of the volume. |
recovery_priority |
integer | no | 50 |
0, 1, 50, 100 |
Recovery priority of the volume (1-100). Lower values indicate higher recovery priority. |
rg_depth |
integer, nullable | no | null |
4, 16 |
Configured RAID group depth for the volume. |
rg_width |
integer, nullable | no | null |
8, 12 |
Configured RAID group width. |
soft_quota_bytes |
integer, nullable | no | null |
524288000000, 989560465024 |
Configured soft quota limit in bytes. null indicates that no soft limit is enforced. |
status |
VolumeStatus (none, creating, deleting, online, fsrc, offline, down, degraded, recon_available, snapping, recon_unavailable, paused) |
no | none |
Current operational status: ONLINE, DEGRADED, OFFLINE, etc. | |
storageset_id |
integer | yes | n/a | 1, 2, 5 |
Identifier of the StorageSet where this volume resides. |
stripe_unit_bytes |
integer, nullable | no | null |
262144, 1048576 |
Configured stripe unit size. Specifies the number of bytes written to a VPOD before advancing to the next VPOD in the stripe. |
tenant_id |
string (uuid) | yes | n/a | 550e8400-e29b-41d4-a716-446655440000, 00000000-0000-0000-0000-000000000000 |
UUID of the owning tenant. System/backend-created volumes with no tenant prefix (e.g. “/”, “/home”) are owned by the default tenant (all-zeros / PAN_UUID_ZERO). |
volume_service_id |
string | yes | n/a | 0x0400000000000005, 0x0400000000000006 |
Hexadecimal identifier of the volume service currently managing this volume. |
Example
{
"efsa_mode" : "retry",
"hard_quota_bytes" : 549755813888,
"id" : 1,
"max_width" : 12,
"object_id" : "I-xD0200000000000005-xG82c418af-xU00004a75726a656e",
"pathname" : "/",
"quotas_policy" : "enable",
"raid_type" : "raid6+",
"recovery_priority" : 1,
"rg_depth" : 4,
"rg_width" : 8,
"soft_quota_bytes" : 524288000000,
"status" : "online",
"storageset_id" : 1,
"stripe_unit_bytes" : 262144,
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"volume_service_id" : "0x0400000000000005"
}VolumeAccessMode
Volume access permission modes.
Used by the ‘volume set’ CLI command to control read/write access to the volume.
Modes: - read-only: volume is read-only for administrative purposes - read-write: volume is readable and writable (default)
Allowed values: read-only, read-write
VolumeCompressionMode
Volume compression mode.
Controls whether data compression is enabled for the volume.
Modes: - enable: compression is enabled for new data - disable: compression is disabled
Allowed values: enable, disable
VolumeCreateRequest
Request payload for creating a volume.
Mirrors the CLI “volume create” command. Requires a volume name and a StorageSet ID. Optional parameters use system defaults when omitted.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
efsa_mode |
EfsaMode (retry, file-unavailable, default) |
no | default |
retry, file-unavailable, default |
EFSA mode for the volume. Defines behavior during partial storage unavailability. Supported: retry, file-unavailable, default. If not specified, system default (retry) is applied. Only for RAID 5+, 6+, 10+ volumes. |
group |
string, nullable | no | null |
0, 100 |
Owner GID of the volume, as a numeric string (e.g. “0”, “100”). Defaults to root group (gid=0) if not specified. String name resolution and Windows SID are not supported. |
group_permissions |
VolumePermission (none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all), nullable |
no | null |
read-only, read-execute |
Filesystem permissions for the owner group on the root of the volume. Allowed values: none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all. |
hard_quota_bytes |
integer, nullable | no | null |
549755813888, null |
Hard quota in bytes. Prevents additional writes when limit is reached. A volume in a tenant requires a value greater than 0; a request without one returns 400. |
max_width |
integer, nullable | no | null |
12, 20 |
Maximum number of VPODs to stripe data across. Minimum depends on RAID layout: 2 for RAID 5+, 3 for RAID 6+, 2 for RAID 10+. If not specified, the system allows striping across the StorageSet. |
other_permissions |
VolumePermission (none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all), nullable |
no | null |
none, read-only |
Filesystem permissions for others on the root of the volume. Allowed values: none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all. |
pathname |
string | yes | n/a | /vol2, /data |
Required unique mount path of the volume. Must start with / and be unique within the system. |
raid_type |
VolumeLayout (raid6+, raid5+, raid10+, raid5, raid10) |
no | raid6+ |
raid6+, raid5+, raid10+, raid5, raid10 |
RAID layout for the volume. Default: raid6+. Cannot be changed after creation. |
recovery_priority |
integer | no | 50 |
0, 1, 50, 100 |
Recovery priority (1-100) of the volume. Lower values indicate higher recovery priority, where 1 represents the highest priority. If not specified the system default (50) is applied. |
rg_depth |
integer, nullable | no | null |
4, 16 |
RAID group depth (number of stripes per RAID parity group). Only for RAID 5+, 6+. If not specified, a system default value is applied. |
rg_width |
integer, nullable | no | null |
8, 12 |
RAID group width (VPODs to stripe over per single RAID group, 3-20). Only for RAID 5+, 6+. If not specified, a system default value is applied. |
soft_quota_bytes |
integer, nullable | no | null |
549755813888, null |
Soft quota limit in bytes. Triggers quota notifications when the threshold is exceeded. Use 0 or null for unlimited. |
storageset_id |
integer | yes | n/a | 1, 2, 5 |
Identifier of the StorageSet where the volume will be created. Required if multiple StorageSets exist. |
stripe_unit_bytes |
integer, nullable | no | null |
262144, 1048576 |
Specifies the number of bytes written to a VPOD before advancing to the next VPOD in the stripe. Must be a multiple of 16 KB (min: 16 KB, max: 4 MB). If not specified, a system default value is applied. |
user |
string, nullable | no | null |
0, 1001 |
Owner UID of the volume, as a numeric string (e.g. “0”, “1001”). Defaults to root (uid=0) if not specified. String name resolution and Windows SID are not supported. |
user_permissions |
VolumePermission (none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all), nullable |
no | null |
read-write, all |
Filesystem permissions for the owner user on the root of the volume. Allowed values: none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all. |
volume_service_id |
string, nullable | no | null |
0x0400000000000005 |
Identifier of the volume service that will manage this volume, in hexadecimal format (e.g., “0x0400000000000005”). This allows control over how volume management load is distributed across Directors. If not specified, the system automatically assigns the volume to an existing service. |
Example
{
"efsa_mode" : "retry",
"pathname" : "/vol2",
"raid_type" : "raid6+",
"recovery_priority" : 50,
"storageset_id" : 1
}VolumeCreateResponse
Minimal response for successful volume creation.
Returned on POST /volumes to signal successful creation without the full volume detail payload. Clients should fetch full details via GET /volumes/{volume_id} if needed.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
id |
integer | yes | n/a | 1, 2, 42 |
Unique volume identifier assigned by RM |
Example
{
"id" : 1
}VolumeGetResponse
Detailed representation of a single volume.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
volume |
Volume object |
yes | n/a | Volume entity with all available details. |
Example
{
"volume" : {
"efsa_mode" : "retry",
"hard_quota_bytes" : 549755813888,
"id" : 1,
"max_width" : 12,
"object_id" : "I-xD0200000000000005-xG82c418af-xU00004a75726a656e",
"pathname" : "/",
"quotas_policy" : "disable",
"raid_type" : "raid6+",
"recovery_priority" : 1,
"rg_depth" : 4,
"rg_width" : 8,
"soft_quota_bytes" : 524288000000,
"status" : "online",
"storageset_id" : 1,
"stripe_unit_bytes" : 262144,
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"volume_service_id" : "0x0400000000000005"
}
}VolumeLayout
Volume layout options derived from the CLI “volume create” command.
Layouts: - raid6+: RAID 6+ with dual parity and enhanced metadata redundancy (default) - raid5+: RAID 5+ with single parity and enhanced metadata redundancy - raid10+: RAID 10+ with mirroring and enhanced metadata redundancy - raid5: Legacy RAID 5 layout (service mode only) - raid10: Legacy RAID 10 layout (service mode only)
Allowed values: raid6+, raid5+, raid10+, raid5, raid10
VolumeListResponse
Represents a collection of volume objects along with the total number of available objects.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
total |
integer | yes | n/a | 0, 2, 150 |
Total count of volumes available (may exceed returned array size if paginated). |
volumes |
array of Volume object |
no | n/a | Array of volume objects matching the query. Empty array if no volumes found |
Example
{
"total" : 2,
"volumes" : [
{
"efsa_mode" : "retry",
"hard_quota_bytes" : 549755813888,
"id" : 1,
"object_id" : "I-xD0200000000000005-xG82c418af-xU00004a75726a656e",
"pathname" : "/",
"quotas_policy" : "enable",
"raid_type" : "raid6+",
"recovery_priority" : 1,
"soft_quota_bytes" : 524288000000,
"status" : "online",
"storageset_id" : 1,
"tenant_id" : "00000000-0000-0000-0000-000000000001",
"volume_service_id" : "0x0400000000000005"
},
{
"efsa_mode" : "retry",
"id" : 2,
"object_id" : "I-xD0200000000000006-xGc4f7a724-xU00004a75726a656e",
"pathname" : "/home",
"quotas_policy" : "disable",
"raid_type" : "raid6+",
"recovery_priority" : 50,
"status" : "online",
"storageset_id" : 1,
"tenant_id" : "e97b94d6-9cc1-4325-a267-1064ae538ccd",
"volume_service_id" : "0x0400000000000006"
}
]
}VolumePatchRequest
Request payload for updating an existing volume via PATCH.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
access_permission |
VolumeAccessMode (read-only, read-write), nullable |
no | null |
read-only, read-write |
Volume access permission mode. Set to read-only for administrative purposes |
compression |
VolumeCompressionMode (enable, disable), nullable |
no | null |
enable, disable |
Enable or disable compression for the volume. Affects new data only |
efsa_mode |
EfsaMode (retry, file-unavailable, default), nullable |
no | null |
retry, file-unavailable, default |
EFSA mode for the volume. Defines behavior during partial storage unavailability. Supported: retry, file-unavailable, default. If not specified, system default (retry) is applied. Only for RAID 5+, 6+, 10+ volumes. |
hard_quota_bytes |
integer, nullable | no | null |
1099511627776, 0 |
Hard quota in bytes. Prevents additional writes when limit is reached. A volume in a tenant requires a value greater than 0; a request without one returns 400. |
recovery_priority |
integer, nullable | no | null |
0, 1, 50, 100 |
Recovery priority (1-100) of the volume. Lower values indicate higher recovery priority, where 1 represents the highest priority. If not specified the system default (50) is applied. |
soft_quota_bytes |
integer, nullable | no | null |
549755813888, 0 |
Soft quota limit in bytes. Triggers quota notifications when the threshold is exceeded. Use 0 for unlimited. |
state |
VolumeStateOption (online, offline, paused), nullable |
no | null |
online, offline, paused |
Target operational state for the volume. Use to bring volume online/offline |
Example
{
"access_permission" : "read-write",
"efsa_mode" : "file-unavailable",
"hard_quota_bytes" : 1099511627776,
"recovery_priority" : 75,
"soft_quota_bytes" : 549755813888,
"state" : "online"
}VolumePermission
File permission presets for volume ownership configuration.
Permissions: - none: no permissions (000) - read-only: read-only access (r–) - write-only: write-only access (-w-) - execute-only: execute-only access (–x) - read-write: read and write access (rw-) - read-execute: read and execute access (r-x) - write-execute: write and execute access (-wx) - all: full permissions (rwx)
Allowed values: none, read-only, write-only, execute-only, read-write, read-execute, write-execute, all
VolumeRecoverActionParams
Parameters required to start File System Recovery on a volume.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
ignore_eligibility |
boolean | no | false |
When true, skip the volume eligibility precondition (PAN_VOLUME_F_FSRC_RECOMMENDED or PAN_VOLUME_F_FSRC_FAILED). | |
mode |
VolumeRecoverMode (recover, parity_scrub, no_scrub, check_only) |
no | recover |
recover, parity_scrub, no_scrub, check_only |
File System Recovery mode controlling the underlying RPC flag bitmask. |
VolumeRecoverActionRequest
Request to start File System Recovery on a volume.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal recover |
yes | n/a | The action to perform on the volume. | |
params |
VolumeRecoverActionParams object |
yes | n/a | Parameters required to perform the recover action. |
VolumeRecoverMode
Modes available when starting File System Recovery on a volume.
Allowed values: recover, parity_scrub, no_scrub, check_only
VolumeRenameActionParams
Parameters required to perform a rename action on a volume.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
new_pathname |
string | yes | n/a | /new_volume_name, /data_archive |
The new unique mount path for the volume. Must start with / and be unique within the system. |
VolumeRenameActionRequest
Request to perform a rename action on a Volume.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
action |
literal rename |
yes | n/a | The action to perform on the volume. | |
params |
VolumeRenameActionParams object |
yes | n/a | Parameters required to perform the rename action. |
VolumeSpaceResponse
Space usage response for a volume.
A volume’s capacity is bounded by its hard quota. Free space is the remaining capacity within that quota: hard_quota_bytes - used_bytes.
| Field | Type | Required | Default | Example | Description |
|---|---|---|---|---|---|
free_bytes |
integer | yes | n/a | 107374182400, 0 |
Remaining capacity within the hard quota (hard_quota_bytes - used_bytes). |
hard_quota_bytes |
integer, nullable | yes | n/a | 214748364800, 549755813888 |
Hard quota limit in bytes. This is the total capacity allocated to the volume. |
soft_quota_bytes |
integer, nullable | no | null |
193273528320, null |
Soft quota limit in bytes. Advisory threshold that triggers warnings. Null if not configured. |
used_bytes |
integer | yes | n/a | 107374182400, 0 |
Bytes consumed by this volume on disk. |
Example
{
"free_bytes" : 107374182400,
"hard_quota_bytes" : 214748364800,
"soft_quota_bytes" : 193273528320,
"used_bytes" : 107374182400
}VolumeStateOption
Volume state options for administrative state transitions.
Used by the ‘volume state’ CLI command to move volumes between operational states.
States: - online: bring volume online and serve I/O - offline: take volume offline (clients block and retry) - paused: take volume offline with I/O errors (service mode only)
Allowed values: online, offline, paused
VolumeStatus
Human-readable volume status.
Mirrors pan_volume_state from the proto definition and exposes descriptive string values in the REST API instead of raw integers.
States: - NONE: state is unknown or not yet initialized - CREATING: volume is being created and not fully available - DELETING: volume is being deleted and may be partially unavailable - ONLINE: volume is fully online and serving I/O - FSRC: volume is undergoing FSRC (file system recovery/check) operations - OFFLINE: volume is intentionally offline and not serving I/O - DOWN: volume is down due to failures and not accessible - DEGRADED: volume is online but running with reduced redundancy - RECON_AVAILABLE: reconstruction is in progress but volume is still available - SNAPPING: volume snapshot operation is in progress - RECON_UNAVAILABLE: reconstruction is in progress and volume is unavailable - PAUSED: volume activity is administratively paused
Allowed values: none, creating, deleting, online, fsrc, offline, down, degraded, recon_available, snapping, recon_unavailable, paused