#!/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
NODE_DISK=$(( $DISK + 1))


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

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

LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"virtio"}

# define the default storage pool if its not there yet
(virsh pool-list --all --persistent | grep -q default) || (
 virsh pool-define-as --name default dir --target /var/lib/libvirt/images; virsh pool-autostart default; virsh pool-start default) >&2

PREALLOC=
if [ -f /etc/debian_version ]; 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)

for idx in $(seq 0 $TOTAL) ; do
  vm_name="baremetal${BRIDGE}_$idx"
  (virsh list --all | grep -q $vm_name) && continue
  virsh vol-create-as default $vm_name.qcow2 ${NODE_DISK}G --format qcow2 $PREALLOC >&2
  volume_path=$(virsh vol-path --pool default $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" ]; then
    BAREMETAL_INTERFACE="--baremetal-interface $BRIDGE"
  fi
  configure-vm --bootdev network --name $vm_name --image "$volume_path" --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\"], virt_type:\"virsh\", pm_type:\"pxe_ssh\"}])" <<< $JSON)

done
jq . <<< $JSON > $TE_DATAFILE

