Velocity • Durability

8. Command Reference

Unless noted otherwise, all list/get commands are read-only and safe to run at any time.

8.1 realm

Alias: rlm. The realm is the VDURA cluster as a whole; there is only one, so this group has a single, argument-free verb.

Command Purpose
realm get Show realm-wide state and configuration
panctl realm get
panctl realm get -o 'jsonpath={.realm.state}'

Requires the platform-admin role. Fields include state, locked, clientmode_current, heartbeat_period_seconds, volume_max_vols_realm, and more.

8.2 nodes

Aliases: node, no, n. Physical/virtual storage nodes in the realm, identified by their dataserial (not a name).

Command Purpose
nodes list List all nodes
nodes get <dataserial> Show one node’s details
nodes reboot <dataserial> Reboot a node
$ panctl nodes list
DATASERIAL      IP ADDRESS   STATUS  ROLE   STORAGESET ID  CAPACITY BYTES
109a58fc3162ef  10.97.5.237  online  vosd   0              55650025472
panctl nodes get 109a58fc3162ef
panctl nodes reboot 109a58fc3162ef

Notes: - A STORAGESET ID of 0 means the node isn’t assigned to a storage set yet. - reboot sends the request and returns immediately; there is no confirmation prompt.

8.3 storagesets

Aliases: storageset, ss, s. Pools of nodes that back tenant capacity and volumes.

Command Purpose
storagesets list List all storage sets
storagesets get <id> Show one storage set
storagesets create --name <name> [--spares-requested <n>] Create a storage set
storagesets update <id> -f <file> Update a storage set
storagesets delete <id> Delete a storage set
storagesets add-storage --storageset-id <id> --dataserials <a,b,c> [--mode add_spare\|migration] [--spares-requested <n>] Add nodes to a storage set
panctl storagesets create --name "Demo Set" --spares-requested 4
panctl storagesets get 4
panctl storagesets add-storage --storageset-id 4 \
  --dataserials 109a58fc3162ef,3f8889d66162f5 --spares-requested 2
panctl storagesets delete 4

Notes: - --dataserials cannot be left empty on add-storage; an empty list would mean “add every unassigned node in the realm,” so PanCTL blocks it to prevent an accidental mass operation. - add-storage returns immediately, but absorbing new nodes into the set happens asynchronously in the background. Poll to confirm completion: bash until [ "$(panctl storagesets get 4 -o 'jsonpath={.storageset.nodes_online}')" = "6" ]; do sleep 5; done

8.4 tenants

Aliases: tenant, tn, tx, t. Tenants are the isolation boundary for users, capacity, and volumes.

Command Purpose
tenants list List all tenants
tenants get <tenant_id> Show one tenant
tenants create --name <name> --short-name <name> --email <addr> [--auth-mode local\|pam] [--network ...] Create a tenant
tenants update <tenant_id> -f <file> Update a tenant
tenants delete <tenant_id> Delete a tenant (cascades to its volumes)
tenants assign-storagesets --tenant <ref> --storageset-id <id> --quota <size> Grant/resize a tenant’s capacity in a storage set
tenants unassign-storagesets --tenant <ref> --storageset-id <id> Remove a tenant’s access to a storage set
tenants list-storagesets --tenant <ref> List storage sets assigned to a tenant
tenants get-storageset --tenant <ref> --storageset-id <id> Show one tenant/storage-set assignment
panctl tenants create --name FinTech --short-name fintech --email admin@fintech.example.com
panctl tenants assign-storagesets --tenant fintech --storageset-id 4 --quota 10GB
panctl tenants list-storagesets --tenant fintech
panctl tenants delete <tenant_id>

Notes: - Multi-tenancy is not supported on InfiniBand. tenants create is refused with a 409 Conflict on a realm whose clients connect over InfiniBand, because tenant isolation needs VLAN or VXLAN encapsulation. Ethernet realms are not affected, and a realm that already runs without tenants is unchanged. - --tenant accepts either the tenant’s UUID or its short name; PanCTL resolves short names for you. - --short-name is 3–10 alphanumeric characters and cannot be changed after creation. - assign-storagesets acts as an “upsert”: if the tenant already has capacity in that storage set, this call resizes the quota instead of failing. - Creating a volume successfully is not, by itself, proof that assign-storagesets succeeded; confirm assignment separately with list-storagesets if you need to be certain. - tenants delete has no confirmation prompt and deletes the tenant’s volumes along with it.

8.5 volumes

Aliases: volume, vol, v. File-system volumes within your own tenant.

Command Purpose
volumes list List volumes
volumes get <volume_id> Show one volume
volumes create --name <path> --storageset-id <id> --hard-quota <size> [options] Create a volume
volumes update <volume_id> -f <file> Update quotas, recovery priority, etc.
volumes rename <volume_id> -f <file> Rename (change the path of) a volume
volumes delete <volume_id> Delete a volume
panctl volumes create --name /data --storageset-id 1 --hard-quota 10GiB \
  --soft-quota 8GiB --raid-type raid5+ --recovery-priority 1

echo '{"new_pathname":"/archive/volume1"}' | panctl volumes rename 3 -f -
echo '{"hard_quota_bytes":21474836480}' | panctl volumes update 3 -f -
panctl volumes delete 3

create options:

Flag Notes
--name <path> Required. A leading / is added automatically if missing.
--storageset-id <id> Required.
--hard-quota <size> Required by PanCTL (even though the API treats it as optional) so a limit is always chosen deliberately. 0 means unlimited.
--soft-quota <size> Optional. 0 means unlimited.
--raid-type <layout> Optional, cannot be changed after creation.
--efsa-mode <mode> Optional.
--recovery-priority <0-100> Optional; lower number = higher priority.

Notes: - volumes create always creates the volume in your own tenant; there’s no --tenant flag on this command. - Before creating a volume, make sure: the target storage set has enough online capacity for the chosen RAID layout, your tenant has capacity assigned there (see tenants assign-storagesets), and your tenant has a subnet with an available address. - rename only changes the volume’s path; update changes everything else (quotas, priority) but not the path or RAID type.

8.6 subnets

Aliases: subnet, sub, sn. Per-tenant IP address ranges used by clients to reach volumes, plus their client attachments.

Command Purpose
subnets list [--tenant <ref>] List subnets
subnets get <subnet_id> Show one subnet
subnets create --tenant <ref> --name <name> --cidr <addr/prefix> [options] Create a subnet
subnets update <subnet_id> [options] Update a subnet
subnets delete <subnet_id> Delete a subnet
subnets attachments list <subnet_id> List client attachments on a subnet
subnets attachments get <subnet_id> <attachment_id> Show one attachment
subnets attachments create <subnet_id> --underlay-ip <ip> [options] Attach a client
subnets attachments delete <subnet_id> <attachment_id> Remove an attachment
panctl subnets create --tenant fintech --name fintech-net --cidr 10.71.0.0/16 \
  --gateway 10.71.255.254 --mtu 9000 --range-start 10.71.0.1 --range-end 10.71.1.255

panctl subnets attachments create <subnet_id> --underlay-ip 10.128.9.0 --hostname client01
panctl subnets update <subnet_id> --mtu 1500
panctl subnets delete <subnet_id>

Notes: - Size your CIDR generously; use at least a /16 for a tenant subnet, not a /24. Internal addressing places storage-node addresses 256 addresses into the range, and a /24 will silently strand them with no error message. - Subnets are identified by UUID, not a numeric ID. - Attachment create/delete are tenant-scoped operations; even a platform administrator must be logged in as a user of that tenant to manage attachments (a platform-admin session gets a permissions error, even though it can create/delete the subnet itself). - --segment-id, --tunnel-udp-port, and --addr-external can only be set at creation time.

8.7 users

Aliases: user, us, u. Human user accounts. All users are platform-level; there are no separate tenant users.

Command Purpose
users list [--tenant <ref>] List users in a tenant
users get <user_id> [--tenant <ref>] Show one user
users create --tenant <ref> --username <name> [options] Create a user
users update <user_id> --tenant <ref> -f <file> Update a user
users delete <user_id> --tenant <ref> Delete a user
users get-roles --user-id <id> --tenant <ref> Show a user’s roles
users set-roles --user-id <id> --tenant <ref> --roles <a,b> Replace a user’s roles
panctl users create --tenant fintech --username jsmith --email jsmith@fintech.example.com
panctl users set-roles --user-id <user_id> --tenant fintech --roles platform-read-only
panctl users get-roles --user-id <user_id> --tenant fintech
panctl users delete <user_id> --tenant fintech

Notes: - If --tenant is omitted, PanCTL infers it from the short-name prefix of your own logged-in username. It’s safer to always pass --tenant explicitly in scripts. - set-roles replaces the entire role set, it does not add to it. Pass --roles '' to revoke all roles from a user. - There are no tenant roles. The only roles are platform-admin, platform-read-only, and storage-admin, and every user is a platform-level user. See 8.9 for what each role allows.

8.8 service-accounts

Alias: sa. Non-human accounts intended for automation, scoped to the platform rather than a tenant.

Command Purpose
service-accounts list List service accounts
service-accounts get <id> Show one service account
service-accounts create --name <name> [--display-name <name>] [--description <text>] Create a service account
service-accounts update <id> [options] Update display name/description
service-accounts delete <id> Delete a service account
service-accounts get-roles --sa-id <id> Show a service account’s roles
service-accounts set-roles --sa-id <id> --roles <a,b> Replace a service account’s roles
service-accounts tokens create --sa-id <id> --name <label> --expires-in-days <n> Mint an API token for the service account
service-accounts tokens list --sa-id <id> [--active-only] List a service account’s tokens
service-accounts tokens revoke <token_id> --sa-id <id> [--reason <text>] Revoke a token
panctl service-accounts create --name ci-runner --display-name "CI Runner"
panctl service-accounts set-roles --sa-id <sa_id> --roles storage-admin

TOKEN=$(panctl service-accounts tokens create --sa-id <sa_id> --name ci --expires-in-days 90 -o jsonpath='{.token}')
PANCTL_API_SERVER=<server> panctl auth whoami --token "$TOKEN"

Notes: - A service account’s --name is immutable after creation; only display name and description can be updated. - Available roles: platform-admin, platform-read-only, and storage-admin. See 8.9 for what each one allows. - This is the recommended pattern for giving an automation pipeline its own credentials, separate from any individual administrator’s login.

8.9 roles

Aliases: role, ro, r. A read-only catalogue of what each role is permitted to do.

There are no tenant roles. A user or service account holds one or more of these three platform roles:

Role What it allows
platform-admin Full control. Create, update, and delete every resource (tenants, users, service accounts, StorageSets, volumes, S3 configuration, and more), change role assignments, and switch into a tenant.
platform-read-only List and view every resource, and create or delete API tokens.
storage-admin Everything platform-read-only allows, plus create, update, delete, and run actions on StorageSets and volumes.
Command Purpose
roles list Show all roles and their permitted actions
$ panctl roles list
ROLE                RESOURCE            ACTIONS
platform-admin      volumes             list, view, create, update, delete, action
...
platform-read-only  volumes             list, view
...
storage-admin       volumes             list, view, create, update, delete, action
...

The sample output is abbreviated; the command lists every resource for every role, one row per role and resource pair.

Useful for confirming exactly what a role grants before assigning it to a user or service account.

8.10 s3

The S3-compatible object gateway. Some commands are realm-wide (platform administrators only) and some are per-tenant (--tenant <ref>).

Realm-wide configuration:

Command Purpose
s3 enabled get / s3 enabled set <true\|false> Enable/disable the S3 gateway realm-wide
s3 port-range get / s3 port-range set <start> <end> View/set the gateway’s port range
s3 prefix get / s3 prefix set <path> View/set the realm-wide path prefix

Per-tenant configuration:

panctl s3 get-config --tenant fintech
panctl s3 set-config --tenant fintech --enabled true --prefix /vol1/fintech \
  --owner alice --group staff --dir-mode 0755 --obj-mode 0644
panctl s3 dns panfs --tenant fintech
panctl s3 tls renew --tenant fintech

Instances (gateway processes running on specific nodes, identified by an instance ID iid):

panctl s3 instances list --tenant fintech
panctl s3 instances create abc12 <dataserial> --tenant fintech
panctl s3 instances start abc12 --tenant fintech
panctl s3 instances stop-all --tenant fintech
panctl s3 instances delete-all --tenant fintech --yes

Buckets and credentials:

panctl s3 buckets create archive-2026 --tenant fintech
panctl s3 buckets list --tenant fintech
panctl s3 credentials reveal <access_key> --tenant fintech
panctl s3 credentials rotate <access_key> --tenant fintech

Notes: - s3 instances delete-all requires --yes (this is the only destructive command in PanCTL that enforces an explicit confirmation flag). - credentials reveal returns the current secret without changing it; credentials rotate generates a brand-new secret (the old one stops working immediately). Both print the secret in plain text, so handle the output carefully.

8.11 events

Aliases: ev, e. Recent system events (read-only).

panctl events list
panctl events list --limit 25
panctl events list --tenant fintech

Shows up to 200 of the most recent events (--limit accepts 1–200); this is the exact same feed shown in the web UI.

8.12 alerts

Alias: al. Currently active alerts (read-only, no flags).

panctl alerts list

This shows a live snapshot of active alerts (not a historical log), the same set that drives the alert badge in the web UI.

8.13 audit

Aliases: aud, ad. The administrative audit log (read-only).

panctl audit list
panctl audit list --tenant fintech --since 2h
panctl audit list --user <user_id> --only create,delete
panctl audit list --since 2026-09-04T22:00:00Z --until 2026-09-04T23:59:59Z
panctl audit get <request_id>
Flag Purpose
--tenant <ref> Filter to one tenant
--user <user_id> Filter to one user
--only <a,b> / --skip <a,b> Include or exclude specific action types
--since / --until Relative (2h, 2d) or absolute (RFC-3339) time bounds
--limit <n> Maximum records to return (no upper cap, unlike events)

audit get <request_id> drills into a single request; for a failed request, it also prints diagnostic details and relevant backend log lines.