1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

Merge branch 'feature-1254'

This commit is contained in:
Ruben S. Montero 2012-07-02 12:52:05 +02:00
commit ed45af12da
11 changed files with 321 additions and 84 deletions

View File

@ -51,7 +51,6 @@ done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/HOST \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VG_NAME \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_IQN \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_TID \
/DS_DRIVER_ACTION_DATA/IMAGE/PATH \
/DS_DRIVER_ACTION_DATA/IMAGE/SIZE)
@ -62,9 +61,8 @@ UMASK="${XPATH_ELEMENTS[3]}"
DST_HOST="${XPATH_ELEMENTS[4]:-$HOST}"
VG_NAME="${XPATH_ELEMENTS[5]:-$VG_NAME}"
BASE_IQN="${XPATH_ELEMENTS[6]:-$BASE_IQN}"
BASE_TID="${XPATH_ELEMENTS[7]:-$BASE_TID}"
SRC="${XPATH_ELEMENTS[8]}"
SIZE="${XPATH_ELEMENTS[9]}"
SRC="${XPATH_ELEMENTS[7]}"
SIZE="${XPATH_ELEMENTS[8]}"
set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
@ -72,8 +70,6 @@ LV_NAME="lv-one-${ID}"
IQN="$BASE_IQN:$DST_HOST.$VG_NAME.$LV_NAME"
DEV="/dev/$VG_NAME/$LV_NAME"
let TID=ID+BASE_TID
LV_SRC=$(echo $SRC|awk -F. '{print $NF}')
DEV_SRC="/dev/$VG_NAME/$LV_SRC"
@ -82,9 +78,12 @@ CLONE_CMD=$(cat <<EOF
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
$SUDO $DD if=$DEV_SRC of=$DEV bs=64k
$SUDO $(tgtadm_target_new "$TID" "$IQN")
$SUDO $(tgtadm_target_bind_all "$TID")
$SUDO $(tgtadm_logicalunit_new "$TID" "$DEV")
TID=\$($SUDO $(tgtadm_next_tid))
$SUDO $(tgtadm_target_new "\$TID" "$IQN")
$SUDO $(tgtadm_target_bind_all "\$TID")
$SUDO $(tgtadm_logicalunit_new "\$TID" "$DEV")
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
EOF
)

View File

@ -55,7 +55,6 @@ done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/HOST \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VG_NAME \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_IQN \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_TID \
/DS_DRIVER_ACTION_DATA/IMAGE/PATH \
/DS_DRIVER_ACTION_DATA/IMAGE/SIZE \
/DS_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/MD5 \
@ -68,11 +67,10 @@ UMASK="${XPATH_ELEMENTS[3]}"
DST_HOST="${XPATH_ELEMENTS[4]:-$HOST}"
VG_NAME="${XPATH_ELEMENTS[5]:-$VG_NAME}"
BASE_IQN="${XPATH_ELEMENTS[6]:-$BASE_IQN}"
BASE_TID="${XPATH_ELEMENTS[7]:-$BASE_TID}"
SRC="${XPATH_ELEMENTS[8]}"
SIZE="${XPATH_ELEMENTS[9]}"
MD5="${XPATH_ELEMENTS[10]}"
SHA1="${XPATH_ELEMENTS[11]}"
SRC="${XPATH_ELEMENTS[7]}"
SIZE="${XPATH_ELEMENTS[8]}"
MD5="${XPATH_ELEMENTS[9]}"
SHA1="${XPATH_ELEMENTS[10]}"
set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
@ -80,14 +78,18 @@ LV_NAME="lv-one-${ID}"
IQN="$BASE_IQN:$DST_HOST.$VG_NAME.$LV_NAME"
DEV="/dev/$VG_NAME/$LV_NAME"
let TID=ID+BASE_TID
REGISTER_CMD=$(cat <<EOF
set -e
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
$SUDO $(tgtadm_target_new "$TID" "$IQN")
$SUDO $(tgtadm_target_bind_all "$TID")
$SUDO $(tgtadm_logicalunit_new "$TID" "$DEV")
TID=\$($SUDO $(tgtadm_next_tid))
[ -z "\$TID" ] && TID=1
$SUDO $(tgtadm_target_new "\$TID" "$IQN")
$SUDO $(tgtadm_target_bind_all "\$TID")
$SUDO $(tgtadm_logicalunit_new "\$TID" "$DEV")
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
EOF
)

View File

@ -23,9 +23,10 @@ BASE_IQN=iqn.2012-02.org.opennebula
# Default volume group
VG_NAME=vg-one
# Starting TID for iSCSI targets
BASE_TID=1
# Lists of hosts (separated by spaces) for which no iscsiadm login or logout
# is performed.
NO_ISCSI="$HOSTNAME"
# File where the iSCSI configured is dumped to (tgt-admin --dump)
# If it poings to /dev/null, iSCSI targets will not be persistent
TARGET_CONF=/etc/tgt/targets.conf

View File

@ -53,11 +53,9 @@ done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/BASE_PATH \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/HOST \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VG_NAME \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_IQN \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_TID \
/DS_DRIVER_ACTION_DATA/IMAGE/FSTYPE \
/DS_DRIVER_ACTION_DATA/IMAGE/SIZE)
BASE_PATH="${XPATH_ELEMENTS[0]}"
RESTRICTED_DIRS="${XPATH_ELEMENTS[1]}"
SAFE_DIRS="${XPATH_ELEMENTS[2]}"
@ -65,9 +63,8 @@ UMASK="${XPATH_ELEMENTS[3]}"
DST_HOST="${XPATH_ELEMENTS[4]:-$HOST}"
VG_NAME="${XPATH_ELEMENTS[5]:-$VG_NAME}"
BASE_IQN="${XPATH_ELEMENTS[6]:-$BASE_IQN}"
BASE_TID="${XPATH_ELEMENTS[7]:-$BASE_TID}"
FSTYPE="${XPATH_ELEMENTS[8]}"
SIZE="${XPATH_ELEMENTS[9]:-0}"
FSTYPE="${XPATH_ELEMENTS[7]}"
SIZE="${XPATH_ELEMENTS[8]:-0}"
set_up_datastore "$BASE_PATH" "$RESTRICTED_DIRS" "$SAFE_DIRS" "$UMASK"
@ -75,28 +72,25 @@ LV_NAME="lv-one-${ID}"
IQN="$BASE_IQN:$DST_HOST.$VG_NAME.$LV_NAME"
DEV="/dev/$VG_NAME/$LV_NAME"
let TID=ID+BASE_TID
REGISTER_CMD=$(cat <<EOF
set -e
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
$SUDO $(tgtadm_target_new "$TID" "$IQN")
$SUDO $(tgtadm_target_bind_all "$TID")
$SUDO $(tgtadm_logicalunit_new "$TID" "$DEV")
$SUDO $(mkfs_command "$DEV" "$FSTYPE")
TID=\$($SUDO $(tgtadm_next_tid))
[ -z "\$TID" ] && TID=1
$SUDO $(tgtadm_target_new "\$TID" "$IQN")
$SUDO $(tgtadm_target_bind_all "\$TID")
$SUDO $(tgtadm_logicalunit_new "\$TID" "$DEV")
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
if [ "$FSTYPE" != "save_as" ]; then
$SUDO $(mkfs_command "$DEV" "$FSTYPE")
fi
EOF
)
# ------------ Image to save_as disk, no need to create a FS ------------
if [ "$FSTYPE" = "save_as" ]; then
echo "$DST"
exit 0
fi
# ------------ Create the image to the repository ------------
ssh_exec_and_log "$DST_HOST" "$REGISTER_CMD" \
"Error registering $DST_HOST:$DEV"
"Error registering $DST_HOST:$DEV"
echo "$IQN"

View File

@ -45,12 +45,10 @@ unset i XPATH_ELEMENTS
while IFS= read -r -d '' element; do
XPATH_ELEMENTS[i++]="$element"
done < <($XPATH /DS_DRIVER_ACTION_DATA/IMAGE/SOURCE \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/HOST \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BASE_TID)
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/HOST)
SRC="${XPATH_ELEMENTS[0]}"
DST_HOST="${XPATH_ELEMENTS[1]:-$HOST}"
BASE_TID="${XPATH_ELEMENTS[2]:-$BASE_TID}"
BASE_IQN=`echo $SRC|$CUT -d: -f1`
TARGET=`echo $SRC|$CUT -d: -f2`
@ -58,12 +56,15 @@ LV_NAME=`echo $TARGET|$AWK -F. '{print $(NF)}'`
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
DEV="/dev/$VG_NAME/$LV_NAME"
let TID=ID+BASE_TID
IQN="$BASE_IQN:$DST_HOST.$VG_NAME.$LV_NAME"
RM_COMMAND=$(cat <<EOF
$SUDO $(tgtadm_target_delete "$TID")
TID=\$($SUDO $(tgtadm_get_tid_for_iqn "$IQN"))
$SUDO $(tgtadm_target_delete "\$TID")
$SUDO $SYNC
$SUDO $LVREMOVE -f $VG_NAME/$LV_NAME
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
EOF
)

View File

@ -43,6 +43,7 @@ SUDO=sudo
SYNC=sync
TAR=tar
TGTADM=tgtadm
TGTADMIN=tgt-admin
VMKFSTOOLS=/usr/sbin/vmkfstools
WGET=wget
@ -342,6 +343,23 @@ function tgtadm_target_delete {
echo "$TGTADM --lld iscsi --op delete --mode target --tid $ID"
}
function tgtadm_get_tid_for_iqn {
IQN="$1"
echo "$TGTADM --lld iscsi --op show --mode target | \
grep \"$IQN\" | awk '{split(\$2,tmp,\":\"); print(tmp[1]);}'"
}
function tgtadm_next_tid {
echo "$TGTADM --lld iscsi --op show --mode target | \
$GREP \"Target\" | tail -n 1 | \
$AWK '{split(\$2,tmp,\":\"); print tmp[1]+1;}'"
}
function tgt_admin_dump_config {
FILE_PATH="$1"
echo "$TGTADMIN --dump |sudo tee $FILE_PATH >& /dev/null"
}
###
function iscsiadm_discovery {

View File

@ -36,8 +36,78 @@ else
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
fi
. $TMCOMMON
DRIVER_PATH=$(dirname $0)
log_error "CLONE not supported for TM_ISCSI. Use persistent images"
. $TMCOMMON
exit 1
source ${DRIVER_PATH}/../../datastore/iscsi/iscsi.conf
#-------------------------------------------------------------------------------
# Set src, dst path and dir
#-------------------------------------------------------------------------------
TARGET=`arg_path $SRC`
DST_PATH=`arg_path $DST`
DST_HOST=`arg_host $DST`
DST_DIR=`dirname $DST_PATH`
#-------------------------------------------------------------------------------
# IQN and TARGETs
#-------------------------------------------------------------------------------
IQN=$SRC
NEW_IQN=$IQN-$VMID
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
LV_NAME=`echo $TARGET|$AWK -F. '{print $(NF)}'`
SOURCE_DEV="/dev/$VG_NAME/$LV_NAME"
TARGET_LV_NAME=`echo $LV_NAME-$VMID`
TARGET_DEV="/dev/${VG_NAME}/${TARGET_LV_NAME}"
TARGET_HOST="${TARGET%.$VG_NAME.$LV_NAME}"
#-------------------------------------------------------------------------------
# Clone script
#-------------------------------------------------------------------------------
CLONE_CMD=$(cat <<EOF
set -e
# get size
SIZE=\$($SUDO $LVS --noheadings -o lv_size "$SOURCE_DEV")
# create lv
$SUDO $LVCREATE -L\${SIZE} ${VG_NAME} -n ${TARGET_LV_NAME}
# clone lv with dd
$SUDO $DD if=$SOURCE_DEV of=$TARGET_DEV bs=64k
# new iscsi target
TID=\$($SUDO $(tgtadm_next_tid))
$SUDO $(tgtadm_target_new "\$TID" "$NEW_IQN")
$SUDO $(tgtadm_target_bind_all "\$TID")
$SUDO $(tgtadm_logicalunit_new "\$TID" "$TARGET_DEV")
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
EOF
)
ssh_exec_and_log "$TARGET_HOST" "$CLONE_CMD" \
"Error cloning $DST_HOST:$TARGET_DEV"
DISCOVERY_CMD=$(cat <<EOF
set -e
mkdir -p $DST_DIR
$SUDO $(iscsiadm_discovery "$TARGET_HOST")
$SUDO $(iscsiadm_login "$NEW_IQN" "$TARGET_HOST")
sleep 2
DISK_BY_PATH=\$(ls /dev/disk/by-path/*$NEW_IQN-lun-1)
ln -s "\$DISK_BY_PATH" "$DST_PATH"
EOF
)
ssh_exec_and_log "$DST_HOST" "$DISCOVERY_CMD" \
"Error discovering $NEW_IQN in $DST_HOST"
exit 0

View File

@ -35,6 +35,10 @@ fi
. $TMCOMMON
DRIVER_PATH=$(dirname $0)
source ${DRIVER_PATH}/../../datastore/iscsi/iscsi.conf
#-------------------------------------------------------------------------------
# Return if deleting a disk, we will delete them when removing the
# remote_system_ds directory for the VM (remotely)
@ -42,21 +46,88 @@ fi
DST_PATH=`arg_path $DST`
DST_HOST=`arg_host $DST`
if [ `is_disk $DST_PATH` -eq 1 ]; then
# Disk
LOGOUT_CMD=$(cat <<EOF
set -e
IQN=\$(readlink $DST_PATH |grep -o 'iqn.*$')
IQN=\${IQN%-lun-1}
$SUDO $(iscsiadm_logout "\$IQN")
EOF
)
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \
"Error logging out $IQN"
#-------------------------------------------------------------------------------
# Get IQN information
#-------------------------------------------------------------------------------
DISK_ID=$(echo "$DST_PATH" | $AWK -F. '{print $NF}')
XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin"
unset i XPATH_ELEMENTS
while IFS= read -r -d '' element; do
XPATH_ELEMENTS[i++]="$element"
done < <(onevm show -x $VMID| $XPATH \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/SOURCE \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/PERSISTENT)
IQN="${XPATH_ELEMENTS[0]}"
PERSISTENT="${XPATH_ELEMENTS[1]}"
if [ -z "$PERSISTENT" ]; then
NEW_IQN=$IQN-$VMID
else
NEW_IQN=$IQN
fi
TARGET=`arg_path $IQN`
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
LV_NAME=`echo $TARGET|$AWK -F. '{print $(NF)}'`
DEV="/dev/$VG_NAME/$LV_NAME"
TARGET_HOST="${TARGET%.$VG_NAME.$LV_NAME}"
TARGET_LV_NAME=`echo $NEW_IQN|$AWK -F. '{print $(NF)}'`
#-------------------------------------------------------------------------------
# Remove directory if dst_path is a directory
#-------------------------------------------------------------------------------
if [ `is_disk $DST_PATH` -eq 0 ]; then
# Directory
log "Deleting $DST_PATH"
ssh_exec_and_log "$DST_HOST" "rm -rf $DST_PATH" "Error deleting $DST_PATH"
exit 0
fi
#-------------------------------------------------------------------------------
# Logout from the iSCSI target in the hypervisor
#-------------------------------------------------------------------------------
LOGOUT_CMD=$(cat <<EOF
set -e
$SUDO $(iscsiadm_logout $NEW_IQN)
EOF
)
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \
"Error logging out $NEW_IQN"
if [ "$PERSISTENT" = "YES" ]; then
exit 0
fi
#-------------------------------------------------------------------------------
# Remove target and LV in the iSCSI server
#-------------------------------------------------------------------------------
DELETE_CMD=$(cat <<EOF
set -e
# get tid for IQN
TID=\$($SUDO $(tgtadm_get_tid_for_iqn "$NEW_IQN"))
# remove iscsi target
$SUDO $(tgtadm_target_delete "\$TID")
# dump configuration
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
# remove lv
$SUDO $LVREMOVE -f $VG_NAME/$TARGET_LV_NAME
EOF
)
ssh_exec_and_log "$TARGET_HOST" "$DELETE_CMD" \
"Error logging out $IQN"
exit 0

View File

@ -38,6 +38,9 @@ fi
. $TMCOMMON
DRIVER_PATH=$(dirname $0)
source ${DRIVER_PATH}/../../datastore/iscsi/iscsi.conf
#-------------------------------------------------------------------------------
# Set dst path and dir
#-------------------------------------------------------------------------------
@ -60,7 +63,7 @@ DISCOVER_CMD=$(cat <<EOF
mkdir -p $DST_DIR
$SUDO $(iscsiadm_discovery "$TARGET_HOST")
$SUDO $(iscsiadm_login "$IQN" "$TARGET_HOST")
sleep 1
sleep 2
DISK_BY_PATH=\$(ls /dev/disk/by-path/*$IQN-lun-1)
ln -s "\$DISK_BY_PATH" "$DST_PATH"
EOF
@ -68,4 +71,5 @@ EOF
ssh_exec_and_log "$DST_HOST" "$DISCOVER_CMD" \
"Error registering $DST_HOST:$DEV"
exit 0

View File

@ -70,33 +70,47 @@ if [ "$SRC" == "$DST" ]; then
log "Not moving $SRC to $DST, they are the same path"
exit 0
fi
#-------------------------------------------------------------------------------
# Get image information
#-------------------------------------------------------------------------------
XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin"
unset i XPATH_ELEMENTS
DISK_ID=$(echo "$SRC_PATH" | $AWK -F. '{print $NF}')
while IFS= read -r -d '' element; do
XPATH_ELEMENTS[i++]="$element"
done < <(onevm show -x $VMID| $XPATH \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/SOURCE \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/PERSISTENT)
IQN="${XPATH_ELEMENTS[0]}"
PERSISTENT="${XPATH_ELEMENTS[1]}"
if [ -z "$PERSISTENT" ]; then
IQN=$IQN-$VMID
fi
#-------------------------------------------------------------------------------
# Start actions
#-------------------------------------------------------------------------------
if is_iscsi "$SRC_HOST"; then
log "Logging out of $IQN in $SRC_HOST"
LOGOUT_CMD=$(cat <<EOF
set -e
IQN=\$(readlink $SRC_PATH |grep -o 'iqn.*$')
IQN=\${IQN%-lun-1}
$SUDO $(iscsiadm_logout "\$IQN")
$SUDO $(iscsiadm_logout "$IQN")
EOF
)
ssh_exec_and_log "$SRC_HOST" "$LOGOUT_CMD" \
"Error logging out $SRC_HOST:$SRC_PATH (IQN)"
"Error logging out $SRC_HOST:$SRC_PATH ($IQN)"
fi
if is_iscsi "$DST_HOST"; then
log "Logging in to IQN in $SRC_HOST"
log "Getting IQN from $SRC_HOST:$SRC_PATH"
IQN=$($SSH "$SRC_HOST" "readlink $SRC_PATH |grep -o 'iqn.*$'" )
IQN=${IQN%-lun-1}
if [ -z "$IQN" ]; then
log_error "Error getting IQN"
exit 1
fi
log "Logging in to $IQN in $SRC_HOST"
TARGET_HOST=$(iqn_get_host "$IQN")
@ -111,9 +125,8 @@ if is_iscsi "$DST_HOST"; then
EOF
)
ssh_exec_and_log "$DST_HOST" "$LOGIN_CMD" \
"Error logging in $IQN"
ssh_exec_and_log "$DST_HOST" "$LOGIN_CMD" \
"Error logging in $IQN"
fi
exit 0

View File

@ -36,10 +36,39 @@ else
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
fi
DRIVER_PATH=$(dirname $0)
. $TMCOMMON
source ${DRIVER_PATH}/../../datastore/iscsi/iscsi.conf
SRC_HOST=`arg_host $SRC`
IQN=$DST
NEW_IQN="$DST"
DISK_ID=$(echo $SRC|awk -F. '{print $NF}')
#-------------------------------------------------------------------------------
# Get image information
#-------------------------------------------------------------------------------
XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin"
unset i XPATH_ELEMENTS
while IFS= read -r -d '' element; do
XPATH_ELEMENTS[i++]="$element"
done < <(onevm show -x $VMID| $XPATH \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/SOURCE \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/SAVE_AS \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/PERSISTENT)
IQN="${XPATH_ELEMENTS[0]}"
SAVE_AS="${XPATH_ELEMENTS[1]}"
PERSISTENT="${XPATH_ELEMENTS[2]}"
if [ -z "$PERSISTENT" ]; then
IQN=$IQN-$VMID
fi
log "Logging out $IQN"
@ -52,4 +81,39 @@ EOF
ssh_exec_and_log "$SRC_HOST" "$LOGOUT_CMD" \
"Error logging out $IQN"
exit 0
# Exit if not save_as. We are finished if this was a persistent image.
[ -z "$SAVE_AS" ] && exit 0
#-------------------------------------------------------------------------------
# IQN and TARGETs
#-------------------------------------------------------------------------------
LV_NAME=`echo $IQN|$AWK -F. '{print $(NF)}'`
VG_NAME=`echo $IQN|$AWK -F. '{print $(NF-1)}'`
SOURCE_DEV="/dev/$VG_NAME/$LV_NAME"
TARGET=`arg_path $IQN`
TARGET_LV_NAME=`echo $NEW_IQN|$AWK -F. '{print $(NF)}'`
TARGET_DEV="/dev/$VG_NAME/$TARGET_LV_NAME"
TARGET_HOST="${TARGET%.$VG_NAME.$LV_NAME}"
CLONE_CMD=$(cat <<EOF
set -e
# clone lv with dd
$SUDO $DD if=$SOURCE_DEV of=$TARGET_DEV bs=64k
# remove if source_dev is not persistent
if [ -z "$PERSISTENT" ]; then
TID=\$($SUDO $(tgtadm_get_tid_for_iqn "$IQN"))
$SUDO $(tgtadm_target_delete "\$TID")
$SUDO $SYNC
$SUDO $LVREMOVE -f $VG_NAME/$LV_NAME
$SUDO $(tgt_admin_dump_config "$TARGET_CONF")
fi
EOF
)
ssh_exec_and_log "$TARGET_HOST" "$CLONE_CMD" \
"Error cloning $DST_HOST:$TARGET_DEV or removing nonpersistent $IQN"