271 lines
9 KiB
Text
271 lines
9 KiB
Text
# VM Domain Command Handlers
|
|
# Handles: vm, vm hosts, vm lifecycle commands
|
|
|
|
use cli/flags.nu *
|
|
# REMOVED: use ../../lib_provisioning * - causes circular import
|
|
use platform/plugins/auth.nu *
|
|
|
|
# Helper to run module commands
|
|
def run_module [
|
|
args: string
|
|
module: string
|
|
option?: string
|
|
--exec
|
|
] {
|
|
let use_debug = if ($env.PROVISIONING_DEBUG? | default false) { "-x" } else { "" }
|
|
|
|
# Always add --notitles when dispatching to submodules to prevent double title display
|
|
if $exec {
|
|
exec $"($env.PROVISIONING_NAME)" $use_debug -mod $module ($option | default "") $args --notitles
|
|
} else {
|
|
^$"($env.PROVISIONING_NAME)" $use_debug -mod $module ($option | default "") $args --notitles
|
|
}
|
|
}
|
|
|
|
# Main VM command dispatcher
|
|
export def handle_vm_command [
|
|
command: string
|
|
ops: string
|
|
flags: record
|
|
] {
|
|
set_debug_env $flags
|
|
|
|
match $command {
|
|
"vm" => { handle_vm_core $ops $flags }
|
|
"hosts" => { handle_vm_hosts $ops $flags }
|
|
"lifecycle" => { handle_vm_lifecycle $ops $flags }
|
|
"info" => { handle_vm_info $ops $flags }
|
|
_ => {
|
|
# Direct commands (create, list, start, stop, delete, ssh, exec, scp)
|
|
if $command in ["create" "list" "start" "stop" "delete" "ssh" "exec" "scp"] {
|
|
handle_vm_core $"($command) ($ops)" $flags
|
|
} else {
|
|
print $"❌ Unknown VM command: ($command)"
|
|
print ""
|
|
print "Available VM commands:"
|
|
print " vm - Core VM operations (create, list, start, stop, delete, info, ssh, exec, scp)"
|
|
print " vm hosts - Host management (check, prepare, list, status, ensure)"
|
|
print " vm lifecycle - VM persistence (permanent/temporary, cleanup, scheduler)"
|
|
print ""
|
|
print "Shortcuts:"
|
|
print " vmi - Quick VM info"
|
|
print " vmh - VM hosts management"
|
|
print " vml - VM lifecycle management"
|
|
print ""
|
|
print "Use 'provisioning vm help' or 'provisioning help vm' for more details"
|
|
exit 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Core VM command handler
|
|
def handle_vm_core [ops: string, flags: record] {
|
|
# Show help if no subcommand provided
|
|
if ($ops | is-empty) {
|
|
print ""
|
|
print $"(ansi cyan_bold)VM Core Operations(ansi reset)"
|
|
print "=================="
|
|
print ""
|
|
print "Usage: provisioning vm <command> [options]"
|
|
print " or: provisioning infra vm <command> [options]"
|
|
print ""
|
|
print "Commands:"
|
|
print " create [config] Create new VM"
|
|
print " list [--running] List all VMs"
|
|
print " start <name> Start VM"
|
|
print " stop <name> Stop VM"
|
|
print " delete <name> Delete VM"
|
|
print " info <name> VM information"
|
|
print " ssh <name> SSH into VM"
|
|
print " exec <name> <cmd> Execute command in VM"
|
|
print " scp <src> <dst> Copy files to/from VM"
|
|
print ""
|
|
print "Examples:"
|
|
print " provisioning vm create web-01.yaml"
|
|
print " provisioning vm list --running"
|
|
print " provisioning vmi web-01 # Quick info"
|
|
print " provisioning vm ssh web-01"
|
|
print ""
|
|
print $"(ansi yellow_bold)Authentication:(ansi reset)"
|
|
print " delete, stop require auth (bypass with --check)"
|
|
print ""
|
|
return
|
|
}
|
|
|
|
# Parse operation
|
|
let operation_parts = ($ops | split row " ")
|
|
let action = if ($operation_parts | is-empty) { "" } else { $operation_parts | first }
|
|
|
|
# Determine operation type
|
|
let operation_type = match $action {
|
|
"create" | "c" => "create"
|
|
"delete" | "d" | "remove" => "delete"
|
|
"stop" => "stop"
|
|
"start" => "start"
|
|
_ => "read"
|
|
}
|
|
|
|
# Check authentication if not in check mode and not a read operation
|
|
if not (is-check-mode $flags) and $operation_type != "read" {
|
|
let operation_name = $"vm ($action)"
|
|
|
|
if $operation_type in ["delete" "stop"] {
|
|
check-auth-for-destructive $operation_name --allow-skip
|
|
} else if $operation_type in ["create" "start"] {
|
|
if (config-get "environment" "dev") == "prod" {
|
|
check-auth-for-production $operation_name --allow-skip
|
|
} else {
|
|
let allow_skip = (config-get "security.bypass.allow_skip_auth" false)
|
|
if $allow_skip {
|
|
require-auth $operation_name --allow-skip
|
|
} else {
|
|
require-auth $operation_name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Execute VM command
|
|
let module_args = build_module_args $flags $ops
|
|
run_module $module_args "vm" --exec
|
|
}
|
|
|
|
# VM hosts command handler
|
|
def handle_vm_hosts [ops: string, flags: record] {
|
|
# Show help if no subcommand provided
|
|
if ($ops | is-empty) {
|
|
print ""
|
|
print $"(ansi cyan_bold)VM Hosts Management(ansi reset)"
|
|
print "==================="
|
|
print ""
|
|
print "Usage: provisioning vm hosts <command> [options]"
|
|
print " or: provisioning vmh <command> [options]"
|
|
print ""
|
|
print "Commands:"
|
|
print " check Check hypervisor capability"
|
|
print " prepare Prepare host for VMs"
|
|
print " list List available hosts"
|
|
print " status Host status"
|
|
print " ensure Ensure VM support"
|
|
print ""
|
|
print "Examples:"
|
|
print " provisioning vmh check"
|
|
print " provisioning vmh prepare --check"
|
|
print " provisioning vm hosts status"
|
|
print ""
|
|
print $"(ansi yellow_bold)Authentication:(ansi reset)"
|
|
print " prepare, ensure may require auth in production"
|
|
print ""
|
|
return
|
|
}
|
|
|
|
# Parse operation
|
|
let operation_parts = ($ops | split row " ")
|
|
let action = if ($operation_parts | is-empty) { "" } else { $operation_parts | first }
|
|
|
|
# Determine operation type
|
|
let operation_type = match $action {
|
|
"prepare" | "ensure" => "modify"
|
|
_ => "read"
|
|
}
|
|
|
|
# Check authentication for modifying operations in production
|
|
if not (is-check-mode $flags) and $operation_type == "modify" {
|
|
let operation_name = $"vm hosts ($action)"
|
|
|
|
if (config-get "environment" "dev") == "prod" {
|
|
check-auth-for-production $operation_name --allow-skip
|
|
} else {
|
|
let allow_skip = (config-get "security.bypass.allow_skip_auth" false)
|
|
if $allow_skip {
|
|
require-auth $operation_name --allow-skip
|
|
} else {
|
|
require-auth $operation_name
|
|
}
|
|
}
|
|
}
|
|
|
|
# Execute VM hosts command
|
|
let module_args = build_module_args $flags $ops
|
|
run_module $module_args "vm_hosts" --exec
|
|
}
|
|
|
|
# VM lifecycle command handler
|
|
def handle_vm_lifecycle [ops: string, flags: record] {
|
|
# Show help if no subcommand provided
|
|
if ($ops | is-empty) {
|
|
print ""
|
|
print $"(ansi cyan_bold)VM Lifecycle Management(ansi reset)"
|
|
print "======================="
|
|
print ""
|
|
print "Usage: provisioning vm lifecycle <command> [options]"
|
|
print " or: provisioning vml <command> [options]"
|
|
print ""
|
|
print "Commands:"
|
|
print " list-permanent List permanent VMs"
|
|
print " list-temporary List temporary VMs"
|
|
print " make-permanent Mark VM as permanent"
|
|
print " make-temporary Mark VM as temporary"
|
|
print " cleanup-now Cleanup expired VMs"
|
|
print " extend-ttl Extend VM TTL"
|
|
print " scheduler start Start cleanup scheduler"
|
|
print " scheduler stop Stop cleanup scheduler"
|
|
print " scheduler status Scheduler status"
|
|
print ""
|
|
print "Examples:"
|
|
print " provisioning vml list-temporary"
|
|
print " provisioning vml make-permanent web-01"
|
|
print " provisioning vml cleanup-now --check"
|
|
print " provisioning vm lifecycle scheduler start"
|
|
print ""
|
|
print $"(ansi yellow_bold)Authentication:(ansi reset)"
|
|
print " cleanup-now, scheduler require auth for destructive operations"
|
|
print ""
|
|
return
|
|
}
|
|
|
|
# Parse operation
|
|
let operation_parts = ($ops | split row " ")
|
|
let action = if ($operation_parts | is-empty) { "" } else { $operation_parts | first }
|
|
|
|
# Determine operation type
|
|
let operation_type = match $action {
|
|
"cleanup-now" => "delete"
|
|
"scheduler" => "modify"
|
|
"make-permanent" | "make-temporary" | "extend-ttl" => "modify"
|
|
_ => "read"
|
|
}
|
|
|
|
# Check authentication for destructive and modifying operations
|
|
if not (is-check-mode $flags) and $operation_type != "read" {
|
|
let operation_name = $"vm lifecycle ($action)"
|
|
|
|
if $operation_type == "delete" {
|
|
check-auth-for-destructive $operation_name --allow-skip
|
|
} else if $operation_type == "modify" {
|
|
if (config-get "environment" "dev") == "prod" {
|
|
check-auth-for-production $operation_name --allow-skip
|
|
} else {
|
|
let allow_skip = (config-get "security.bypass.allow_skip_auth" false)
|
|
if $allow_skip {
|
|
require-auth $operation_name --allow-skip
|
|
} else {
|
|
require-auth $operation_name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Execute VM lifecycle command
|
|
let module_args = build_module_args $flags $ops
|
|
run_module $module_args "vm_lifecycle" --exec
|
|
}
|
|
|
|
# VM info shortcut handler
|
|
def handle_vm_info [ops: string, flags: record] {
|
|
# Prepend "info" to ops if not empty, otherwise just "info"
|
|
let info_ops = if ($ops | is-empty) { "info" } else { $"info ($ops)" }
|
|
let module_args = build_module_args $flags $info_ops
|
|
run_module $module_args "vm" --exec
|
|
}
|