CLI reference¶
Reference for the otherix operator CLI - the command-line client for the
Otherix control plane.
Hand-maintained
This page is written by hand against the cobra command tree. An
autogenerated reference (make docs-cli from the cobra command tree) is
planned; until then, treat the binary's own otherix <command> --help as
the final authority if anything here drifts.
Global flags¶
These persistent flags are registered on the root command and inherited by every subcommand.
| Flag | Default | Meaning |
|---|---|---|
--endpoint |
http://localhost:8080 (only when neither config nor env supply one) |
Control-plane base URL. |
--token |
(none) | API token; overrides $OTHERIX_API_TOKEN and any stored cluster token. |
--cluster |
(none) | Named cluster from the config file; overrides current-cluster. |
--config |
$OTHERIX_CONFIG, then ~/.otherix/config |
Config file path. |
Most resource subcommands also accept an output flag, -o / --output, whose
allowed values vary by command:
- Mutating / detail commands:
text(default),json. get/listcommands: addtableandyaml(the YAML form projects anotherix/v1manifest you can feed back tootherix create -f).nodecommands:text/table/json(noyaml).
Auth resolution precedence¶
Endpoint and token are resolved independently, each through its own chain. The first layer that supplies a value wins:
- Endpoint:
--endpointflag ->$OTHERIX_SERVER->--clusterentry -> current-cluster entry -> error. - Token:
--tokenflag ->$OTHERIX_API_TOKEN->--clusterentry -> current-cluster entry -> error.
When --cluster is set, only that named cluster is consulted on the config
layer (it does not fall back to current-cluster), mirroring kubectl --context.
Config file location¶
Resolved in order: --config flag -> $OTHERIX_CONFIG -> ~/.otherix/config.
The file is a kubectl-style YAML credential store managed by
otherix config; see that group to populate it.
otherix vm¶
Manage virtual machines (CP /v1/vms surface). VM positionals are names; UUID
literals are rejected by the server.
vm create¶
Create a VM from an image source (async; returns a task id). <name> is the
sole positional.
| Flag | Default | Meaning |
|---|---|---|
--image-url |
(required) | Source image URL to download and boot from. |
--image-sha256 |
(none) | Expected sha256, verified after download. Pins the image to exact content. |
--pull-policy |
if-not-present |
if-not-present reuses a cached image for the URL; always forces a fresh re-fetch from --image-url. A mutable URL is not re-fetched under if-not-present (see the Create-and-manage-VMs guide). |
--arch |
(required) | amd64 or arm64. |
--firmware |
(none) | Firmware name (mutually exclusive with --firmware-id). |
--firmware-id |
(none) | Firmware uuid (mutually exclusive with --firmware). |
--format |
(server default) | Disk format, e.g. qcow2 or raw. |
--disk-gib |
image virtual size | Root disk size in GiB. |
--pool |
cluster default pool | Storage pool name or uuid. |
--node |
(scheduler picks) | Placement hint: node name or uuid. |
--network |
(none, SLIRP fallback) | Bridge network name or uuid to attach one NIC. |
--vcpus |
2 |
vCPU count (1..128). |
--memory-mib |
2048 |
Memory in MiB (128..524288). |
--user-data |
(none) | Path to a #cloud-config user-data YAML, or - for stdin. Mutually exclusive with --no-cloud-init. |
--network-config |
(none) | Path to a cloud-init network-config YAML (netplan v2), or - for stdin. Mutually exclusive with --no-cloud-init. |
--no-cloud-init |
false |
Explicitly disable cloud-init. Mutually exclusive with --user-data and --network-config. |
--wait |
false |
Block until the task reaches terminal status. |
--wait-timeout |
10m |
Max wait when --wait is set. |
otherix vm create web-1 --image-url https://example.com/ubuntu.qcow2 \
--arch arm64 --vcpus 2 --memory-mib 2048 --wait
vm get¶
Show a VM's projection. -o text|json|yaml (default text).
vm list¶
Cursor-paginated list of visible VMs.
| Flag | Default | Meaning |
|---|---|---|
--pool |
(none) | Filter by pool name or uuid. |
--node |
(none) | Filter by current-location node name or uuid. |
--status |
(none) | Filter by status. |
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor from a previous page. |
-o, --output |
table |
table|json|yaml. |
--show-ids |
false |
Include VM UUIDs in the table. |
vm delete¶
Delete a VM (async). Prompts when stdin is a TTY unless --force.
| Flag | Default | Meaning |
|---|---|---|
--force |
false |
Skip the confirmation prompt. |
--wait |
false |
Block until terminal status. |
--wait-timeout |
10m |
Max wait when --wait is set. |
vm lifecycle (sync)¶
pause, resume, and reset are synchronous (single QMP call) and take a VM
positional plus -o text|json (default text).
vm pause <vm>- QMPstop(vCPUs freeze).vm resume <vm>- QMPcont.vm reset <vm>- QMPsystem_reset(hard reset, runtime identity preserved).
vm lifecycle (async)¶
start, stop, poweroff, and reboot are asynchronous; each takes a VM
positional plus --wait / --wait-timeout (10m).
vm start <vm>- boot the QEMU process; setsdesired_phase=running.vm stop <vm>- graceful ACPI shutdown.--forceshort-circuits to the poweroff endpoint (hard shutdown) instead.vm poweroff <vm>- hard power-off (QMP quit, then SIGKILL).vm reboot <vm>- graceful stop+start cycle (PID changes).
vm console¶
Attach to a VM's serial console interactively (the VM must be running). Press
Ctrl+] to bring up a local close prompt. No flags beyond the globals.
vm logs¶
Stream a VM's serial console output (kubectl-style).
| Flag | Default | Meaning |
|---|---|---|
--tail |
-1 (all) |
Trailing lines from history (0 = none). |
-f, --follow |
false |
Keep streaming live output after the history flush. |
vm migrate¶
Live-migrate a VM to another node (async). Every migration is a full storage
migration (the disks cross the wire); the default is a live cutover, --offline
stops the VM, copies it cold, and starts it on the target. With no --node the
scheduler picks a different eligible node. Returns a task and a first-class
migration resource - poll it with otherix migration get. See
the Live migration guide.
| Flag | Default | Meaning |
|---|---|---|
--node |
(scheduler picks a different node) | Target node name. |
--pool |
cluster default pool | Target storage pool name on the target node. |
--offline |
false |
Stop+copy+start instead of a live cutover. |
--bandwidth |
(uncapped) | Transfer-rate cap, e.g. 100m, 1g, or raw bytes/s. |
--max-downtime |
(server default) | Live-cutover downtime budget in milliseconds. |
--allow-postcopy |
false |
Allow post-copy escalation if pre-copy will not converge. |
--wait |
false |
Block until the backing task reaches terminal status (client-side bound only; the migration runs server-side regardless). |
--wait-timeout |
10m |
Max wait when --wait is set. |
otherix vm migrate web-1 # live, scheduler picks the target
otherix vm migrate web-1 --node node-3 # live, to a specific node
otherix vm migrate web-1 --offline # stop, move cold, start on target
otherix ssh¶
SSH into a VM by name through the control plane, with no public IP on the VM. See SSH access to VMs.
ssh¶
Open an interactive SSH session. Mints a short-lived guest certificate and tunnels
through the broker (gateway for overlay VMs, CP relay for bridge VMs). The VM must
have been created with --ssh-ingress.
| Flag | Default | Meaning |
|---|---|---|
--login |
root |
Guest login user. |
otherix ssh proxy <vm> <port> is the internal ProxyCommand primitive and is
not run by hand.
otherix forward¶
Forward a local TCP port to a VM's port through the control plane (arbitrary L4: databases, web UIs, metrics, a raw SSH port). See Port forwarding.
forward¶
Open a local listener and splice each connection to the VM's guest port. Each
connection is brokered independently. The positional port spec follows
kubectl port-forward:
REMOTE_PORT- binds the same port number locally.LOCAL_PORT:REMOTE_PORT- pins a specific local port (override a busy default).:REMOTE_PORT- picks an ephemeral local port (printed on start).
| Flag | Default | Meaning |
|---|---|---|
--address |
127.0.0.1 |
Bind host for the local listener (host only, e.g. 0.0.0.0). |
-L, --listen |
127.0.0.1:0 |
Local host:port shortcut; alternative to --address plus a local port in the spec. Mutually exclusive with both. |
otherix forward db-1 5432 # local 5432 -> db-1:5432; then: psql -h 127.0.0.1 -p 5432
otherix forward db-1 15432:5432 # pin a local port when 5432 is busy
otherix forward web-1 8080 --address 0.0.0.0 # expose on the LAN
otherix lb¶
Load balancers front a label-selected pool of VMs with active health checks. Addressed by name. See Load balancers.
lb create¶
Create a load balancer. Backends are the VMs whose labels match --selector
(labels are set at otherix vm create --label).
| Flag | Default | Meaning |
|---|---|---|
--port |
(required) | Guest TCP port traffic is sent to (1..65535). |
--selector |
(required) | Label match, k=v[,k=v...] (>=1 term). |
--health-port |
follow --port |
TCP port the health probe dials. |
--health-interval |
10 |
Seconds between probes (1..300). |
--health-timeout |
2 |
Per-probe connect timeout, seconds (1..60). |
--health-healthy-threshold |
2 |
Consecutive successes to mark a backend healthy (1..10). |
--health-unhealthy-threshold |
3 |
Consecutive failures to mark a backend unhealthy (1..10). |
-o, --output |
text |
text or json. |
lb list¶
List load balancers. Columns: NAME PORT SELECTOR STATUS TARGETS. STATUS is
healthy / degraded / unhealthy / no_backends; TARGETS is
<healthy>/<total> backends.
| Flag | Default | Meaning |
|---|---|---|
--limit |
20 |
Page size (1..200). |
--cursor |
Opaque cursor from a previous page. | |
-o, --output |
table |
table, json, or yaml. |
--show-ids |
false |
Include UUIDs. |
lb get¶
Show one load balancer, including per-backend health (healthy true/false, or
unknown for a warming backend). -o yaml emits an apply-ready manifest.
lb update¶
Update mutable fields. --selector replaces the whole selector.
| Flag | Default | Meaning |
|---|---|---|
--port |
New traffic port. | |
--selector |
New selector (replaces the previous one). | |
--health-* |
Any of the health-check flags above. |
lb delete¶
Delete a load balancer.
| Flag | Default | Meaning |
|---|---|---|
--force |
false |
Skip the confirmation prompt. |
lb connect¶
Open a local listener that balances each connection over the healthy backend pool. A long-lived listener load-balances because every connection re-brokers.
| Flag | Default | Meaning |
|---|---|---|
-L, --listen |
127.0.0.1:0 |
Local host:port to listen on. |
otherix ingress-grant¶
Scoped, optionally time-boxed access to a named set of (VM, port) targets for a
party with no Otherix account. Requires the vm:ingress-grant permission. See
Grant external access.
ingress-grant create¶
Create a grant and print its one-time bundle.
| Flag | Default | Meaning |
|---|---|---|
--vm |
(required) | host:port[,port...], repeatable (one VM per flag). Port 22 = SSH. |
--login |
root |
Guest login applied to every VM. |
--source-ip |
Pin the caller's source IP or CIDR (fail-closed). | |
--ttl |
(never) | Lifetime, e.g. 168h, 720h. Omit = never expires. |
--user |
Free-text recipient label. | |
-o, --output |
text |
text, json, or yaml. |
otherix ingress-grant create acme --vm web-1:22 --vm db-1:5432,8080 \
--login deploy --ttl 168h --source-ip 203.0.113.10/32
ingress-grant add-vm / remove-vm¶
Add or remove a VM on an existing grant.
otherix ingress-grant add-vm acme cache-1:6379 --login deploy
otherix ingress-grant remove-vm acme cache-1
ingress-grant list / get / revoke / delete¶
Manage grants. revoke disables a grant immediately (the kill switch); delete
removes it.
otherix ingress-grant list
otherix ingress-grant get acme
otherix ingress-grant revoke acme
otherix ingress-grant delete acme
otherix migration¶
Inspect VM migrations (CP /v1/migrations surface). Migrations are created by
otherix vm migrate, never here; this group is read-only plus a
best-effort cancel.
migration list¶
Cursor-paginated list of migrations visible to the caller.
| Flag | Default | Meaning |
|---|---|---|
--vm |
(none) | Filter by VM uuid. |
--node |
(none) | Filter by node uuid (source or target). |
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor from a previous page. |
-o, --output |
table |
table|json|yaml. |
migration get¶
Show a migration's projection (<id> positional). After a live migration this
includes a statistics: section - ram / disk bytes and total_time / downtime
/ setup_time. -o text|json|yaml (default text); text renders human units,
JSON keeps raw bytes and milliseconds.
migration cancel¶
Cancel a migration, best-effort (<id> positional). Returns the current task
state; leaves the VM safely on one node or the other, never split across both. No
flags beyond the globals.
otherix snapshot¶
Disk-only, crash-consistent, content-addressed VM snapshots. Snapshots are
created through vm snapshot (a VM sub-resource action) and managed
through the top-level snapshot group. See the
Snapshots guide and
concept page.
vm snapshot¶
Capture a snapshot of <vm> (CP POST /v1/vms/<vm>/snapshots, async).
| Flag | Default | Meaning |
|---|---|---|
--name |
snap<unix_seconds> |
Snapshot name, unique within the VM. |
--description |
(unset) | Optional free-text description. |
--artifact-pool |
cluster default | Artifact pool that sets the replication factor for this snapshot. |
--wait |
false |
Block until the capture task reaches a terminal status. |
--wait-timeout |
10m |
Max time the CLI blocks when --wait is set (the snapshot keeps producing server-side regardless). |
snapshot list / get / delete¶
otherix snapshot list [--vm <name>] [--status <status>]
otherix snapshot get <id>
otherix snapshot delete <id> # async; reclaims orphaned blobs automatically
vm create --from-snapshot¶
Recreate a fresh VM from a snapshot instead of an image URL (mutually exclusive
with --image-url). Architecture, format, and firmware come from the snapshot
manifest, so --arch and the image flags are not passed. The recreate can run on
any node; an absent blob is pulled peer-to-peer before boot.
otherix artifact-pool¶
Cluster-level content-addressed stores that set the replication factor for the
snapshots tagged into them. Every authenticated role can read them; create,
update, and delete are admin-only. See the
Snapshots guide.
artifact-pool create¶
| Flag | Default | Meaning |
|---|---|---|
--replication-factor |
1 |
Durability target: an integer >= 1, or all for every member. The control plane keeps each blob on that many live nodes and re-replicates after a node loss. |
--members |
all |
Which nodes may back the pool: all or a comma-separated node-name list. |
-o, --output |
text |
text or json. |
otherix artifact-pool create artifacts --replication-factor 2
otherix artifact-pool create artifacts --replication-factor all
artifact-pool list / get / update / delete¶
otherix artifact-pool list
otherix artifact-pool get artifacts
otherix artifact-pool update artifacts --replication-factor 3 # re-replicates existing snapshots immediately
otherix artifact-pool update artifacts --members node-a,node-b
otherix artifact-pool delete artifacts # refused while snapshots still reference it
The pool name is immutable; update changes only --replication-factor and/or
--members (at least one required).
otherix pool¶
Manage storage pools (CP /v1/storage-pools surface). Multi-instance: one pool
name may live on many nodes. create / delete are admin-only.
pool list¶
Cursor-paginated list of pool instances (one row per node).
| Flag | Default | Meaning |
|---|---|---|
--node |
(none) | Filter by owning node name or uuid. |
--type |
(none) | Filter by pool type (local_dir). |
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor. |
-o, --output |
table |
table|json|yaml. |
--show-ids |
false |
Include instance UUIDs in the table. |
pool get¶
Dual-shape: a name positional returns the aggregated PoolConceptView; a UUID
positional returns the flat per-node instance. -o text|json|yaml (default
text).
pool create¶
Register one (name, node) pool instance. Admin-only. Not idempotent: a
duplicate (name, node) is an error.
| Flag | Default | Meaning |
|---|---|---|
--node |
(required) | Owning node name. |
--path |
(required) | Filesystem path on the owning node. |
--type |
local_dir |
Pool type. |
--wait |
false |
Poll until reconciliation reaches ready/failed (60s timeout). |
-o, --output |
text |
text|json. |
--show-ids |
false |
Include the pool UUID in text output. |
pool delete¶
Delete a pool by name or UUID. Admin-only. Refuses with 409 conflict when
vm_disks still reference the pool (no force-delete by design). Prompts when
stdin is a TTY unless --force.
| Flag | Default | Meaning |
|---|---|---|
--force |
false |
Skip the confirmation prompt. |
--node |
(none) | Delete the instance on this node (disambiguates a multi-instance name). |
-o, --output |
text |
text|json. |
otherix network¶
Manage networks (CP /v1/networks surface). Names are globally unique; every
authenticated role can read, admin alone may create / delete.
network create¶
Create one cluster-wide network. Admin-only.
| Flag | Default | Meaning |
|---|---|---|
--type |
bridge |
bridge or overlay. |
--bridge-name |
(required for bridge) |
Host bridge interface name. |
--managed |
false |
Control plane manages the bridge lifecycle. |
--egress |
none |
Managed egress mode: none or nat. |
--subnet |
(none) | Egress subnet in CIDR form (required for --egress nat and for --type overlay). |
--gateway |
(derived) | Gateway IP inside --subnet. |
--mtu |
server 1500 |
Link MTU (68..9216). |
--vlan |
(untagged) | VLAN tag (1..4094). |
--dhcp |
false |
Enable CP-IPAM + DHCP responder (overlay only; requires --egress nat --subnet). |
-o, --output |
text |
text|json. |
--show-ids |
false |
Include the network UUID in text output. |
--type overlay requires --subnet and forbids the bridge-only flags
(--bridge-name, --mtu, --vlan, --egress, --managed, --gateway).
otherix network create net-dev --bridge-name br0
otherix network create net-nat --bridge-name br-nat --managed --egress nat --subnet 10.10.0.0/24
network list¶
Cursor-paginated list.
| Flag | Default | Meaning |
|---|---|---|
--type |
(none) | Filter by type (bridge). |
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor. |
-o, --output |
table |
table|json|yaml. |
--show-ids |
false |
Include network UUIDs in the table. |
network get¶
Show a network and its per-node materialisation status. Positional accepts a
name or UUID (a name is resolved client-side). -o text|json|yaml (default
text).
network delete¶
Delete a network by name or UUID. Admin-only. Refuses with 409 conflict when
vm_nics still reference it (no force-delete). Prompts when stdin is a TTY
unless --force.
| Flag | Default | Meaning |
|---|---|---|
--force |
false |
Skip the confirmation prompt. |
-o, --output |
text |
text|json. |
otherix node¶
Browse cluster nodes (CP /v1/nodes surface), manage the ingress-gateway role,
and mint join-token bundles. admin / operator callers see the full Node
projection; other roles see the reduced summary. A node's roles are derived:
hypervisor when it owns a storage pool, gateway when the gateway role is
assigned - a co-located node reports both. See the
Ingress gateways guide for the operator flow.
node list¶
Cursor-paginated list.
| Flag | Default | Meaning |
|---|---|---|
--architecture |
(none) | Filter by amd64 / arm64. |
--status |
(none) | Filter by status. |
--role |
(none) | Filter by role: hypervisor / gateway. |
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor. |
--output (-o) |
table |
table|json|yaml. |
--show-ids |
false |
Include node UUIDs in the table. |
node get¶
Show a node's projection. <node> is a name. --output (-o) text|json|yaml
(default text), --show-ids includes the UUID.
node gateway¶
Assign or remove the ingress-gateway role on a node (node:manage). Name-only,
idempotent 200. Enabling on a hypervisor node co-locates a gateway (the node
keeps hosting VMs); see the
Ingress gateways guide.
node join-token¶
Mint, list, and revoke node-agent bootstrap tokens (admin only).
join-token create¶
Mint a fresh token bundle (plaintext token + cluster CA fingerprint), printed exactly once.
| Flag | Default | Meaning |
|---|---|---|
--kind |
node |
Join kind: node (hypervisor) or gateway (standalone ingress gateway). Cluster-replica tokens use otherix cluster join-token create. |
--ttl |
1h |
Token validity (1m..24h). |
--max-uses |
0 (server default of 1 = single-use) |
Consumption cap. 0 and an omitted value both default to single-use; a truly unlimited token cannot be minted from the CLI/API. |
--node-name |
(none) | Bind token to a node identity (forces single-use). |
--output |
text |
text|json. |
otherix node join-token create --node-name node-dev --ttl 10m
otherix node join-token create --kind gateway --node-name gw-1 --ttl 10m
join-token list¶
| Flag | Default | Meaning |
|---|---|---|
--include-expired |
false |
Surface expired tokens. |
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor. |
--output |
table |
table|json. |
join-token revoke¶
Revoke an unconsumed token by id (UUID positional). No flags beyond the globals.
join-token consumptions¶
List the consumption audit trail for a token (UUID positional).
| Flag | Default | Meaning |
|---|---|---|
--limit |
20 |
Page size (1..200). |
--cursor |
(none) | Opaque cursor. |
--output |
table |
table|json. |
otherix cluster¶
Manage cluster-wide settings (CP /v1/cluster surface). Mutating commands
require admin (cluster:manage).
cluster get-default-pool¶
Show the cluster default pool reference. --output text|json (default text).
Prints an informational line and exits 0 when unset.
cluster set-default-pool¶
Set the cluster default pool by NAME (<name> positional). UUIDs are rejected.
--output text|json.
cluster unset-default-pool¶
Clear the default pool reference. Prompts when stdin is a TTY; non-interactive
use requires --force.
cluster default-artifact-pool¶
The artifact-pool analogue of the default-pool commands: a vm snapshot that
omits --artifact-pool is tagged into this pool and inherits its replication
factor. set/unset are admin-only.
otherix cluster get-default-artifact-pool
otherix cluster set-default-artifact-pool artifacts
otherix cluster unset-default-artifact-pool --force
cluster default-network¶
The network analogue of the default-pool commands. When a default network is
set, otherix vm create without --network attaches one NIC to it; when
unset, a VM created without --network has no NIC. The name must resolve to an
existing bridge network. set/unset are admin-only (cluster:manage);
get is open to every role and prints an informational line and exits 0 when
unset.
otherix cluster get-default-network
otherix cluster set-default-network default
otherix cluster unset-default-network --force
cluster join-token create¶
Mint a kind=cluster (HA-grow) join token used to add a new control-plane
replica. Admin-only; the bundle (token plaintext + cluster CA fingerprint) is
printed exactly once.
| Flag | Default | Meaning |
|---|---|---|
--ttl |
1h |
Token validity (1m..24h). |
--max-uses |
0 (server default of 1 = single-use; cap 16 for cluster tokens) |
Consumption cap. |
--output |
text |
text|json. |
cluster member list¶
List etcd cluster members (id, name, learner flag, peer URLs). --output
text|json (default text).
cluster member remove¶
Remove an etcd member by hex id (<id> positional). Prompts when stdin is a
TTY; non-interactive use requires --force.
otherix user¶
Manage user accounts (CP /v1/users surface). A username is the account's
unique identity and login credential: lowercase letters, digits, and interior
hyphens (3..32). email and display_name are optional. Create/list/delete and
set-role require admin; whoami works for any role. Passwords are never
passed as a flag value - they are read from a no-echo prompt or, with
--password-stdin, one line from stdin.
user create¶
Create a user. <username> is positional.
| Flag | Default | Meaning |
|---|---|---|
--role |
(required) | admin / operator / developer / viewer. |
--email |
(none) | Optional contact email. |
--display-name |
(none) | Optional human label. |
--password-stdin |
false |
Read the password from stdin instead of prompting. |
otherix user create dev-user --role developer
otherix user create ci-bot --role viewer --password-stdin <<<"$PW"
user list¶
Cursor-paginated list. --output table|json, --limit, --cursor, plus an
optional --username exact-match filter.
user get¶
Show one user. <username> is positional. --output table|json|yaml.
user set-role¶
Change a user's role (admin only). otherix user set-role <username> <role>.
user set-password¶
Reset a user's password. <username> is positional; the new password is read
from a no-echo prompt, or from stdin with --password-stdin.
user delete¶
Soft-delete a user (<username> positional). Refused while the user still owns
resources (VMs, snapshots); transfer or remove those first.
user whoami¶
Print a one-line identity summary of the calling user (username, role, id).
Works for any role; -o json / -o yaml emit the full user object.
otherix api-token¶
Mint, list, and revoke the otx_* API tokens that authenticate the CLI and
automation (CP /v1/users/.../api-tokens surface). Every authenticated role
manages its own tokens; an admin can act on another user's tokens with
--user <username>. The plaintext token is shown exactly once, on create, and
is never passed as a flag or argument.
api-token create¶
Mint a token. <name> is positional.
| Flag | Default | Meaning |
|---|---|---|
--ttl |
(never expires) | Relative lifetime: 90d, 720h, 30d12h. |
--user |
(yourself) | Mint on behalf of this user (admin only). |
-o |
text |
Output format: text / json / yaml (all include the plaintext once). |
otherix api-token create ci-bot
otherix api-token create ci-bot --ttl 90d
otherix api-token create deploy --user alice
The command prints the plaintext token once - copy it immediately:
api token created - copy it now, it will not be shown again:
otx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
name: ci-bot
prefix: otx_xxxx
expires_at: never
id: ...
api-token list¶
Cursor-paginated list. --output table|json|yaml, --limit, --cursor, plus
--user <username> (admin) and --include-revoked (revoked tokens are hidden by
default). The STATUS column is active, expired, or revoked.
api-token revoke¶
Revoke a token by its prefix (the otx_xxxx shown by list), resolved to its
id client-side. If a prefix is ambiguous, pass the full token id instead.
--user <username> (admin) targets another user; --force skips the
confirmation prompt. Revoke is immediate and idempotent.
otherix config¶
Manage CLI cluster credentials in the kubectl-style YAML store at
$OTHERIX_CONFIG / ~/.otherix/config.
config add cluster¶
Log in to a CP, mint a long-lived otx_* API token, and persist it as a named
cluster.
| Flag | Default | Meaning |
|---|---|---|
--name |
(required) | Cluster name. |
--server |
$OTHERIX_SERVER |
CP base URL. |
--login |
$OTHERIX_LOGIN |
Operator username. |
--password |
$OTHERIX_PASSWORD |
Operator password. |
--set-current |
true |
Make this the current cluster. |
--force |
false |
Overwrite an existing entry (revokes the old token server-side). |
Missing required values are prompted interactively when stdin is a TTY.
config list¶
List configured clusters (NAME / SERVER / CURRENT). No flags beyond the globals.
config use¶
Set the current cluster (<name> positional).
config remove¶
Remove a cluster from the config (<name> positional). Prompts when stdin is a
TTY; non-interactive use requires --force.
| Flag | Default | Meaning |
|---|---|---|
--force |
false |
Skip the confirmation prompt. |
config show¶
Print a cluster's details (token masked). [name] is optional and defaults to
the current cluster.
| Flag | Default | Meaning |
|---|---|---|
--show-token |
false |
Reveal the plaintext API token. |
Manifest commands¶
Top-level create / delete apply multi-document otherix/v1 YAML manifests
(Network, StoragePool, VM). Documents are separated by ---.
otherix create -f¶
Create resources from manifests, ordered Network -> StoragePool -> VM so name
references resolve. Best-effort: a failed document does not stop the rest, and
a non-zero exit signals any failure.
| Flag | Default | Meaning |
|---|---|---|
-f, --filename |
(required) | Manifest file path, or - for stdin (repeatable). |
--dry-run |
false |
Print the plan without creating anything. |
--wait |
false |
Block until every async resource (VM tasks, pool reconciliation) is ready. |
--wait-timeout |
5m |
Max wait when --wait is set. |
otherix delete -f¶
Delete the resources named by manifests, in reverse create order
(VM -> StoragePool -> Network). Existing delete blockers are reported and
skipped, never forced.
| Flag | Default | Meaning |
|---|---|---|
-f, --filename |
(required) | Manifest file path, or - for stdin (repeatable). |
--force |
false |
Skip the confirmation prompt. |
--dry-run |
false |
Print the plan without deleting anything. |
See also¶
- Configuration reference - server and agent config keys.
- Error codes - the stable error-code catalog the CLI relays.