#!/bin/bash
set -eu

CPU=$1
MEM=$(( 1024 * $2 ))
# extra G to allow fuzz for partition table : flavor size and registered size
# need to be different to actual size.
DISK=$3
LIBVIRT_DISK_BUS_TYPE=${LIBVIRT_DISK_BUS_TYPE:-"sata"}
NODE_DISK=$(( $DISK + 1))


case $4 in
    i386) ARCH='i686' ;;
    amd64|x86_64) ARCH='x86_64' ;;
    *) echo "Unsupported arch $4!" ; exit 1 ;;
esac

TOTAL=$(($5 - 1))
SSH_USER=$6
HOSTIP=$7
TE_DATAFILE=$8
BRIDGE_NAMES=${9:-""}

LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"virtio"}
LIBVIRT_VOL_POOL=${LIBVIRT_VOL_POOL:-"default"}
LIBVIRT_VOL_POOL_TARGET=${LIBVIRT_VOL_POOL_TARGET:-"/var/lib/libvirt/images"}

# define the $LIBVIRT_VOL_POOL storage pool if its not there yet
if ! $(virsh pool-list --all --persistent | grep -q $LIBVIRT_VOL_POOL)  ; then
    if [ ! -d $LIBVIRT_VOL_POOL_TARGET ]; then
        sudo mkdir -p $LIBVIRT_VOL_POOL_TARGET ;
    fi
    (virsh pool-define-as --name $LIBVIRT_VOL_POOL dir --target $LIBVIRT_VOL_POOL_TARGET ; \
    virsh pool-autostart $LIBVIRT_VOL_POOL; virsh pool-start $LIBVIRT_VOL_POOL) >&2
fi
PREALLOC=
if [ "${TRIPLEO_OS_FAMILY:-}" = "debian" ]; then
    PREALLOC="--prealloc-metadata"
fi

# Create empty json file if it doesn't exist
[ -s $TE_DATAFILE ] || echo "{}" > $TE_DATAFILE
JSON=$(jq .nodes=[] $TE_DATAFILE)

EXTRAOPTS=
if [[ ${DIB_COMMON_ELEMENTS:-} == *enable-serial-console* ]]; then
    EXTRAOPTS="--enable-serial-console"
fi

for idx in $(seq 0 $TOTAL) ; do
    vm_name="baremetal${BRIDGE_NAMES// /_}_$idx"
    (virsh list --all --name | grep -q "^$vm_name\$") && continue
    virsh vol-create-as $LIBVIRT_VOL_POOL $vm_name.qcow2 ${NODE_DISK}G --format qcow2 $PREALLOC >&2
    volume_path=$(virsh vol-path --pool $LIBVIRT_VOL_POOL $vm_name.qcow2)
    # Pre-touch the VM to set +C, as it can only be set on empty files.
    sudo touch "$volume_path"
    sudo chattr +C "$volume_path" || true
    BAREMETAL_INTERFACE=
    if [ -n "$BRIDGE_NAMES" ]; then
        BAREMETAL_INTERFACE="--baremetal-interface $BRIDGE_NAMES"
    fi
    configure-vm $EXTRAOPTS \
        --bootdev network \
        --name $vm_name \
        --image "$volume_path" \
        --diskbus $LIBVIRT_DISK_BUS_TYPE \
        --arch $ARCH \
        --cpus $CPU \
        --memory $MEM \
        --libvirt-nic-driver $LIBVIRT_NIC_DRIVER $BAREMETAL_INTERFACE >&2
    mac=$(get-vm-mac $vm_name)
    JSON=$(jq ".nodes=(.nodes + [{mac:[\"$mac\"], cpu:\"$CPU\", memory:\"$2\", disk:\"$DISK\", arch:\"$4\", pm_user:\"$SSH_USER\", pm_addr:\"$HOSTIP\", pm_password:.[\"ssh-key\"], pm_type:\"pxe_ssh\"}])" <<< $JSON)

done
jq . <<< $JSON > $TE_DATAFILE

