#!/bin/bash

# -------------------------------------------------------------------------- #
# Copyright 2002-2019, OpenNebula Project, OpenNebula Systems                #
#                                                                            #
# Licensed under the Apache License, Version 2.0 (the "License"); you may    #
# not use this file except in compliance with the License. You may obtain    #
# a copy of the License at                                                   #
#                                                                            #
# http://www.apache.org/licenses/LICENSE-2.0                                 #
#                                                                            #
# Unless required by applicable law or agreed to in writing, software        #
# distributed under the License is distributed on an "AS IS" BASIS,          #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
# See the License for the specific language governing permissions and        #
# limitations under the License.                                             #
#--------------------------------------------------------------------------- #

# mkimage size format host:remote_system_ds/disk.i vmid dsid
#   - size in MB of the image
#   - format for the image
#   - host is the target host to deploy the VM
#   - remote_system_ds is the path for the system datastore in the host
#   - vmid is the id of the VM
#   - dsid is the target datastore (0 is the system datastore)

SIZE=$1
FSTYPE=$2
DST=$3

VMID=$4
DSID=$5

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

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)

source $TMCOMMON

source ${DRIVER_PATH}/../../etc/datastore/ceph/ceph.conf
source ${DRIVER_PATH}/../../datastore/libfs.sh

CEPH_UTILS=${DRIVER_PATH}/../../datastore/ceph/ceph_utils.sh

TS=`date +"%Y-%m-%d %H:%M:%S"`
echo "${TS} [TM:mkimage] - SIZE ${SIZE}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - DST ${DST}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - VMID ${VMID}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - DSID ${DSID}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - FSTYPE ${FSTYPE}" >>  /var/log/one/efs.log

#error_message "TM:MKIMAGE stub"
#exit -1

#-------------------------------------------------------------------------------
# Set dst path and dir
#-------------------------------------------------------------------------------

DST_PATH=`arg_path $DST`
DST_HOST=`arg_host $DST`
DST_DIR=`dirname $DST_PATH`

DISK_ID=$(echo $DST|awk -F. '{print $NF}')

#-------------------------------------------------------------------------------
#  Get Image information
#-------------------------------------------------------------------------------

XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin"

unset i j XPATH_ELEMENTS

while IFS= read -r -d '' element; do
        XPATH_ELEMENTS[i++]="$element"
done < <(onevm show -x $VMID | $XPATH  \
                            /VM/TEMPLATE/CONTEXT/AXC_VMTYPE \
                            /VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/ISCSI_HOST \
                            /VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/ISCSI_LUN \
                            /VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/ISCSI_BASE_IQN \
                            /VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/POOL_NAME \
                            /VM/NAME)

AXC_VMTYPE="${XPATH_ELEMENTS[j++]:-efs}"
ISCSI_HOST="${XPATH_ELEMENTS[j++]}"
ISCSI_LUN="${XPATH_ELEMENTS[j++]}"
ISCSI_BASE_IQN="${XPATH_ELEMENTS[j++]}"
POOL_NAME="${XPATH_ELEMENTS[j++]:-$POOL_NAME}"
VMNAME="${XPATH_ELEMENTS[j++]}"

case "$AXC_VMTYPE" in
  aa|acr|anc|cf|efs|rb|sp|ve)
    ;;
  *)
    AXC_VMTYPE="efs"
    ;;
esac

echo "${TS} [TM:mkimage] - ISCSI_HOST ${ISCSI_HOST}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - ISCSI_LUN ${ISCSI_LUN}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - ISCSI_BASE_IQN ${ISCSI_BASE_IQN}" >>  /var/log/one/efs.log
echo "${TS} [TM:mkimage] - POOL_NAME ${POOL_NAME}" >>  /var/log/one/efs.log


#-------------------------------------------------------------------------------
# Get Datastore information
#-------------------------------------------------------------------------------

unset i j XPATH_ELEMENTS

while IFS= read -r -d '' element; do
        XPATH_ELEMENTS[i++]="$element"
done < <(onedatastore show -x $DSID | $XPATH \
                            /DATASTORE/TEMPLATE/BRIDGE_LIST \
#                            /DATASTORE/TEMPLATE/EC_POOL_NAME \
#                            /DATASTORE/TEMPLATE/EC_POOL_NAME \
                            /DATASTORE/TEMPLATE/CLASS)

BRIDGE_LIST="${XPATH_ELEMENTS[j++]}"
STOR_CLASS="${XPATH_ELEMENTS[j++]}"

echo "${TS} [TM:mkimage] - BRIDGE_LIST ${BRIDGE_LIST}" >>  /var/log/one/efs.log
#error_message "TM:MKIMAGE stub"
#exit -1

QEMU_OPTS=''

RBD_SOURCE="${POOL_NAME}/one-sys-${VMID}-${DISK_ID}"

IQN_SOURCE="${ISCSI_BASE_IQN}:sys-${VMID}-${DISK_ID}"
SRC="${ISCSI_BASE_IQN}:sys"
ZVOL_DISK="${POOL_NAME}/one/${AXC_VMTYPE}/system/${VMID}/${DISK_ID}"
ssh_make_path $DST_HOST $DST_DIR

# if user requested a swap, we need to create a local
# swap formatted image and upload into existing Ceph image
MKFS_CMD=`mkfs_command $DST_PATH $FSTYPE $SIZE`

TGTCONF=$(cat <<EOF
<target "${IQN_SOURCE}">
    backing-store /${ZVOL_DISK}
</target>
EOF
)

PARAMS=""

if [ "x${STOR_CLASS}" == "xNVME" ]
then
    PARAMS="${PARAMS} -b 128k"
fi


MKIMAGE_CMD=$(cat <<EOF
    set -e -o pipefail
    sudo zfs create -sV ${SIZE}M ${PARAMS} ${ZVOL_DISK}
    sudo zfs set volmode=dev ${ZVOL_DISK}
    sleep 30
UNAME=\$(uname)

case "\${UNAME}" in
    "FreeBSD")
       sudo ctladd ${SRC}-${VMID}-${DISK_ID} ${ISCSI_LUN} /dev/zvol/${POOL_NAME}/one/${AXC_VMTYPE}/system/${VMID}/${DISK_ID} "${VMNAME}.${DISK_ID}"
       sleep 30
       sudo service ctld reload
       ;;
    "Linux")
       sudo /usr/bin/echo '$TGTCONF' > /etc/tgt/conf.d/${VM_ID}.conf
       sudo /usr/sbin/tgt-admin --update ALL -c /etc/tgt/targets.conf
       ;;
    *)
       exit 1
       ;;
esac
sleep 20


#    if [ "$FSTYPE" = "swap" ]; then
#        ${MKFS_CMD}
#
#        ${QEMU_IMG} convert -n \
#            -f raw "${DST_PATH}" \
#            -O rbd "rbd:${RBD_SOURCE}${QEMU_OPTS}"
#
#        ${RM} -f "${DST_PATH}"
#    fi
EOF
)

#DELIMAGE_CMD=$(cat <<EOF
#    export PATH=/usr/sbin:/sbin:\$PATH
 #   $RBD rm $RBD_SOURCE
 #   ${RM} -f "${DST_PATH}"
#EOF
#)
echo "${TS} [TM:mkimage] - MKIMAGE_CMD ${MKIMAGE_CMD}" >>  /var/log/one/efs.log
log "Making volatile disk of ${SIZE}M at $DST"

ssh_exec_and_log_no_error "$BRIDGE_LIST" "$MKIMAGE_CMD" \
    "Error creating volatile disk.$DISK_ID ($RBD_SOURCE) in $DST_HOST into pool $POOL_NAME."

rc=$?
exit $rc

if [ $rc != 0 ]; then
    ssh_exec_and_log_no_error "$DST_HOST" "$DELIMAGE_CMD" \
        "Error removing image"
fi

exit $rc
