#!/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.                                             #
#--------------------------------------------------------------------------- #

###############################################################################
# This script is used to create a VM image (SRC) of size (SIZE) and formatted
# as (FS)
###############################################################################

# -------- Set up the environment to source common tools & conf ------------

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
source ${DRIVER_PATH}/../../etc/datastore/ceph/ceph.conf

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

DRV_ACTION=`cat -`
ID=$1

TS=`date +"%Y-%m-%d %H:%M:%S"`
echo "${TS} [mkfs] - DRV_ACTION ${DRV_ACTION}" >>  /var/log/one/efs.log
echo "${TS} [mkfs] - ID ${ID}" >>  /var/log/one/efs.log

XPATH="${DRIVER_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/BRIDGE_LIST \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/POOL_NAME \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/STAGING_DIR \
                    /DS_DRIVER_ACTION_DATA/IMAGE/FSTYPE \
                    /DS_DRIVER_ACTION_DATA/IMAGE/SIZE \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/ISCSI_BASE_IQN \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/ISCSI_HOST \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/ISCSI_LUN \
                    /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/CLASS \
                    /DS_DRIVER_ACTION_DATA/IMAGE/NAME)

unset i

BASE_PATH="${XPATH_ELEMENTS[i++]}"
RESTRICTED_DIRS="${XPATH_ELEMENTS[i++]}"
SAFE_DIRS="${XPATH_ELEMENTS[i++]}"
BRIDGE_LIST="${XPATH_ELEMENTS[i++]}"
POOL_NAME="${XPATH_ELEMENTS[i++]:-$POOL_NAME}"
STAGING_DIR="${XPATH_ELEMENTS[i++]:-$STAGING_DIR}"
FSTYPE="${XPATH_ELEMENTS[i++]}"
SIZE="${XPATH_ELEMENTS[i++]}"
ISCSI_BASE_IQN="${XPATH_ELEMENTS[i++]}"
ISCSI_HOST="${XPATH_ELEMENTS[i++]}"
ISCSI_LUN="${XPATH_ELEMENTS[i++]}"
STOR_CLASS="${XPATH_ELEMENTS[i++]}"
IMAGE_NAME="${XPATH_ELEMENTS[i++]}"

DST_HOST=`get_destination_host $ID`


#error_message "Mkfs stub"
#exit -1

if [ -z "$DST_HOST" ]; then
    error_message "Datastore template missing 'BRIDGE_LIST' attribute."
    exit -1
fi

#set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS"
IMAGE_SOURCE="${ISCSI_BASE_IQN}:${ID}"
#IMAGE_NAME="one-${ID}"
#RBD_SOURCE="${POOL_NAME}/${IMAGE_NAME}"
ZFS_SOURCE="${POOL_NAME}/one/${ID}"
IMAGE_PATH="/dev/zvol/${ZFS_SOURCE}"
# ------------ Image to save_as disk, no need to create a FS ------------

if [ "$FSTYPE" = "save_as" ]; then
    echo "$IMAGE_SOURCE"
    exit 0
fi

TGTCONF=$(cat <<EOF
<target "${ISCSI_BASE_IQN}:${ID}">
    backing-store ${IMAGE_PATH}
</target>
EOF
)

PARAMS=""

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

# ------------ Create the image in the repository ------------

#MKFS_CMD=`mkfs_command /dev/rbd/${RBD_SOURCE} $FSTYPE $SIZE`

#if [ "$RBD_FORMAT" = "2" ]; then
#    FORMAT_OPT="--image-format 2"
#fi

REGISTER_CMD=$(cat <<EOF
    sudo zfs create -p ${POOL_NAME}/one
    sudo zfs set canmount=noauto ${POOL_NAME}/one
    sudo zfs create -sV ${SIZE}M ${PARAMS} ${ZFS_SOURCE}
    sudo zfs set volmode=dev ${ZFS_SOURCE}
    sleep 5
UNAME=\$(uname)

case "\${UNAME}" in
    "FreeBSD")
       sudo ctladd ${ISCSI_BASE_IQN}:${ID} ${ISCSI_LUN} ${IMAGE_PATH} "${IMAGE_NAME}"
       sudo service ctld reload
       ;;
    "Linux")
       sudo /usr/bin/echo '$TGTCONF' > /etc/tgt/conf.d/img-${ID}.conf
       sudo /usr/sbin/tgt-admin --update ALL -c /etc/tgt/targets.conf
       ;;
    *)
       exit 1
       ;;
esac
sleep 15

EOF
)


echo "${TS} [mkfs] - REGISTER_CMD ${REGISTER_CMD}" >>  /var/log/one/efs.log

ssh_exec_and_log "$DST_HOST" "$REGISTER_CMD" \
    "Error registering $IMAGE_SOURCE in $DST_HOST"

echo "$IMAGE_SOURCE"
