#!/bin/sh
#
# Copyright (C) 2009 Canonical, Ltd.
# Author: Jamie Strandboge <jamie@canonical.com>
# License: GPLv3
#

set -e

ustconf="$HOME/.uqt-vm-tools.conf"
if [ -s "$ustconf" ]; then
    . "$ustconf"
else
    echo "Could not find '$ustconf'"
    exit 1
fi

. $UQT_VM_TOOLS/libvm.sh
abort_if_root

using_snapshots() {
    cat << EOM
Once migrated, to start using snapshots:
$ vm-start -s vm1 vm2...	(creates a new snapshot)
$ vm-start vm1 vm2...		(used existing snapshot)
$ vm-stop -f vm1 vm2...		(discards snapshot)
$ vm-stop vm1 vm2...		(keeps snapshot)
$ vm-stop -u vm1 vm2...		(commits changes to pristine image)
EOM
}

help() {
    cat << EOM
Usage:	vm-use-snapshots vm1 vm2...

EOM
    using_snapshots
}

if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
    help
    exit 1
fi

errors=""
performed_migration=""
for machine in "$@"; do
    disks=`get_disks $machine`
    if [ -z "$disks" ]; then
        echo "WARN: Could not find any disks. Skipping snapshot preparation." >&2
        errors="yes"
        continue
    fi

    if vm_running "$machine" ; then
        echo "WARN: '$machine' still running. Skipping snapshot preparation." >&2
        errors="yes"
        continue
    fi
    # go through once and make sure we can safely snapshot
    use_snapshot="yes"
    for d in $disks; do
        real=`readlink -f "$d"`
        dir=`dirname "$real"`
        bn=`basename "$real" .qcow2`
        pristine="$dir/$bn.pristine.qcow2"
        if [ ! -e "$real" ]; then
            echo "WARN: '$real' does not exist. Skipping snapshot preparation." >&2
            use_snapshot="no"
            break
        fi
        if ! echo "$real" | egrep -q '.qcow2$' ; then
            echo "WARN: File extension for '$real' is not 'qcow2'. Skipping snapshot preparation." >&2
            use_snapshot="no"
            break
        fi
        if [ -e "$pristine" ]; then
            echo "WARN: '$pristine' already exists. Skipping snapshot preparation." >&2
            use_snapshot="no"
            break
        fi
    done

    if [ "$use_snapshot" = "yes" ]; then
        echo "Migrating '$machine'"
        for d in $disks; do
            real=`readlink -f "$d"`
            dir=`dirname "$real"`
            bn=`basename "$real" .qcow2`
            pristine="$dir/$bn.pristine.qcow2"
            echo "  moving '$pristine' to '$real'"
            mv -f "$real" "$pristine"
        done
        performed_migration="yes"
    else
        errors="yes"
    fi
    echo ""
done

if [ "$performed_migration" = "yes" ]; then
    using_snapshots
fi

if [ "$errors" = "yes" ]; then
     exit 1
fi
