Some checks failed
CI/CD / lint (pull_request) Failing after 11s
CI/CD / test (pull_request) Failing after 11s
CI/CD / typecheck (pull_request) Failing after 22s
CI/CD / build (pull_request) Has been skipped
CI/CD / publish-rpm (pull_request) Has been skipped
CI/CD / publish-deb (pull_request) Has been skipped
Add `labctl provision register` to re-add machines to installed state without reprovisioning (e.g. after bastion state loss). Full stack: protocol type, bastion API + WS handler, labd route, CLI command. Add `labctl app k3s kubeconfig <target>` to fetch kubeconfig from a k3s node via SSH, rewrite server URL, and merge into ~/.kube/config. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
206 lines
12 KiB
Fish
206 lines
12 KiB
Fish
# labctl fish completions -- auto-generated by scripts/generate-completions.ts
|
|
# DO NOT EDIT MANUALLY -- run: pnpm completions:generate
|
|
|
|
complete -c labctl -e
|
|
complete -c labctl -f
|
|
|
|
# Global options
|
|
complete -c labctl -s v -l version -d 'Show version'
|
|
complete -c labctl -s h -l help -d 'Show help'
|
|
|
|
# Helper: test if exactly a subcommand chain is active (no extra positional args)
|
|
function __labctl_using_cmd
|
|
set -l tokens (commandline -opc)
|
|
set -l expected $argv
|
|
set -l depth (count $expected)
|
|
set -l found 0
|
|
set -l i 1
|
|
for tok in $tokens[2..]
|
|
if string match -q -- "-*" $tok
|
|
continue
|
|
end
|
|
set i (math $i + 1)
|
|
set -l idx (math $i - 1)
|
|
if test $idx -le $depth
|
|
if test "$tok" != "$expected[$idx]"
|
|
return 1
|
|
end
|
|
set found (math $found + 1)
|
|
else
|
|
return 1
|
|
end
|
|
end
|
|
test $found -eq $depth
|
|
end
|
|
|
|
# Helper: test if command starts with a subcommand chain (options still apply after args)
|
|
function __labctl_in_cmd
|
|
set -l tokens (commandline -opc)
|
|
set -l expected $argv
|
|
set -l depth (count $expected)
|
|
set -l found 0
|
|
for tok in $tokens[2..]
|
|
if string match -q -- "-*" $tok
|
|
continue
|
|
end
|
|
set found (math $found + 1)
|
|
if test $found -le $depth
|
|
if test "$tok" != "$expected[$found]"
|
|
return 1
|
|
end
|
|
end
|
|
end
|
|
test $found -ge $depth
|
|
end
|
|
|
|
# Dynamic: fetch machine hostnames from bastion (installed + queued)
|
|
function __labctl_installed_hosts
|
|
curl -s http://localhost:8080/api/machines 2>/dev/null |
|
|
python3 -c 'import sys,json; d=json.load(sys.stdin); hosts=[v.get("hostname","") for v in {**d.get("install_queue",{}), **d.get("installed",{})}.values() if v.get("hostname")]; [print(h) for h in set(hosts)]' 2>/dev/null
|
|
end
|
|
|
|
# Dynamic: fetch all known MAC addresses (discovered + queue + installed)
|
|
function __labctl_known_macs
|
|
curl -s http://localhost:8080/api/machines 2>/dev/null |
|
|
python3 -c 'import sys,json; d=json.load(sys.stdin); [print(k) for k in {**d.get("discovered",{}), **d.get("install_queue",{}), **d.get("installed",{})}]' 2>/dev/null
|
|
end
|
|
|
|
# Dynamic: fetch hostnames and MACs from all states
|
|
function __labctl_hosts_and_macs
|
|
curl -s http://localhost:8080/api/machines 2>/dev/null |
|
|
python3 -c 'import sys,json; d=json.load(sys.stdin); a={**d.get("discovered",{}), **d.get("install_queue",{}), **d.get("installed",{})}; macs=list(a.keys()); hosts=[v.get("hostname","") for v in {**d.get("install_queue",{}), **d.get("installed",{})}.values() if v.get("hostname")]; [print(x) for x in set(macs+hosts)]' 2>/dev/null
|
|
end
|
|
|
|
# Target argument completions
|
|
complete -c labctl -n "__labctl_using_cmd app k3s install" -a "(__labctl_installed_hosts)" -d 'installed host'
|
|
complete -c labctl -n "__labctl_using_cmd app k3s health" -a "(__labctl_installed_hosts)" -d 'installed host'
|
|
complete -c labctl -n "__labctl_using_cmd app labcontroller deploy" -a "(__labctl_installed_hosts)" -d 'installed host'
|
|
complete -c labctl -n "__labctl_using_cmd app labcontroller status" -a "(__labctl_installed_hosts)" -d 'installed host'
|
|
complete -c labctl -n "__labctl_using_cmd provision install" -a "(__labctl_known_macs)" -d 'MAC address'
|
|
complete -c labctl -n "__labctl_using_cmd provision reprovision" -a "(__labctl_hosts_and_macs)" -d 'host or MAC'
|
|
complete -c labctl -n "__labctl_using_cmd provision forget" -a "(__labctl_hosts_and_macs)" -d 'host or MAC'
|
|
complete -c labctl -n "__labctl_using_cmd provision logs" -a "(__labctl_hosts_and_macs)" -d 'host or MAC'
|
|
|
|
# Top-level commands
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a version -d 'Show version information'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a init -d 'Initialise infrastructure components'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a provision -d 'Machine provisioning operations'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a config -d 'View and modify CLI configuration'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a login -d 'Authenticate with labd and obtain client certificate'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a doctor -d 'Diagnose configuration and connectivity issues'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a app -d 'Application management'
|
|
complete -c labctl -n "not __fish_seen_subcommand_from version init provision config login doctor app roles" -a roles -d 'List available machine roles'
|
|
|
|
# init subcommands
|
|
complete -c labctl -n "__labctl_using_cmd init" -a bastion -d 'Bastion PXE server management'
|
|
|
|
# init bastion subcommands
|
|
complete -c labctl -n "__labctl_using_cmd init bastion" -a standalone -d 'Standalone bastion server lifecycle'
|
|
|
|
# init bastion standalone subcommands
|
|
complete -c labctl -n "__labctl_using_cmd init bastion standalone" -a start -d 'Start the bastion server (HTTP + dnsmasq PXE)'
|
|
complete -c labctl -n "__labctl_using_cmd init bastion standalone" -a stop -d 'Stop a running bastion server'
|
|
complete -c labctl -n "__labctl_using_cmd init bastion standalone" -a status -d 'Show bastion server status'
|
|
|
|
# init bastion standalone start options
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l port -d 'HTTP port' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l dir -d 'Bastion data directory' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l domain -d 'Internal domain for hostnames' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l dhcp-mode -d 'DHCP mode: proxy or full' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l fedora -d 'Fedora version' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l arch -d 'Architecture' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l timezone -d 'Timezone' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l locale -d 'Locale' -x
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l skip-dnsmasq -d 'Skip starting dnsmasq (for testing)'
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l skip-artifacts -d 'Skip downloading boot artifacts (for testing)'
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone start" -l foreground -d 'Run in foreground (default: daemonize)'
|
|
|
|
# init bastion standalone stop options
|
|
complete -c labctl -n "__labctl_in_cmd init bastion standalone stop" -l dir -d 'Bastion data directory' -x
|
|
|
|
# provision subcommands
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a list -d 'List all known machines'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a install -d 'Queue a discovered machine for OS installation'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a reprovision -d 'Queue install + SSH reboot into PXE (target: hostname, MAC, or IP)'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a debug -d 'PXE boot into Fedora rescue mode for debugging (target: hostname, MAC, or IP)'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a forget -d 'Remove a machine from bastion state'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a register -d 'Register an already-installed machine (e.g. after state loss)'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a logs -d 'Show provisioning logs for a machine (hostname, MAC, or IP)'
|
|
complete -c labctl -n "__labctl_using_cmd provision" -a makeiso -d 'Generate a UEFI-bootable iPXE ISO for network provisioning'
|
|
|
|
# provision install options
|
|
complete -c labctl -n "__labctl_in_cmd provision install" -l role -d 'Machine role (see below)' -xa 'vanilla worker infra labcontroller'
|
|
complete -c labctl -n "__labctl_in_cmd provision install" -l os -d 'Operating system' -xa 'fedora-43 ubuntu-26.04'
|
|
complete -c labctl -n "__labctl_in_cmd provision install" -l disk -d 'Target disk device (auto-detect if omitted)' -x
|
|
|
|
# provision reprovision options
|
|
complete -c labctl -n "__labctl_in_cmd provision reprovision" -l role -d 'Machine role (see below)' -xa 'vanilla worker infra labcontroller'
|
|
complete -c labctl -n "__labctl_in_cmd provision reprovision" -l os -d 'Operating system' -xa 'fedora-43 ubuntu-26.04'
|
|
complete -c labctl -n "__labctl_in_cmd provision reprovision" -l disk -d 'Target disk device (auto-detect if omitted)' -x
|
|
|
|
# provision debug options
|
|
complete -c labctl -n "__labctl_in_cmd provision debug" -l pxe-boot -d 'Boot installed system via PXE (kernel+initrd from network, root from NVMe)'
|
|
|
|
# provision register options
|
|
complete -c labctl -n "__labctl_in_cmd provision register" -l role -d 'Machine role' -xa 'vanilla worker infra labcontroller'
|
|
complete -c labctl -n "__labctl_in_cmd provision register" -l ip -d 'Machine IP address' -x
|
|
|
|
# provision logs options
|
|
complete -c labctl -n "__labctl_in_cmd provision logs" -s f -l follow -d 'Follow log output in real-time'
|
|
|
|
# provision makeiso options
|
|
complete -c labctl -n "__labctl_in_cmd provision makeiso" -l arch -d 'Target architecture(s)' -xa 'x86_64 aarch64'
|
|
complete -c labctl -n "__labctl_in_cmd provision makeiso" -l local -d 'Build ISO locally instead of using bastion-hosted URL'
|
|
complete -c labctl -n "__labctl_in_cmd provision makeiso" -l out -d 'Output path for local ISO build' -x
|
|
|
|
# config subcommands
|
|
complete -c labctl -n "__labctl_using_cmd config" -a list -d 'Show all configuration values'
|
|
complete -c labctl -n "__labctl_using_cmd config" -a get -d 'Get a configuration value'
|
|
complete -c labctl -n "__labctl_using_cmd config" -a set -d 'Set a configuration value'
|
|
complete -c labctl -n "__labctl_using_cmd config" -a path -d 'Show configuration file path'
|
|
|
|
# login options
|
|
complete -c labctl -n "__labctl_in_cmd login" -l server -d 'labd server URL' -x
|
|
|
|
# doctor options
|
|
complete -c labctl -n "__labctl_in_cmd doctor" -l json -d 'Output results as JSON'
|
|
|
|
# app subcommands
|
|
complete -c labctl -n "__labctl_using_cmd app" -a labcontroller -d 'Labcontroller deployment (bastion + labd + CockroachDB)'
|
|
complete -c labctl -n "__labctl_using_cmd app" -a k3s -d 'k3s cluster management'
|
|
|
|
# app labcontroller subcommands
|
|
complete -c labctl -n "__labctl_using_cmd app labcontroller" -a deploy -d 'Deploy labcontroller stack to a k3s node'
|
|
complete -c labctl -n "__labctl_using_cmd app labcontroller" -a status -d 'Check labcontroller deployment status (all hosts if no target)'
|
|
|
|
# app labcontroller deploy options
|
|
complete -c labctl -n "__labctl_in_cmd app labcontroller deploy" -l user -d 'SSH user' -x
|
|
complete -c labctl -n "__labctl_in_cmd app labcontroller deploy" -l crdb-replicas -d 'CockroachDB replicas' -x
|
|
|
|
# app labcontroller status options
|
|
complete -c labctl -n "__labctl_in_cmd app labcontroller status" -l user -d 'SSH user' -x
|
|
|
|
# app k3s subcommands
|
|
complete -c labctl -n "__labctl_using_cmd app k3s" -a install -d 'Install k3s on a target machine (hostname, IP, or MAC)'
|
|
complete -c labctl -n "__labctl_using_cmd app k3s" -a health -d 'Check k3s health (all hosts if no target given)'
|
|
complete -c labctl -n "__labctl_using_cmd app k3s" -a list -d 'List installed machines and their k3s status'
|
|
complete -c labctl -n "__labctl_using_cmd app k3s" -a kubeconfig -d 'Fetch kubeconfig from a target and merge into ~/.kube/config'
|
|
|
|
# app k3s install options
|
|
complete -c labctl -n "__labctl_in_cmd app k3s install" -l role -d 'k3s role: infra (server) or worker (agent)' -x
|
|
complete -c labctl -n "__labctl_in_cmd app k3s install" -l user -d 'SSH user' -x
|
|
complete -c labctl -n "__labctl_in_cmd app k3s install" -l k3s-server -d 'k3s server URL (required for worker role)' -x
|
|
complete -c labctl -n "__labctl_in_cmd app k3s install" -l k3s-token -d 'k3s join token (required for worker role)' -x
|
|
|
|
# app k3s health options
|
|
complete -c labctl -n "__labctl_in_cmd app k3s health" -l user -d 'SSH user' -x
|
|
|
|
# app k3s list options
|
|
complete -c labctl -n "__labctl_in_cmd app k3s list" -l user -d 'SSH user' -x
|
|
|
|
# app k3s kubeconfig options
|
|
complete -c labctl -n "__labctl_in_cmd app k3s kubeconfig" -l user -d 'SSH user' -x
|
|
complete -c labctl -n "__labctl_in_cmd app k3s kubeconfig" -l context -d 'Context name (defaults to hostname)' -x
|
|
complete -c labctl -n "__labctl_in_cmd app k3s kubeconfig" -l print -d 'Print kubeconfig to stdout instead of merging'
|
|
|