#!/bin/bash

# rbt
source $(dirname $0)/../../etc/vmm/kvm/kvmrc
source $(dirname $0)/../../scripts_common.sh

deploy_id=$1
dest_host=$3
NEW_DS_ID=$4
VM_ID=$5

STDIN=$(cat -)

echo "$STDIN" | tr -d '\n' | grep -q '^ *<.*> *$' || STDIN="$(echo "$STDIN" | base64 -d)"

DRIVER_PATH=$(dirname $0)
XPATH="$DRIVER_PATH/../../datastore/xpath.rb"

unset i j XPATH_ELEMENTS
while IFS= read -r -d '' element; do
    XPATH_ELEMENTS[i++]="$element"
done < <(echo $STDIN | $XPATH \
            /VMM_DRIVER_ACTION_DATA/DATASTORE/TM_MAD)

TM_MAD="${XPATH_ELEMENTS[j++]}"

MOVE_CMD=$(cat <<EOF
    set -e -o pipefail
    OUT="\$(mktemp)"
    virsh -c qemu:///system domblklist "$deploy_id" --details | tail -n+3 > \$OUT
    rm -f /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/before_ds

    while read disk; do
        if [ -n "\$disk" ]; then
            tdisk=(\$disk)
            DISK_ID=\${disk##*.}
            NEW_DISK_PATH=/var/lib/one/datastores/$NEW_DS_ID/$VM_ID/disk.\${DISK_ID}
            if [ "$TM_MAD" == "qcow2" ]; then
                if [ "\${tdisk[1]}" == "disk" ]; then
                    NEW_DISK_PATH="/dev/vg-one-$NEW_DS_ID/lv-one-vm-$VM_ID-\${DISK_ID}"
                    DOC="
                    <disk type='block' device='disk'>
                    <source dev='\$NEW_DISK_PATH' extend_percent_physical='8' utilization_percent='90' activate='yes'/>
                    <target dev='\${tdisk[2]} '/>
                    <driver name='qemu' type='qcow2' cache='none' discard='unmap'/>
                    </disk>"
                    temp_xml="/var/tmp/$deploy_id-\${tdisk[2]}.xml"

                    echo "\$DOC" > \$temp_xml
                    virsh -c qemu:///system blockcopy --domain $deploy_id --path \${tdisk[3]} --xml \$temp_xml --wait --verbose --pivot
                    rm \$temp_xml
                    echo "\$disk_source" >> /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/before_ds
                    ln -s "\$NEW_DISK_PATH" /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/disk.\${DISK_ID}
                else
                    echo \${tdisk[3]} >> /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/before_ds
                    cp \${tdisk[3]} \$NEW_DISK_PATH
                    virsh -c qemu:///system change-media --domain $deploy_id \${tdisk[2]} \$NEW_DISK_PATH --live
                fi

            elif [ "\${tdisk[0]}" == "block" ]; then
                disk_source=\$(readlink "\${tdisk[3]}")
                if echo "\$disk_source" | grep "lv-one-vm" &>/dev/null; then
                    NEW_DISK_PATH="/dev/vg-one-$NEW_DS_ID/lv-one-vm-$VM_ID-\${DISK_ID}"
                    DOC="
                    <disk type='block' device='disk'>
                    <source dev='\$NEW_DISK_PATH' extend_percent_physical='8' utilization_percent='90' activate='yes'/>
                    <target dev='\${tdisk[2]} '/>
                    <driver name='qemu' type='qcow2' cache='none' discard='unmap'/>
                    </disk>"
                    temp_xml="/var/tmp/$deploy_id-\${tdisk[2]}.xml"

                    echo "\$DOC" > \$temp_xml
                    virsh -c qemu:///system blockcopy --domain $deploy_id --path \${tdisk[3]} --xml \$temp_xml --wait --verbose --pivot
                    rm \$temp_xml

                    echo "\$disk_source" >> /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/before_ds
                fi
                ln -s "\$NEW_DISK_PATH" /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/disk.\${DISK_ID}
            else
                #context file
                echo \${tdisk[3]} >> /var/lib/one/datastores/$NEW_DS_ID/$VM_ID/before_ds
                cp \${tdisk[3]} \$NEW_DISK_PATH
                virsh -c qemu:///system change-media --domain $deploy_id \${tdisk[2]} \$NEW_DISK_PATH --live
            fi
        fi
    done < \$OUT
EOF
)

ssh_exec_and_log "$dest_host" "$MOVE_CMD" "Error move disks between datastores for $deploy_id"

exit 0

