#!/bin/bash

#rbt
# Description in BREST-2936

if [ -z "${ONE_LOCATION}" ]; then
    LIB_LOCATION=/usr/lib/one
else
    LIB_LOCATION=$ONE_LOCATION/lib
fi

. $LIB_LOCATION/sh/scripts_common.sh

DRIVER_PATH=$(dirname $0)
source ${DRIVER_PATH}/../libfs.sh

# -------- Get cp and datastore arguments from OpenNebula core ------------

DRV_ACTION=$1
ID=$2

export DRV_ACTION

UTILS_PATH="${DRIVER_PATH}/.."

XPATH="$UTILS_PATH/xpath.rb -b $DRV_ACTION"

unset i XPATH_ELEMENTS

while IFS= read -r -d '' element; do
    XPATH_ELEMENTS[i++]="$element"
done < <($XPATH     /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/RESTRICTED_DIRS \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/SAFE_DIRS \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/STAGING_DIR \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TYPE \
                    /DS_DRIVER_ACTION_DATA/IMAGE/PATH \
                    /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
                    /DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/SHA1 \
                    /DS_DRIVER_ACTION_DATA/IMAGE/DATASTORE_ID \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/NO_DECOMPRESS \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/LIMIT_TRANSFER_BW \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/DRIVER \
                    /DS_DRIVER_ACTION_DATA/IMAGE/TYPE)

unset i

BASE_PATH="${XPATH_ELEMENTS[i++]}"
RESTRICTED_DIRS="${XPATH_ELEMENTS[i++]}"
SAFE_DIRS="${XPATH_ELEMENTS[i++]}"
STAGING_DIR="${XPATH_ELEMENTS[i++]:-/var/tmp}"
TYPE="${XPATH_ELEMENTS[i++]}"
SRC="${XPATH_ELEMENTS[i++]}"
MD5="${XPATH_ELEMENTS[i++]}"
SHA1="${XPATH_ELEMENTS[i++]}"
DS_ID="${XPATH_ELEMENTS[i++]}"
NO_DECOMPRESS="${XPATH_ELEMENTS[i++]}"
LIMIT_TRANSFER_BW="${XPATH_ELEMENTS[i++]}"
DRIVER="${XPATH_ELEMENTS[i++]}"
IMAGE_TYPE="${XPATH_ELEMENTS[i++]}"

LV_NAME="lv-one-image-${ID}"
VG_NAME="vg-one-${DS_ID}"
DEV="/dev/${VG_NAME}/${LV_NAME}"

IMAGE_HASH=`generate_image_hash`
TMP_DST="$STAGING_DIR/$IMAGE_HASH"
DOWNLOADER_ARGS=`set_downloader_args "$MD5" "$SHA1" "$NO_DECOMPRESS" "$LIMIT_TRANSFER_BW" "$SRC" -`
COPY_COMMAND="$UTILS_PATH/downloader.sh $DOWNLOADER_ARGS"

case $SRC in
http://*|https://*)
    log "Downloading $SRC to the image repository"

    DUMP="$COPY_COMMAND"
    ;;

*)
    if [ `check_restricted $SRC` -eq 1 ]; then
        log_error "Not allowed to copy images from $RESTRICTED_DIRS"
        error_message "Not allowed to copy image file $SRC"
        exit -1
    fi

    log "Copying local image $SRC to the image repository"

    DUMP="$COPY_COMMAND"
    ;;
esac

# rbt: BREST-1495
$(exec_and_log "eval $DUMP | $DD of=$TMP_DST bs=64k" \
             "Error dumping $SRC to $DST_HOST:$TMP_DST")

RC=$?
if [ "x$RC" != "x0" ]; then
    FORMAT_SRC=`$QEMU_IMG info $SRC | grep "^file format:" | awk '{print \$3}' || :`
    $($LN -s -f $SRC $TMP_DST >/dev/null 2>&1)
    if [ ! -r $TMP_DST ] || [ "x$FORMAT_SRC" != 'xqcow2' ]; then
        $RM -f $TMP_DST
        exit $RC
    fi
fi

#FILE_SIZE=$(( $(stat -c '%s' $TMP_DST) / 1024**2 ))
FILE_SIZE=`qemu-img measure --output=json -O qcow2 $SRC | jq '."required"'`
FILE_SIZEMB=$(( $FILE_SIZE / 1024 / 1024))
# add 8% to the size
SIZE8=$(bc<<<"scale=1;$FILE_SIZEMB*1.08"   | awk '{ print int($1) }')
if [ $SIZE8 -eq 0 ]; then
    SIZE8=12
fi
# create new volume
$SUDO $LVCREATE --wipesignatures n -L${SIZE8}M -n $LV_NAME $VG_NAME >/dev/null 2>&1
# make it active
$SUDO $LVCHANGE -ay "${VG_NAME}/${LV_NAME}" >/dev/null 2>&1
# get image format
FORMAT=`$QEMU_IMG info $TMP_DST | grep "^file format:" | awk '{print \$3}' || :`
# copy content

exec_and_log "$SUDO $QEMU_IMG convert -O qcow2 ${TMP_DST} $DEV" "Error create ${DEV}"

# check the result size
OFFSET=$($SUDO $QEMU_IMG check  --output=json $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=100
fi

# reduce the result volume
if [ $OFFSET8 -lt $SIZE8 ]; then
    $SUDO $LVREDUCE -L"$OFFSET8"M  $DEV -f >/dev/null 2>&1
fi

$SUDO $LVCHANGE -an "${VG_NAME}/${LV_NAME}" >/dev/null 2>&1


$RM -f $TMP_DST

echo "$DEV qcow2"
