From 1b4affb524536ca904f09b0de65fddad3be2a75b Mon Sep 17 00:00:00 2001
From: xengineering <me@xengineering.eu>
Date: Sun, 21 Jul 2024 17:20:57 +0200
Subject: Startup VM parallel to craft execution on host

This prepares moving the workbench to the virtual machine. It
furthermore adds the following command line arguments:

- image
- port

See `craft --help` or the init() function for details.
---
 main.go | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/main.go b/main.go
index 913b5b5..f9d7d13 100644
--- a/main.go
+++ b/main.go
@@ -15,12 +15,16 @@ var (
 	repo = ""
 	commit = ""
 	task = ""
+	image = ""
+	port = ""
 )
 
 func init() {
 	flag.StringVar(&repo, "repo", "", "Source code as valid Git URL")
 	flag.StringVar(&commit, "commit", "", "Commit or commit-ish reference for checkout")
 	flag.StringVar(&task, "task", "", "Shell code to execute for the build")
+	flag.StringVar(&image, "image", "", "QEMU qcow2 image which contains the VM")
+	flag.StringVar(&port, "port", "", "localhost port which is connected to VM SSH server")
 }
 
 func main() {
@@ -31,6 +35,18 @@ func main() {
 	log.Println("Starting craft")
 	defer log.Println("Exiting craft")
 
+	vm := qemu()
+	err := vm.Start()
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer func() {
+		err := vm.Process.Kill()
+		if err != nil {
+			log.Fatal(err)
+		}
+	}()
+
 	workbench := prepareWorkbench(repo, commit)
 	defer os.RemoveAll(workbench)
 	craft(workbench)
@@ -48,6 +64,30 @@ func runCommand(dir string, name string, args ...string) {
 	}
 }
 
+func qemu() *exec.Cmd {
+	return exec.Command(
+		"qemu-system-x86_64",
+		"-enable-kvm",
+		"-m",
+		"4G",
+		"-net",
+		"nic,model=virtio",
+		"-net",
+		fmt.Sprintf(
+			"user,hostfwd=tcp:127.0.0.1:%s-:22",
+			port,
+		),
+		"-drive",
+		fmt.Sprintf(
+			"file=%s,media=disk,snapshot=on,if=virtio",
+			image,
+		),
+		"-smp",
+		"cpus=4",
+		"-nographic",
+	)
+}
+
 func craft(workbench string) {
 	script := fmt.Sprintf(`#!/bin/sh
 
-- 
cgit v1.2.3-70-g09d2