#!/bin/bash
#
# Copyright (c) 2011 Citrix Systems, Inc.
# Copyright 2011 OpenStack LLC.
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.
#

set -ex

# By default, don't remove the templates
REMOVE_TEMPLATES=${REMOVE_TEMPLATES:-"false"}
if [ "$1" = "--remove-templates" ]; then
  REMOVE_TEMPLATES=true
fi

xe_min()
{
  local cmd="$1"
  shift
  xe "$cmd" --minimal "$@"
}

destroy_vdi()
{
  local vbd_uuid="$1"
  local type=$(xe_min vbd-list uuid=$vbd_uuid params=type)
  local dev=$(xe_min vbd-list uuid=$vbd_uuid params=userdevice)
  local vdi_uuid=$(xe_min vbd-list uuid=$vbd_uuid params=vdi-uuid)

  if [ "$type" == 'Disk' ] && [ "$dev" != 'xvda' ] && [ "$dev" != '0' ]; then
    xe vdi-destroy uuid=$vdi_uuid
  fi
}

uninstall()
{
  local vm_uuid="$1"
  local power_state=$(xe_min vm-list uuid=$vm_uuid params=power-state)

  if [ "$power_state" != "halted" ]; then
    xe vm-shutdown vm=$vm_uuid force=true
  fi

  for v in $(xe_min vbd-list vm-uuid=$vm_uuid | sed -e 's/,/ /g'); do
    destroy_vdi "$v"
  done

  xe vm-uninstall vm=$vm_uuid force=true >/dev/null
}

uninstall_template()
{
  local vm_uuid="$1"

  for v in $(xe_min vbd-list vm-uuid=$vm_uuid | sed -e 's/,/ /g'); do
    destroy_vdi "$v"
  done

  xe template-uninstall template-uuid=$vm_uuid force=true >/dev/null
}

# remove the VMs and their disks
for u in $(xe_min vm-list other-config:os-vpx=true | sed -e 's/,/ /g'); do
  uninstall "$u"
done

# remove the templates
if [ "$REMOVE_TEMPLATES" == "true" ]; then
  for u in $(xe_min template-list other-config:os-vpx=true | sed -e 's/,/ /g'); do
    uninstall_template "$u"
  done
fi
