diff --git a/infra/proxmox-provision.sh b/infra/proxmox-provision.sh index a789bbf..22207af 100755 --- a/infra/proxmox-provision.sh +++ b/infra/proxmox-provision.sh @@ -18,35 +18,23 @@ mkdir $tmpdir api_url= username= password= -sockets=1 -cores=1 -memory=2048 -vm_ids= +vm_names= debug=false help () { cat <<EOF -Usage: $0 [OPTION...] ID [ID...] +Usage: $0 [OPTION...] NAME [NAME...] -ID can be either: - - - of the form INT:STR, in which case the integer will be taken as the Proxmox - id for the machine, and the string as its name in Proxmox and the name of - the NixOS configuration to install, - - - an integer, in which case it will be taken as the Proxmox id for the - machine, and the name will be the id prefixed by 'fedi'. +NAME is a string identifying the VM in the flake. This script will look for a +`vmOptions.<NAME>` and `nixosConfigurations.<NAME>` to get the informations that +it needs. Options: --api-url STR Base URL of the Proxmox API (required) --username STR Username, with provider (eg. niols@pve; required) --password STR Password (required) - --cores INT Number of cores (default: $cores) - --memory INT Memory (default: $memory) - --sockets INT Number of sockets (default: $sockets) - --debug Run this script in debug mode (default: $debug) -h|-?|--help Show this help and exit @@ -54,7 +42,6 @@ Options can also be provided by adding assignments to a '.proxmox' file in the current working directory. For instance, it could contain: api_url=https://192.168.51.81:8006/api2/json - cores=7 username=mireille@pve debug=true @@ -82,32 +69,24 @@ while [ $# -gt 0 ]; do --username) readonly username="$1"; shift ;; --password) readonly password="$1"; shift ;; - --sockets) sockets=$1; shift ;; - --cores) cores=$1; shift ;; - --memory) memory=$1; shift ;; - --debug) debug=true ;; -h|-\?|--help) help; exit 0 ;; -*) die_with_help "Unknown argument: '%s'." "$argument" ;; - *) vm_ids="$vm_ids $argument" ;; + *) vm_names="$vm_names $argument" ;; esac done -if [ -z "$vm_ids" ]; then - die_with_help "Required: at least one VM id." +if [ -z "$vm_names" ]; then + die_with_help "Required: at least one VM name." fi if [ -z "$api_url" ] || [ -z "$username" ] || [ -z "$password" ]; then die_with_help "Required: '--api-url', '--username' and '--password'." fi -readonly sockets -readonly cores -readonly memory - ## FIXME: When we figure out how to use other nodes than node051. # if [ -z "$node" ]; then # printf 'Picking random node...' @@ -178,6 +157,19 @@ proxmox_sync () ( done ) +################################################################################ +## Grab VM option +## +## Takes the name of the VM and an option and grabs `vmOptions.<name>.<option>` +## in the flake. + +grab_vm_option () { + nix eval \ + --impure --raw --expr " + builtins.toJSON (builtins.getFlake (builtins.toString ./.)).vmOptions.$1 + " | jq -r ."$2" + } + ################################################################################ ## Build ISO @@ -188,6 +180,7 @@ build_iso () { ## FIXME: Support injecting host keys for test VMs (but not for production ## VMs as that would be unsafe). + nix build \ --impure --expr " let flake = builtins.getFlake (builtins.toString ./.); in @@ -259,12 +252,12 @@ create_vm () { scsihw==virtio-scsi-single \ scsi0=='linstor_storage:32,discard=on,ssd=on,iothread=on' \ \ - sockets=="$sockets" \ - cores=="$cores" \ + sockets=="$(grab_vm_option "$2" sockets)" \ + cores=="$(grab_vm_option "$2" cores)" \ cpu==x86-64-v2-AES \ numa==1 \ \ - memory=="$memory" \ + memory=="$(grab_vm_option "$2" memory)" \ \ net0=='virtio,bridge=vnet1306' @@ -310,10 +303,7 @@ start_vm () { ################################################################################ ## Main loop -printf 'Provisioning VMs%s with:\n' "$vm_ids" -printf ' sockets: %d\n' "$sockets" -printf ' cores: %d\n' "$cores" -printf ' memory: %d\n' "$memory" +printf 'Provisioning VMs%s...\n' "$vm_names" provision_vm () { build_iso "$@" @@ -324,18 +314,16 @@ provision_vm () { remove_iso "$@" } -for vm_id in $vm_ids; do - vm_name=${vm_id#*:} - vm_id=${vm_id%:*} - if [ "$vm_id" = "$vm_name" ]; then - vm_name=$(printf 'fedi%03d' "$vm_id") +for vm_name in $vm_names; do + vm_id=$(grab_vm_option "$vm_name" vmId) + if [ "$(grab_vm_option "$vm_name" proxmox)" != fediversity ]; then + die 'This script does not know how to provision things that are not Fediversity VMs' fi - provision_vm "$vm_id" "$vm_name" & done wait -printf 'done provisioning VMs%s.\n' "$vm_ids" +printf 'done provisioning VMs%s.\n' "$vm_names" ################################################################################ ## Cleanup