266 lines
5.9 KiB
Plaintext
Raw Permalink Normal View History

# Virtual Machine CLI Commands
#
# User-facing commands for VM management.
# Part of Phase 1: VM Lifecycle Foundation
use lib_provisioning/vm/ {
"vm-create"
"vm-start"
"vm-stop"
"vm-delete"
"vm-list"
"vm-info"
"vm-ssh"
"vm-scp-to"
"vm-scp-from"
"vm-exec"
}
export def "vm create" [
name: string # VM name
--base-image: string # Base OS image
--cpu: int = 2 # CPU cores
--memory: int = 4096 # Memory in MB
--disk: int = 20 # Disk in GB
--permanent = false # Keep after restart
--temporary = false # Auto-cleanup
--auto-cleanup-hours: int = 24 # TTL if temporary
--taskserv: string # Single taskserv to install
--network: string = "bridge" # Network mode
]: table {
"""
Create a virtual machine.
Examples:
# Temporary test VM
provisioning vm create test-k8s \\
--temporary \\
--cpu 4 --memory 8192
# Permanent dev VM
provisioning vm create dev-rust \\
--permanent \\
--cpu 8 --memory 16384 --disk 50 \\
--taskserv rust
# With custom image
provisioning vm create test \\
--base-image ubuntu-22.04 \\
--temporary
"""
let config = {
name: $name
base_image: ($base_image // "ubuntu-22.04")
cpu: $cpu
memory_mb: $memory
disk_gb: $disk
permanent: $permanent
temporary: $temporary
auto_cleanup: $temporary
auto_cleanup_hours: $auto_cleanup_hours
taskserv: $taskserv
network_mode: $network
backend: "libvirt"
}
let result = (vm-create $config)
if $result.success {
print $"✓ VM '($name)' created successfully"
print $" ID: ($result.vm_id)"
print $" Disk: ($result.disk_path)"
} else {
print $"✗ Failed to create VM: ($result.error)"
}
[$result]
}
export def "vm list" [
--permanent = false # List only permanent
--temporary = false # List only temporary
--running = false # List only running
]: table {
"""
List virtual machines.
Examples:
# List all VMs
provisioning vm list
# List permanent VMs
provisioning vm list --permanent
# List running VMs
provisioning vm list --running
"""
vm-list --permanent=$permanent --temporary=$temporary --running=$running
}
export def "vm start" [
name: string # VM name
]: table {
"""
Start a virtual machine.
Examples:
provisioning vm start dev-rust
"""
let result = (vm-start $name)
if $result.success {
print $"✓ VM '$name' started"
} else {
print $"✗ Failed to start VM: ($result.error)"
}
[$result]
}
export def "vm stop" [
name: string # VM name
--force = false # Force shutdown
]: table {
"""
Stop a virtual machine.
Examples:
provisioning vm stop dev-rust
provisioning vm stop test --force
"""
let result = (vm-stop $name --force=$force)
if $result.success {
print $"✓ VM '$name' stopped"
} else {
print $"✗ Failed to stop VM: ($result.error)"
}
[$result]
}
export def "vm delete" [
name: string # VM name
--force = false # Force deletion
]: table {
"""
Delete a virtual machine.
Examples:
provisioning vm delete test-k8s
"""
let result = (vm-delete $name --force=$force)
if $result.success {
print $"✓ VM '$name' deleted"
} else {
print $"✗ Failed to delete VM: ($result.error)"
}
[$result]
}
export def "vm info" [
name: string # VM name
]: record {
"""
Get VM information.
Examples:
provisioning vm info dev-rust
"""
vm-info $name
}
export def "vm ssh" [
name: string # VM name
--command: string # Command to execute
]: table {
"""
SSH into VM or execute command.
Examples:
# Interactive shell
provisioning vm ssh dev-rust
# Execute command
provisioning vm ssh dev-rust --command "uname -a"
# Run remote script
provisioning vm ssh test --command "bash /path/to/script.sh"
"""
let result = (vm-ssh $name --command=$command)
if not $result.success {
print $"✗ SSH failed: ($result.error)"
}
[$result]
}
export def "vm exec" [
name: string # VM name
command: string # Command to execute
]: table {
"""
Execute command in VM.
Examples:
provisioning vm exec dev-rust "cargo --version"
provisioning vm exec test "kubectl get nodes"
"""
let result = (vm-exec $name $command)
if $result.success {
print $result.output
} else {
print $"✗ Command failed: ($result.error)"
}
[$result]
}
export def "vm scp" [
direction: string # "to" or "from"
vm_name: string # VM name
src: string # Source path
dst: string # Destination path
]: table {
"""
Copy files to/from VM.
Examples:
# Copy to VM
provisioning vm scp to dev-rust /local/file /remote/path
# Copy from VM
provisioning vm scp from dev-rust /remote/file /local/path
"""
let result = (
if $direction == "to" {
vm-scp-to $vm_name $src $dst
} else if $direction == "from" {
vm-scp-from $vm_name $src $dst
} else {
{success: false, error: "Direction must be 'to' or 'from'"}
}
)
if $result.success {
print $"✓ ($result.message)"
} else {
print $"✗ Copy failed: ($result.error)"
}
[$result]
}