#!/bin/bash

#rbt

SRC=$1
DST=$2
VMID=$3
DSID=$4
NEW_IMAGE_INFO=$5
# YES:/dev/vg-one-102/lv-one-image-24:100:25
# NO:/dev/vg-one-102/lv-one-image-24:/dev/vg-one-100/lv-one-image-25
COPY_NEW_IMAGE=`echo $NEW_IMAGE_INFO | cut -d: -f1`
if ! [ -z "$COPY_NEW_IMAGE" ]; then
    LINK_OR_CREATE=`echo $NEW_IMAGE_INFO | cut -d: -f2`
    PREV_TMMAD=`echo $NEW_IMAGE_INFO | cut -d: -f3`
    NEW_IMAGE_ID=`echo $NEW_IMAGE_INFO | cut -d: -f4`
    NEW_IMAGE_DSID=`echo $NEW_IMAGE_INFO | cut -d: -f5`
    OLD_IMAGE_SOURCE=`echo $NEW_IMAGE_INFO | cut -d: -f6`
    NEW_IMAGE_SOURCE=`echo $NEW_IMAGE_INFO | cut -d: -f7`
fi
#--------------------------------------------------------------------------------

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

DRIVER_PATH=$(dirname $0)


. $TMCOMMON

#--------------------------------------------------------------------------------

SRC=`fix_dir_slashes $SRC`
DST=`fix_dir_slashes $DST`

SRC_PATH=`arg_path $SRC`
DST_PATH=`arg_path $DST`

SRC_HOST=`arg_host $DST`

SRC_DIR=`dirname $SRC_PATH`
DST_DIR=`dirname $DST_PATH`
DS_DIR=`dirname $DST_DIR`

SRC_DS_SYS_ID=$(echo $SRC_DIR | cut -d/ -f7)
DST_DS_SYS_ID=$(echo $DST_DIR | $AWK -F '/' '{print $(NF-1)}')
SRC_SYS_VG_NAME="vg-one-$SRC_DS_SYS_ID"
MKFS_SIZE=1024


# Activate the disk in the target host
if [ `is_disk $SRC_PATH` -eq 1 ]; then

    #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 "$DST_DIR" ]; then
        mkdir -p $DST_DIR
        pdp-one "$DST_DIR"
    fi
EOF
)
    ssh_exec_and_log "$SRC_HOST" "$CMD_PRE" "Error create virtual machine home dir"
    set -e -o pipefail
    DISK_ID=${SRC_PATH##*.}
    NEW_IMAGE_SOURCE="/dev/vg-one-$NEW_IMAGE_DSID/lv-one-image-$NEW_IMAGE_ID"

    if [ $COPY_NEW_IMAGE == "YES" ]; then
        #TODO move to oned in success case
        onedb change-body image --id $NEW_IMAGE_ID /IMAGE/SOURCE "$NEW_IMAGE_SOURCE"
        COPY_IMAGE_CMD=$(cat <<EOF
        IMAGE_LV_NAME="lv-one-image-${NEW_IMAGE_ID}"
        IMAGE_VG_NAME="vg-one-${NEW_IMAGE_DSID}"

        # lvmlvm and lvmthin cdroms and persistent disk copy to system datastore
        PREV_IMAGE_SOURCE=$OLD_IMAGE_SOURCE
        if [ "$LINK_OR_CREATE" == "LINK" ]; then
            if [ $PREV_TMMAD == "lvm_lvm" ] || [ $PREV_TMMAD == "lvm_thin" ]; then
                PREV_IMAGE_SOURCE=\$(readlink "$SRC_PATH")
            fi
        fi

        FILE_SIZE=\$(sudo qemu-img measure -U --output=json -O qcow2 \$PREV_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 1024 ]; then
            SIZE8=1024
        fi
        $SUDO $LVCREATE --wipesignatures n -L\${SIZE8}M -n \$IMAGE_LV_NAME \$IMAGE_VG_NAME
        sudo $QEMU_IMG convert -O qcow2 "\$PREV_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=1024
        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}
EOF
)

        ssh_exec_and_log "${SRC_HOST}" "${COPY_IMAGE_CMD}" \
            "Error creating image ${NEW_IMAGE_ID}"



    fi

    if [ "$LINK_OR_CREATE" == "LINK" ]; then
        CREATE_CMD=$(cat <<EOF
        set +e
        ln -sf "${NEW_IMAGE_SOURCE}" "${DST_PATH}"
        set -e
EOF
)
    else
        LV_NAME="lv-one-vm-${VMID}-${DISK_ID}"
        SRC_VG_NAME="vg-one-${SRC_DS_SYS_ID}"
        SRC_DEV="/dev/${SRC_VG_NAME}/${LV_NAME}"
        DST_VG_NAME="vg-one-${DST_DS_SYS_ID}"
        DST_DEV="/dev/${DST_VG_NAME}/${LV_NAME}"

        # create new volume and link
        CREATE_CMD=$(cat <<EOF

            set -e -o pipefail
            ${SYNC}
            ${SUDO} ${LVSCAN}

            DEVICE="$SRC_PATH"
            if [ $PREV_TMMAD == "lvm_lvm" ] || [ $PREV_TMMAD == "lvm_thin" ]; then
                DEVICE=\$(readlink "$SRC_PATH")
            fi

            FILE_SIZE=\$(sudo qemu-img measure -U --output=json -O qcow2 \$DEVICE  --force-share | jq '."required"')
            FILE_SIZEMB=\$(( \$FILE_SIZE / 1024 / 1024))
            SIZE8=\$(bc<<<"scale=1;\$FILE_SIZEMB*1.08"   | awk '{ print int(\$1) }')
            if [ \$SIZE8 -eq 0 ]; then
                SIZE8=1024
            fi
            ${SUDO} ${LVCREATE} --wipesignatures n -L"\${SIZE8}" -n "${LV_NAME}" "${DST_VG_NAME}"
            sudo $QEMU_IMG convert -O qcow2 \${DEVICE} "${DST_DEV}" >/dev/null 2>&1

            # check the result size
            OFFSET=\$($SUDO $QEMU_IMG check  --output=json $DST_DEV | 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=1024
            fi
            # reduce the result volume
            if [ \$OFFSET8 -lt \$SIZE8 ]; then
                $SUDO $LVREDUCE -L"\$OFFSET8"M  $DST_DEV -f
            fi

            $SUDO $LVCHANGE -an ${DST_DEV}
            set +e
            ln -sf "${DST_DEV}" "${DST_PATH}"
            set -e
EOF
)
    fi
    ssh_exec_and_log "${SRC_HOST}" "${CREATE_CMD}" \
            "Error creating LV named ${LV_NAME}"

    exit 0
fi

CMD_CLEAN=$(cat <<EOF
    for disk in \$(ls $SRC_PATH); do
        volume=\$(readlink "$SRC_PATH/"\$disk)
        if echo "\$volume" | grep "^/dev/$SRC_SYS_VG_NAME" &>/dev/null; then
            $SUDO $LVREMOVE -f \$volume
        elif echo "\$volume" | grep "$SRC_DS_SYS_ID" &>/dev/null; then
            rm -f \$volume
        fi
    done
    rm -rf $SRC_PATH
EOF
)

ssh_exec_and_log "$SRC_HOST" "$CMD_CLEAN" \
    "Error removing old VM files: on $SRC_HOST"
