forked from fediversity/fediversity
		
	Cleaner grabing of options
This commit is contained in:
		
							parent
							
								
									11fd13a982
								
							
						
					
					
						commit
						cd47d884f7
					
				
					 1 changed files with 86 additions and 59 deletions
				
			
		|  | @ -158,34 +158,65 @@ proxmox_sync () ( | |||
| ) | ||||
| 
 | ||||
| ################################################################################ | ||||
| ## Grab VM option | ||||
| ## Grab VM options | ||||
| ## | ||||
| ## Takes the name of the VM and an option and grabs `vmOptions.<name>.<option>` | ||||
| ## in the flake. | ||||
| ## Takes the name of the VM, grabs `.#vmOptions.<name>` and defines a bunch of | ||||
| ## global variables corresponding to all the options. | ||||
| 
 | ||||
| grab_vm_option () { | ||||
|   nix eval \ | ||||
|     --impure --raw --expr " | ||||
|       builtins.toJSON (builtins.getFlake (builtins.toString ./.)).vmOptions.$1 | ||||
|     " | jq -r ."$2" | ||||
| grab_vm_options () { | ||||
|   local options | ||||
| 
 | ||||
|   vm_name=$1 | ||||
| 
 | ||||
|   printf 'Grabing VM options for VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   options=$( | ||||
|     nix eval \ | ||||
|       --impure --raw --expr " | ||||
|         builtins.toJSON (builtins.getFlake (builtins.toString ./.)).vmOptions.$vm_name | ||||
|       " \ | ||||
|     --log-format raw --quiet | ||||
|   ) | ||||
| 
 | ||||
|   proxmox=$(echo "$options" | jq -r .proxmox) | ||||
|   vm_id=$(echo "$options" | jq -r .vmId) | ||||
| 
 | ||||
|   if [ "$proxmox" != fediversity ]; then | ||||
|     die "I do not know how to provision things that are not Fediversity VMs, | ||||
| but I got proxmox = '%s' for VM %s." "$proxmox" "$vm_name" | ||||
|   fi | ||||
| 
 | ||||
|   sockets=$(echo "$options" | jq -r .sockets) | ||||
|   cores=$(echo "$options" | jq -r .cores) | ||||
|   memory=$(echo "$options" | jq -r .memory) | ||||
| 
 | ||||
|   host_public_key=$(echo "$options" | jq -r .hostPublicKey) | ||||
|   host_private_key=$(echo "$options" | jq -r .unsafeHostPrivateKey) | ||||
| 
 | ||||
|   if [ "$host_private_key" != null ] && [ "$host_public_key" = null ]; then | ||||
|     die 'I do not know what to do with a private key but no public key.' | ||||
|   fi | ||||
| 
 | ||||
|   printf 'done grabing VM options for VM %s. Got:\n  id: %d\n  sockets: %d\n  cores: %d\n  memory: %d MiB\n' \ | ||||
|     "$vm_name" "$vm_id" "$sockets" "$cores" "$memory" | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| ## Build ISO | ||||
| 
 | ||||
| build_iso () { | ||||
|   acquire_lock build | ||||
|   printf 'Building ISO for VM %s...\n' "$2" | ||||
|   local nix_host_keys | ||||
| 
 | ||||
|   host_public_key=$(grab_vm_option "$2" hostPublicKey) | ||||
|   host_private_key=$(grab_vm_option "$2" unsafeHostPrivateKey) | ||||
|   if [ "$host_public_key" != null ] && [ "$host_private_key" != null ]; then | ||||
|     echo "$host_public_key" > "$tmpdir"/"$2"_host_key.pub | ||||
|     echo "$host_private_key" > "$tmpdir"/"$2"_host_key | ||||
|   acquire_lock build | ||||
|   printf 'Building ISO for VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   if [ "$host_private_key" != null ]; then | ||||
|     echo "$host_public_key" > "$tmpdir"/"$vm_name"_host_key.pub | ||||
|     echo "$host_private_key" > "$tmpdir"/"$vm_name"_host_key | ||||
|     nix_host_keys=" | ||||
|       hostKeys.ed25519 = { | ||||
|         public = $tmpdir/$2_host_key.pub; | ||||
|         private = $tmpdir/$2_host_key; | ||||
|         public = $tmpdir/${vm_name}_host_key.pub; | ||||
|         private = $tmpdir/${vm_name}_host_key; | ||||
|       }; | ||||
|     " | ||||
|   else | ||||
|  | @ -196,23 +227,23 @@ build_iso () { | |||
|     --impure --expr " | ||||
|       let flake = builtins.getFlake (builtins.toString ./.); in | ||||
|       flake.lib.makeInstallerIso { | ||||
|         nixosConfiguration = flake.nixosConfigurations.$2; | ||||
|         nixosConfiguration = flake.nixosConfigurations.$vm_name; | ||||
|         nixpkgs = flake.inputs.nixpkgs; | ||||
|         $nix_host_keys | ||||
|       } | ||||
|     " \ | ||||
|     --log-format raw --quiet \ | ||||
|     --out-link "$tmpdir/installer-$2" | ||||
|     --out-link "$tmpdir/installer-$vm_name" | ||||
| 
 | ||||
|   if [ $? -ne 0 ]; then | ||||
|     die 'Something went wrong when building ISO for VM %s. | ||||
| Check the Nix logs and fix things. Possibly there just is no NixOS configuration by that name?' \ | ||||
|       "$2" | ||||
|       "$vm_name" | ||||
|   fi | ||||
| 
 | ||||
|   ln -sf "$tmpdir/installer-$2/iso/installer.iso" "$tmpdir/installer-$2.iso" | ||||
|   ln -sf "$tmpdir/installer-$vm_name/iso/installer.iso" "$tmpdir/installer-$vm_name.iso" | ||||
| 
 | ||||
|   printf 'done building ISO for VM %s.\n' "$2" | ||||
|   printf 'done building ISO for VM %s.\n' "$vm_name" | ||||
|   release_lock build | ||||
| } | ||||
| 
 | ||||
|  | @ -221,13 +252,13 @@ Check the Nix logs and fix things. Possibly there just is no NixOS configuration | |||
| 
 | ||||
| upload_iso () { | ||||
|   acquire_lock upload | ||||
|   printf 'Uploading ISO for VM %s...\n' "$2" | ||||
|   printf 'Uploading ISO for VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   proxmox_sync POST "$api_url/nodes/$node/storage/local/upload" \ | ||||
|     "filename@$tmpdir/installer-$2.iso" \ | ||||
|     "filename@$tmpdir/installer-$vm_name.iso" \ | ||||
|     content==iso | ||||
| 
 | ||||
|   printf 'done uploading ISO for VM %s.\n' "$2" | ||||
|   printf 'done uploading ISO for VM %s.\n' "$vm_name" | ||||
|   release_lock upload | ||||
| } | ||||
| 
 | ||||
|  | @ -235,26 +266,26 @@ upload_iso () { | |||
| ## Remove ISO | ||||
| 
 | ||||
| remove_iso () { | ||||
|   printf 'Removing ISO for VM %s...\n' "$2" | ||||
|   printf 'Removing ISO for VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   proxmox_sync DELETE "$api_url/nodes/$node/storage/local/content/local:iso/installer-$2.iso" | ||||
|   proxmox_sync DELETE "$api_url/nodes/$node/storage/local/content/local:iso/installer-$vm_name.iso" | ||||
| 
 | ||||
|   printf 'done removing ISO for VM %s.\n' "$2" | ||||
|   printf 'done removing ISO for VM %s.\n' "$vm_name" | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| ## Create VM | ||||
| 
 | ||||
| create_vm () { | ||||
|   printf 'Creating VM %s with id %d...\n' "$2" "$1" | ||||
|   printf 'Creating VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu" \ | ||||
|     \ | ||||
|     vmid=="$1" \ | ||||
|     name=="$2" \ | ||||
|     vmid=="$vm_id" \ | ||||
|     name=="$vm_name" \ | ||||
|     pool==Fediversity \ | ||||
|     \ | ||||
|     ide2=="local:iso/installer-$2.iso,media=cdrom" \ | ||||
|     ide2=="local:iso/installer-$vm_name.iso,media=cdrom" \ | ||||
|     ostype==l26 \ | ||||
|     \ | ||||
|     bios==ovmf \ | ||||
|  | @ -264,28 +295,28 @@ create_vm () { | |||
|     scsihw==virtio-scsi-single \ | ||||
|     scsi0=='linstor_storage:32,discard=on,ssd=on,iothread=on' \ | ||||
|     \ | ||||
|     sockets=="$(grab_vm_option "$2" sockets)" \ | ||||
|     cores=="$(grab_vm_option "$2" cores)" \ | ||||
|     sockets=="$sockets" \ | ||||
|     cores=="$cores" \ | ||||
|     cpu==x86-64-v2-AES \ | ||||
|     numa==1 \ | ||||
|     \ | ||||
|     memory=="$(grab_vm_option "$2" memory)" \ | ||||
|     memory=="$memory" \ | ||||
|     \ | ||||
|     net0=='virtio,bridge=vnet1306' | ||||
| 
 | ||||
|   printf 'done creating VM %s.\n' "$2" | ||||
|   printf 'done creating VM %s.\n' "$vm_name" | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| ## Install VM | ||||
| 
 | ||||
| install_vm () ( | ||||
|   printf 'Installing VM %s...\n' "$2" | ||||
|   printf 'Installing VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu/$1/status/start" | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu/$vm_id/status/start" | ||||
| 
 | ||||
|   while :; do | ||||
|     response=$(proxmox GET "$api_url/nodes/$node/qemu/$1/status/current") | ||||
|     response=$(proxmox GET "$api_url/nodes/$node/qemu/$vm_id/status/current") | ||||
|     status=$(echo "$response" | jq -r .data.status) | ||||
|     case $status in | ||||
|       running) sleep 1 ;; | ||||
|  | @ -294,22 +325,22 @@ install_vm () ( | |||
|     esac | ||||
|   done | ||||
| 
 | ||||
|   printf 'done installing VM %s.\n' "$2" | ||||
|   printf 'done installing VM %s.\n' "$vm_name" | ||||
| ) | ||||
| 
 | ||||
| ################################################################################ | ||||
| ## Start VM | ||||
| 
 | ||||
| start_vm () { | ||||
|   printf 'Starting VM %s...\n' "$2" | ||||
|   printf 'Starting VM %s...\n' "$vm_name" | ||||
| 
 | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu/$1/config" \ | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu/$vm_id/config" \ | ||||
|     ide2=='none,media=cdrom' \ | ||||
|     net0=='virtio,bridge=vnet1305' | ||||
| 
 | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu/$1/status/start" | ||||
|   proxmox_sync POST "$api_url/nodes/$node/qemu/$vm_id/status/start" | ||||
| 
 | ||||
|   printf 'done starting VM %s.\n' "$2" | ||||
|   printf 'done starting VM %s.\n' "$vm_name" | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
|  | @ -318,24 +349,20 @@ start_vm () { | |||
| printf 'Provisioning VMs%s...\n' "$vm_names" | ||||
| 
 | ||||
| provision_vm () ( | ||||
|   ## NOTE: Mind the fact that we now run in a sub-shell, allowing the following | ||||
|   ## functions to define global variables without clashing with concurrent VMs | ||||
|   ## provisioning. | ||||
| 
 | ||||
|   build_iso "$@" | ||||
|   upload_iso "$@" | ||||
|   create_vm "$@" | ||||
|   install_vm "$@" | ||||
|   start_vm "$@" | ||||
|   remove_iso "$@" | ||||
|   ## Grab VM options and put them in global variables. NOTE: Mind the fact that | ||||
|   ## we now run in a sub-shell, allowing us to define global variables without | ||||
|   ## clashing with concurrent executions of `provision_vm`. | ||||
|   grab_vm_options "$1" | ||||
|   build_iso | ||||
|   upload_iso | ||||
|   create_vm | ||||
|   install_vm | ||||
|   start_vm | ||||
|   remove_iso | ||||
| ) | ||||
| 
 | ||||
| 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" & | ||||
|   provision_vm "$vm_name" & | ||||
| done | ||||
| wait | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue