From 0e8f22d6543a007d40d3c0ac6a198f145b7933bc Mon Sep 17 00:00:00 2001
From: Recolic <git@me.recolic.net>
Date: Tue, 16 Jan 2024 14:32:41 -0800
Subject: [PATCH] .backing_file

---
 cron-callback.sh | 22 +++++++++++++++-------
 init.settings    |  6 +++++-
 runtime.settings |  4 ++--
 3 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/cron-callback.sh b/cron-callback.sh
index 7e884b4..0d65413 100755
--- a/cron-callback.sh
+++ b/cron-callback.sh
@@ -64,13 +64,19 @@ function create_vm_if_not_exist () {
 
     download_cloud_img_if_not_exist "$cloudimg" || return $?
     rm -rf "vm/$name" ; mkdir -p "vm/$name"
-    # create it
+
     echo2 "+ Creating VM image $name with options $@..."
-    generate_metadata "$name" > "vm/$name/meta-data" || return $?
-    generate_userdata "$username" "$password" "$name" > "vm/$name/user-data" || return $?
-    ( cd "vm/$name" ; genisoimage  -output initimg.iso -volid cidata -joliet -rock user-data meta-data ) || return $?
-    qemu-img create -f qcow2 -F qcow2 -o backing_file="../../base/$cloudimg" "vm/$name/disk.img" || return $?
-    qemu-img resize "vm/$name/disk.img" "$disk" || return $?
+    if [ -z "$disk" ]; then
+        # create from cloudimg
+        generate_metadata "$name" > "vm/$name/meta-data" || return $?
+        generate_userdata "$username" "$password" "$name" > "vm/$name/user-data" || return $?
+        ( cd "vm/$name" ; genisoimage  -output initimg.iso -volid cidata -joliet -rock user-data meta-data ) || return $?
+        qemu-img create -f qcow2 -F qcow2 -b "../../base/$cloudimg" "vm/$name/disk.img" || return $?
+        qemu-img resize "vm/$name/disk.img" "$disk" || return $?
+    else
+        # create from baseimg
+        qemu-img create -f qcow2 -F qcow2 -b "../../base/$cloudimg" "vm/$name/disk.img" || return $?
+    fi
 }
 
 function start_vm_if_not_running () {
@@ -104,9 +110,11 @@ function do_init () {
             # Parse the line as "name;cloudimg;disk;username;password", trim space
             IFS=';' read -r name cloudimg disk username password <<< "$(echo "$line" | tr -s '[:space:]' ';')"
 
-            # Check if all fields are non-empty
+            # 2 options or 5 options allowed, otherwise bad config line.
             if [ -n "$name" ] && [ -n "$cloudimg" ] && [ -n "$disk" ] && [ -n "$username" ] && [ -n "$password" ]; then
                 create_vm_if_not_exist "$name" "$cloudimg" "$disk" "$username" "$password" || echo2 "Failed to create_vm_if_not_exist. $?"
+            elif [ -n "$name" ] && [ -n "$cloudimg" ] && [ ! -n "$disk" ] && [ ! -n "$username" ] && [ ! -n "$password" ]; then
+                create_vm_if_not_exist "$name" "$cloudimg" || echo2 "Failed to create_vm_if_not_exist. $?"
             else
                 echo2 "Error: Bad configuration line: $line"
             fi
diff --git a/init.settings b/init.settings
index ee1d47f..5f09d42 100644
--- a/init.settings
+++ b/init.settings
@@ -1,4 +1,8 @@
+## init VM from cloudimg
 # name;cloudimg;disk;username;password (space will be trimmed)
 instance1;focal-server-cloudimg-amd64.img;60G;r;1
 gitlab-ci;Arch-Linux-x86_64-cloudimg.qcow2;40G;r;1
-#httptest ;focal-server-cloudimg-amd64.img;20G;r;1
+
+## or init VM from pre-deployed backing image (please put it into data/base/)
+# name;existing_img_fname
+devbox;win10pro-22h2-virtio-uefi.qcow2
diff --git a/runtime.settings b/runtime.settings
index f70f44d..5204307 100644
--- a/runtime.settings
+++ b/runtime.settings
@@ -1,4 +1,4 @@
 # name;options (name will be trimmed, options will be passed as-is)
 instance1;-m 2G -smp 2 -vnc :11 -net user,hostfwd=tcp::30471-:22
-gitlab-ci;-m 4G -smp 4 -vnc :12 -net user,hostfwd=tcp::30473-:22
-#httptest ;-m 1G -smp 1 -vnc :13 -net user,hostfwd=tcp::30474-:22,hostfwd=tcp::30480-:80
+gitlab-ci;-m 4G -smp 4 -vnc :12 -net user,hostfwd=tcp::30473-:22,hostfwd=tcp::30474-:8080
+devbox   ;-m 6G -smp 6 -vnc :13 -net user,hostfwd=tcp::30475-:3389 -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time
-- 
GitLab