
QUIET=1
UUID="1112222-3333-4444-5555-666677778888"
NAME="testname"
BOOTLOADER="/usr/bin/pygrub"
DISK="/var/lib/xen/images/$NAME.img"
MEM="500"

# base config
cat <<EOF > $NAME
memory="$MEM"
name="$NAME"
uuid="0$UUID"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF

# a. same name + same uuid
cat <<EOF > $NAME-a
memory="$MEM"
name="$NAME"
uuid="0$UUID"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF

# b. same name + diff uuid
cat <<EOF > $NAME-b
memory="$MEM"
name="$NAME"
uuid="b$UUID"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF


# c. diff name + same uuid
cat <<EOF > $NAME-c
memory="$MEM"
name="$NAME-c"
uuid="0$UUID"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF

# d. diff name + diff uuid
cat <<EOF > $NAME-d
memory="$MEM"
name="$NAME-d"
uuid="d$UUID"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF

# e. same name + no uuid
cat <<EOF > $NAME-e
memory="$MEM"
name="$NAME"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF

# f. diff name + no uuid
cat <<EOF > $NAME-f
memory="$MEM"
name="$NAME"
uuid="0$UUID"
bootloader="$BOOTLOADER"
disk=["file:$DISK,xvda,w"]
EOF

function invoke
{
  # Either new or create to setup base VM state
  INITIAL=$1
  # Either new or create to detail test state
  ACTION=$2
  # Name postfix for test config
  POSTFIX=$3

  # Setup the pre-existing base VM
  if [ $QUIET -eq 1 ]
  then
    xm $INITIAL $NAME 1>/dev/null 2>&1
  else
    xm $INITIAL $NAME
  fi
  sleep 1

  # Try our test action
  if [ $QUIET -eq 1 ]
  then
    xm $ACTION $NAME-$POSTFIX 1>/dev/null 2>&1
  else
    xm $ACTION $NAME-$POSTFIX
  fi
  RET=$?

  # Cleanup taking account of possible unexpected behaviours
  xm destroy $NAME 1>/dev/null 2>&1
  xm destroy $NAME-$POSTFIX 1>/dev/null 2>&1
  xm delete $NAME 1>/dev/null 2>&1
  xm delete $NAME-$POSTFIX 1>/dev/null 2>&1
  # Hack - XenD sometimes takes a while to notice a VM has done
  # Running 'list' makes it notice quicker it seems...
  xm list 1>/dev/null 2>&1
  sleep 1
}

function allow
{
  echo -n "Allow xm $2 $NAME-$3 "
  invoke $1 $2 $3
  if [ $RET -eq 0 ]
  then
    echo "[OK]"
  else
    echo "[FAIL]"
  fi
}

function reject
{
  echo -n "Reject xm $2 $NAME-$3 "
  invoke $1 $2 $3
  if [ $RET -ne 0 ]
  then
    echo "[OK]"
  else
    echo "[FAIL]"
  fi
}


# xm new + vm not runnning
function part1
{
  echo
  echo "Part 1: xm new + inactive VM"
  echo
  allow new new a
  # Fail due to dup name + diff uuid
  reject new new b
  allow new new c
  allow new new d
  # Fail due to dup name + diff uuid
  reject new new e
  allow new new f
}

function part2
{
  echo
  echo "Part 2: xm create + inactive VM"
  echo
  allow new create a
  # Fail due to dup name + diff uuid
  reject new create b
  allow new create c
  allow new create d
  # Fail due to dup name + diff uuid
  reject new create e
  allow new create f
}

function part3
{
  echo
  echo "Part 3: xm new + active VM"
  echo
  allow create new a
  # Fail due to dup name + diff uuid
  reject create new b
  allow create new c
  allow create new d
  # Fail due to dup name + diff uuid
  reject create new e
  allow create new f
}

function part4
{
  echo
  echo "Part 4: xm create + active VM"
  echo
  # Fail due to dup name + dup UUID
  reject create create a
  # Fail due to dup name + diff uuid
  reject create create b
  # Fail due to diff name + dup uuid
  reject create create c
  # Fail due to disk re-use
  reject create create d
  # Fail due to dup name + diff uuid
  reject create create e
  # Fail due to disk re-use
  reject create create f
}

# xm new + vm not runnning
part1
# xm create + vm not runnning
part2
# xm new + vm runnning
part3
# xm create + vm runnning
part4

rm -f $NAME $NAME-?