#!/bin/bash
# This file is part of curtin. See LICENSE file for copyright and license info.

IMAGE_DIR=${CURTIN_VMTEST_IMAGE_DIR:-/srv/images}
LVM_IMAGE=${IMAGE_DIR}/static/lvm-disk.dd
WORKDIR=$(dirname "${LVM_IMAGE}")

shopt -s extglob
set -eux
mkdir -p "${WORKDIR}"

cleanup() {
    if [ -e /dev/mapper/vmtests-root ]; then
        sudo umount /dev/mapper/vmtests-root
    fi
    rm -rf "${WORKDIR:?}"/mnt
}
trap cleanup EXIT

(
    flock -n 100 || exit 1

    rm -f "${LVM_IMAGE}"

    # create a raw disk
    truncate -s 2G "${LVM_IMAGE}"

    # find a free loop device
    loopdev=$(losetup --show -f "${LVM_IMAGE}")

    # partition the disk
    sudo /sbin/parted -a optimal "${loopdev}" --script \
        mklabel gpt \
        mkpart primary 0% 25% \
        mkpart primary 25% 100% \
        set 2 lvm on
    sudo udevadm trigger --settle "${loopdev}"

    # create LVM volumes
    sudo pvcreate "${loopdev}"p2
    sudo vgcreate vmtests "${loopdev}"p2
    sudo lvcreate -L 1G -n root vmtests
    sudo udevadm settle

    # format and add curtin dir to image
    sudo mkfs.ext2 "${loopdev}"p1
    sudo mkfs.ext4 /dev/mapper/vmtests-root
    mkdir -p "${WORKDIR}"/mnt
    sudo mount /dev/mapper/vmtests-root "${WORKDIR}"/mnt

    # curtin looks for this directory to identify the rootfs
    sudo mkdir "${WORKDIR}"/mnt/curtin
    sudo tee "${WORKDIR}"/mnt/curtin/curtin-hooks <<EOF
#!/bin/sh
exit 0
EOF
    sudo chmod 750 "${WORKDIR}"/mnt/curtin/curtin-hooks

    sudo umount /dev/mapper/vmtests-root
    sudo losetup -d "$loopdev"
    sudo dmsetup remove /dev/mapper/vmtests-root
    sudo udevadm settle

) 100>"${IMAGE_DIR}"/.static.lock
