From cd385f5610554fa175237a5001d4fb8c9a01f28f Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Tue, 25 Jun 2024 13:42:33 +0200 Subject: [PATCH] Add initial support for alpine autoinstall Run setup-disk on the biggest empty disk found when autoinstall: true is set. --- lib/tiny-cloud/user-data/alpine-config | 28 +++++++++++++++++++++++++- tests/test_env.sh | 7 +++++++ tests/tiny-cloud-alpine.test | 24 +++++++++++++++++++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/lib/tiny-cloud/user-data/alpine-config b/lib/tiny-cloud/user-data/alpine-config index 69d8493..1d4a059 100644 --- a/lib/tiny-cloud/user-data/alpine-config +++ b/lib/tiny-cloud/user-data/alpine-config @@ -7,7 +7,7 @@ INIT_ACTIONS_MAIN="$(insert_after set_hostname \ "userdata_bootcmd userdata_write_files userdata_ntp userdata_apk_cache userdata_apk_repositories userdata_package_update userdata_package_upgrade userdata_packages" \ $INIT_ACTIONS_MAIN)" INIT_ACTIONS_MAIN="$(insert_after set_ssh_keys ssh_authorized_keys $INIT_ACTIONS_MAIN)" -INIT_ACTIONS_FINAL="$INIT_ACTIONS_FINAL userdata_runcmd" +INIT_ACTIONS_FINAL="$INIT_ACTIONS_FINAL userdata_runcmd userdata_autoinstall" get_userdata() { IFS="/" @@ -227,3 +227,29 @@ init__userdata_runcmd() { sh -c "$cmd" done } + +find_biggest_empty_disk() { + local d + for d in "$ROOT"/sys/class/block/*/device; do + p=${d%/device} + if [ -e "$p"/size ] && [ -z "$(blkid /dev/${p##*/})" ]; then + echo "$(cat $p/size) ${p##*/}" + fi + done | sort -n | tail -n 1 | cut -d' ' -f2 +} + +init__userdata_autoinstall() { + local autoinstall="$(get_userdata autoinstall)" + if [ "$autoinstall" = "true" ]; then + local disk="$(find_biggest_empty_disk)" + if [ -n "$disk" ]; then + rm -f "$ROOT"/etc/runlevels/*/tiny-cloud* + $MOCK lbu include /root/.ssh /home + $MOCK ERASE_DISKS=/dev/$disk setup-disk -m sys /dev/$disk + # TODO: make reboot configurable + $MOCK reboot + else + log err "no empty disk found" + fi + fi +} diff --git a/tests/test_env.sh b/tests/test_env.sh index 14278ac..fa3034d 100644 --- a/tests/test_env.sh +++ b/tests/test_env.sh @@ -120,3 +120,10 @@ fake_interfaces() { n=$((n+1)) done } + +fake_disk() { + local dev="$1" size="$2" + mkdir -p sys/class/block/$dev + touch sys/class/block/$dev/device + echo "$size" > sys/class/block/$1/size +} diff --git a/tests/tiny-cloud-alpine.test b/tests/tiny-cloud-alpine.test index 0dba727..a9a0de2 100755 --- a/tests/tiny-cloud-alpine.test +++ b/tests/tiny-cloud-alpine.test @@ -28,7 +28,8 @@ init_tests \ userdata_package_update \ userdata_package_upgrade \ userdata_packages \ - userdata_runcmd + userdata_runcmd \ + userdata_autoinstall set_ephemeral_network_cmdline_body() { fake_interfaces eth0 eth1 eth2 @@ -413,3 +414,24 @@ userdata_write_files_body() { world EOF } + +userdata_autoinstall_body() { + fake_userdata_nocloud <<-EOF + #alpine-config + autoinstall: true + EOF + fake_bin blkid <<-EOF + #!/bin/sh + true + EOF + fake_disk nvme0n8 10000 + fake_disk vda 20000 + + # run net phase to extract the user data + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"userdata_autoinstall: done" \ + -o match:"setup-disk" \ + tiny-cloud final +} +