#!/bin/bash

#rbt

DST_HOST=$1
SRC_SYS_DIR=$2
DST_PATH=$3
VMID=$4
DSID=$5
IMAGES=$6

DST_DIR=`dirname $DST_PATH`
DS_DIR=`dirname $DST_DIR`
DST_DS_SYS_ID=$(echo $DST_DIR | cut -d/ -f7)
HOMEDIR=$DST_DIR"/$VMID"

if [ -z "${ONE_LOCATION}" ]; then
    TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh
else
    TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
fi

. $TMCOMMON

CURRENT_DS_ID=$(onevm show -x $VMID | xmlstarlet sel -t -v "/VM/HISTORY_RECORDS/HISTORY[position() = (last()-1)]/DS_ID")
SRC_DIR=/var/lib/one/datastores/$CURRENT_DS_ID/$VMID
SRC_DEV=/dev/vg-one-$CURRENT_DS_ID/lv-one-vm-$VMID-*

# get all info about images
unset i IMAGES_ELEMENTS
while IFS= read -r -d ';' element; do
    IMAGES_ELEMENTS[i++]="$element"
done < <(echo "$IMAGES")


#rbt: create dirs
CMD_PRE=$(cat <<EOF
set -ex -o pipefail

#rbt: create dirs
export PATH=$PATH:/sbin
if ! [ -e "/var/lib/one/datastores/$DSID" ]; then
    mkdir -p /var/lib/one/datastores/$DSID
fi
mkdir -p $DS_DIR
pdp-one "$DS_DIR"

if ! [ -e "$HOMEDIR" ]; then
    mkdir -p $HOMEDIR
    pdp-one "$HOMEDIR"
fi
EOF
)
ssh_exec_and_log "$DST_HOST" "$CMD_PRE" "Error create virtual machine home dir"

# create all necessaru images in new image datastore
set -ex -o pipefail
for info in "${IMAGES_ELEMENTS[@]}"
do
    DISK_ID=`echo $info | cut -d: -f1`
    COPY_NEW_IMAGE=`echo $info | cut -d: -f2`
    LINK_OR_CREATE=`echo $info | cut -d: -f3`
    PREV_TMMAD=`echo $info | cut -d: -f4`
    NEW_IMAGE_ID=`echo $info | cut -d: -f5`
    NEW_IMAGE_DSID=`echo $info | cut -d: -f6`
    OLD_IMAGE_SOURCE=`echo $info | cut -d: -f7`
    DST_PATH=$DST_DIR"/$VMID/disk.$DISK_ID"
    SRC_PATH=$SRC_SYS_DIR"/disk.$DISK_ID"
    # copy inused in change_ds with blockcopy
    if [ "$LINK_OR_CREATE" == "LINK" ]; then
        continue
    fi

    if [ $COPY_NEW_IMAGE == "YES" ]; then
        NEW_IMAGE_SOURCE="/dev/vg-one-$NEW_IMAGE_DSID/lv-one-image-$NEW_IMAGE_ID"
        IMAGE_LV_NAME="lv-one-image-${NEW_IMAGE_ID}"
        IMAGE_VG_NAME="vg-one-${NEW_IMAGE_DSID}"
        #TODO move to oned in success case
        onedb change-body image --id $NEW_IMAGE_ID /IMAGE/SOURCE "$NEW_IMAGE_SOURCE"
        # lvmlvm and lvmthin cdroms and persistent disk copy to system datastore
        #if [ "$LINK_OR_CREATE" == "LINK" ]; then
            #if [ $PREV_TMMAD == "lvm_lvm" ] || [ $PREV_TMMAD == "lvm_thin" ]; then
            #    OLD_IMAGE_SOURCE=$(readlink "$SRC_PATH")
            #fi
        #fi
        FILE_SIZE=$(qemu-img measure -U --output=json -O qcow2 $OLD_IMAGE_SOURCE  --force-share | jq '."required"')

        FILE_SIZEMB=$(( $FILE_SIZE / 1024 / 1024))
        SIZE8=$(bc<<<"scale=1;$FILE_SIZEMB*1.08"   | awk '{ print int($1) }')
        if [ $SIZE8 -lt 100 ]; then
            SIZE8=100
        fi
        $SUDO $LVCREATE --wipesignatures n -L${SIZE8}M -n $IMAGE_LV_NAME $IMAGE_VG_NAME
        $QEMU_IMG convert -O qcow2 "$OLD_IMAGE_SOURCE" "$NEW_IMAGE_SOURCE"
        # check the result size
        OFFSET=$($SUDO $QEMU_IMG check  --output=json $NEW_IMAGE_SOURCE | jq '."image-end-offset"')
        OFFSET_MB=$(( $OFFSET / 1024 / 1024))
        OFFSET8=$(bc<<<"scale=1;$OFFSET_MB*1.08"   | awk '{ print int($1) }')
        if [ $OFFSET8 -eq 0 ]; then
            OFFSET8=100
        fi

        # reduce the result volume
        if [ $OFFSET8 -lt $SIZE8 ]; then
            $SUDO $LVREDUCE -L"$OFFSET8"M  $NEW_IMAGE_SOURCE -f
        fi

        $SUDO $LVCHANGE -an ${NEW_IMAGE_SOURCE}
    fi

done

exit 0
