mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-22 18:50:08 +03:00
Feature #1254: tm_mad part of the full iSCSI support.
This commit has adapted from the contribution provided by SZTAKI LPDS.
This commit is contained in:
parent
d3d122592b
commit
3058af7c3c
@ -36,8 +36,76 @@ 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
|
||||
#-------------------------------------------------------------------------------
|
||||
# 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-$VM_ID
|
||||
|
||||
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" "$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
|
||||
|
@ -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,80 @@ 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"
|
||||
else
|
||||
#-------------------------------------------------------------------------------
|
||||
# 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]}"
|
||||
|
||||
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}"
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# 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 "$IQN")
|
||||
EOF
|
||||
)
|
||||
|
||||
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \
|
||||
"Error logging out $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 "$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/$LV_NAME
|
||||
EOF
|
||||
)
|
||||
|
||||
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \
|
||||
"Error logging out $IQN"
|
||||
|
||||
exit 0
|
||||
|
@ -60,7 +60,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 +68,5 @@ EOF
|
||||
|
||||
ssh_exec_and_log "$DST_HOST" "$DISCOVER_CMD" \
|
||||
"Error registering $DST_HOST:$DEV"
|
||||
|
||||
exit 0
|
||||
|
@ -115,5 +115,4 @@ EOF
|
||||
"Error logging in $IQN"
|
||||
fi
|
||||
|
||||
|
||||
exit 0
|
||||
|
@ -36,10 +36,33 @@ else
|
||||
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
|
||||
fi
|
||||
|
||||
DRIVER_PATH=$(dirname $0)
|
||||
|
||||
. $TMCOMMON
|
||||
|
||||
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]}"
|
||||
|
||||
log "Logging out $IQN"
|
||||
|
||||
@ -52,4 +75,37 @@ 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_LV_NAME=`echo $NEW_IQN|$AWK -F. '{print $(NF)}'`
|
||||
TARGET_DEV="/dev/$VG_NAME/$TARGET_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 [ "$PERSISTENT" != "YES" ]; 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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user