1
0
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:
Jaime Melis 2012-06-28 14:54:03 +02:00
parent d3d122592b
commit 3058af7c3c
5 changed files with 206 additions and 19 deletions

View File

@ -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

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,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

View File

@ -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

View File

@ -115,5 +115,4 @@ EOF
"Error logging in $IQN"
fi
exit 0

View File

@ -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"