#!/bin/bash

SCRIPTDIR=$(dirname "$(realpath "${0}")")

allocate-lxd-vm(){
  # Allocate the relevant backend.
  DISTRO=$(echo "$SPREAD_SYSTEM" | cut -d- -f1)
  SERIES=$(echo "$SPREAD_SYSTEM" | cut -d- -f2)
  VM_NAME="${VM_NAME:-${DISTRO}-${SERIES}-${RANDOM}}"
  VM_NAME=$(echo "$VM_NAME" | tr . -)
  DISK="${DISK:-20}"
  CPU="${CPU:-4}"
  MEM="${MEM:-8}"

  cloud_config="$(mktemp)"
  sed "s|SPREAD_PASSWORD|$SPREAD_PASSWORD|g" "${SCRIPTDIR}/cloud-config.yaml" > "$cloud_config"

  lxc launch --vm \
    "${DISTRO}:${SERIES}" \
    "${VM_NAME}" \
    --config user.user-data="$(cat "$cloud_config")" \
    --config limits.cpu="${CPU}" \
    --config limits.memory="${MEM}GiB" \
    --device root,size="${DISK}GiB" >&2

  # Wait for the spread user
  while ! lxc exec "${VM_NAME}" -- id -u spread &>/dev/null; do sleep 0.5; done

  # Wait for cloud-init to complete
  lxc exec "${VM_NAME}" -- cloud-init status --wait &>/dev/null
  # Wait for snap to complete seeding
  lxc exec "${VM_NAME}" -- snap wait system seed.loaded &> /dev/null

  rm "$cloud_config"

  # Set the instance address for spread
  while [[ -z $(lxc ls --format csv --columns 4 name="${VM_NAME}") ]]; do
    sleep 0.1
  done
  lxc ls --format csv --columns 4 name="${VM_NAME}"
}

discard-lxd-vm(){
  instance_name="$(lxc ls --format csv --columns n4 "ipv4=$SPREAD_SYSTEM_ADDRESS"|cut -f1 -d','|head -n 1)"
  lxc delete --force "${instance_name}"
}

case $2 in
  lxd-vm)
    case $1 in
      allocate)
        allocate-lxd-vm
        ;;
      discard)
        discard-lxd-vm
        ;;
      *)
        echo Step not needed >&2
        ;;
    esac
    ;;
  *)
    echo Unknown backend >&2
    exit 1
    ;;
esac
