From 2b4e624ee80391e9cb86572cf1c8bbddd8865bde Mon Sep 17 00:00:00 2001 From: DavHau Date: Mon, 19 May 2025 18:36:50 +0700 Subject: [PATCH] clan-app/devshell: add script to launch qemu VMs for testing --- pkgs/clan-app/bin/start-qemu-vm.sh | 47 ++++++++++++++++++++++++++++++ pkgs/clan-app/bin/start-vm | 17 +++++++++++ pkgs/clan-app/shell.nix | 10 ++++--- 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100755 pkgs/clan-app/bin/start-qemu-vm.sh create mode 100755 pkgs/clan-app/bin/start-vm diff --git a/pkgs/clan-app/bin/start-qemu-vm.sh b/pkgs/clan-app/bin/start-qemu-vm.sh new file mode 100755 index 000000000..86ba7f3d9 --- /dev/null +++ b/pkgs/clan-app/bin/start-qemu-vm.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euo pipefail + +getIso() { + # get the ssh public key of the current user + ssh_key=$(ssh-add -L) + # TODO: make this cross platform compatible by downloading a pre-built image + # and injecting the ssh private key into it + nix build --impure --expr " + let + pkgs = import { crossSystem = \"x86_64-linux\"; }; + in + (pkgs.nixos { + services.openssh.enable = true; + environment.systemPackages = [ pkgs.nixos-facter ]; + users.users.root.openssh.authorizedKeys.keys = [ \"$ssh_key\" ]; + users.users.root.password = \"root\"; + }).config.system.build.images.iso + " -o iso + iso=$(realpath iso) + # iso=/nix/store/xgkfnwhi3c2lcpsvlpcw3dygwgifinbq-nixos-minimal-23.05pre483386.f212785e1ed-x86_64-linux.iso + # nix-store -r "$iso" +} + +id="${1:-1}" + +CPUS="${CPUS:-2}" +MEMORY="${MEMORY:-4096}" +IMAGE_SIZE="${IMAGE_SIZE:-10G}" +SSH_PORT="${SSH_PORT:-2200${id}}" + +img_file="nixos-nvme${id}.img" +getIso +truncate -s"$IMAGE_SIZE" "$img_file" +set -x +qemu-system-x86_64 \ + -m "${MEMORY}" \ + -boot n \ + -smp "${CPUS}" \ + -enable-kvm \ + -cpu max \ + -netdev "user,id=mynet0,hostfwd=tcp::${SSH_PORT}-:22" \ + -device virtio-net-pci,netdev=mynet0 \ + -drive "file=$img_file,if=none,id=nvme1,format=raw" \ + -device nvme,serial=deadbeef1,drive=nvme1 \ + -cdrom "$iso"/iso/*.iso diff --git a/pkgs/clan-app/bin/start-vm b/pkgs/clan-app/bin/start-vm new file mode 100755 index 000000000..a55733668 --- /dev/null +++ b/pkgs/clan-app/bin/start-vm @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir=$(dirname "$(realpath "$0")") + +trap 'rm -rf "$tmpdir"' EXIT +tmpdir=$(mktemp -d) +cd "$tmpdir" + +number_vms="$1" + +for i in $(seq 1 "$number_vms"); do + "$script_dir/start-qemu-vm.sh" "$i" & +done + +while true; do sleep 1; done diff --git a/pkgs/clan-app/shell.nix b/pkgs/clan-app/shell.nix index 970b025a6..526bf294b 100644 --- a/pkgs/clan-app/shell.nix +++ b/pkgs/clan-app/shell.nix @@ -9,6 +9,10 @@ json2ts, self', }: +let + GREEN = "\\033[1;32m"; + NC = "\\033[0m"; +in mkShell { name = "ui"; @@ -72,10 +76,8 @@ mkShell { if test -f "$GIT_ROOT/pkgs/clan-app/.local.env"; then source "$GIT_ROOT/pkgs/clan-app/.local.env" fi - # Define the yellow color code - YELLOW='\033[1;33m' - # Define the reset color code - NC='\033[0m' export PC_CONFIG_FILES="$CLAN_CORE_PATH/pkgs/clan-app/process-compose.yaml" + + echo -e "${GREEN}To launch a qemu VM for testing, run:\n start-vm ${NC}" ''; }