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

Feature #3782: Clean code, refactor and fix concept errors

This commit is contained in:
Jaime Melis 2015-08-11 12:56:49 +02:00
parent a9367b01f9
commit b200e9f938
5 changed files with 46 additions and 72 deletions

View File

@ -79,6 +79,17 @@ ssh_make_path $DST_HOST $DST_DIR
#-------------------------------------------------------------------------------
# Clone (cp) SRC into DST
#-------------------------------------------------------------------------------
CLONE_CMD=$(cat <<EOF
cd $DST_DIR
mkdir -p ${DST_PATH}.snap
rm -f $DST_PATH
$QEMU_IMG create -b $SRC_PATH -f qcow2 ${DST_PATH}.snap/0
ln -s ${DST_PATH}.snap/0 ${DST_PATH}
${RESIZE_CMD}
EOF
)
case $SRC in
http://*)
log "Downloading $SRC into $DST_PATH"
@ -90,17 +101,10 @@ http://*)
*)
log "Cloning $SRC_PATH in $DST"
ORIGINAL_SIZE=${ORIGINAL_SIZE:-0}
if [ "$SIZE" -ge "$ORIGINAL_SIZE" ]; then
if [ -n "$ORIGINAL_SIZE" -a "$SIZE" -gt "$ORIGINAL_SIZE" ]; then
RESIZE_CMD="qemu-img resize ${DST_PATH} ${SIZE}M"
fi
CLONE_CMD="cd $DST_DIR; rm -f $DST_PATH; \
$QEMU_IMG create -b $SRC_PATH -f qcow2 ${DST_PATH}.orig; \
ln -s ${DST_PATH}.orig ${DST_PATH}; \
${RESIZE_CMD}"
ssh_exec_and_log "$DST_HOST" "$CLONE_CMD" "Error copying $SRC to $DST"
;;
esac

View File

@ -54,26 +54,21 @@ done < <(onevm show -x $VMID| $XPATH \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/SOURCE \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/CLONE \
/VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/TARGET \
"/VM/SNAPSHOTS[DISK_ID=$DISK_ID]/SNAPSHOT[last()]/ID" \
/VM/HISTORY_RECORDS/HISTORY/VMMMAD \
/VM/STATE \
/VM/LCM_STATE \
/VM/DEPLOY_ID \
'%m%/VM/TEMPLATE/DISK/TARGET')
DISK_SRC="${XPATH_ELEMENTS[j++]}"
CLONE="${XPATH_ELEMENTS[j++]}"
TARGET="${XPATH_ELEMENTS[j++]}"
LAST_SNAP_ID="${XPATH_ELEMENTS[j++]}"
VMMAD="${XPATH_ELEMENTS[j++]}"
VMMMAD="${XPATH_ELEMENTS[j++]}"
STATE="${XPATH_ELEMENTS[j++]}"
LCM_STATE="${XPATH_ELEMENTS[j++]}"
DEPLOY_ID="${XPATH_ELEMENTS[j++]}"
ALL_DISKS="${XPATH_ELEMENTS[j++]}"
if [ -z "$LAST_SNAP_ID" ]; then
LAST_SNAP_ID=0
fi
SYSTEM_DS_PATH=$(dirname ${SRC_PATH})
IMAGE_DS_PATH=$(dirname ${DISK_SRC})
@ -87,13 +82,10 @@ else
DISK_PATH_ORIG=$DISK_PATH
fi
SNAP_ID=$(( $LAST_SNAP_ID + 1 ))
NEXT_SNAP_ID=$(($SNAP_ID+1))
SNAP_DIR="${DISK_PATH}.snap"
SNAP_PATH="${SNAP_DIR}/${SNAP_ID}"
LAST_SNAP_PATH="${SNAP_DIR}/${LAST_SNAP_ID}"
SNAP_PATH_RELATIVE=$(basename ${SNAP_PATH})
CURRENT_PATH=${DISK_PATH}
SNAP_PATH="${SNAP_DIR}/${NEXT_SNAP_ID}"
# virsh snapshot-create by default creates snapshots for all the disks that
# are not read only. To be able to make a snapshot in only one of the disks
@ -112,11 +104,10 @@ CURRENT_PATH=${DISK_PATH}
# </disks>
# </domainsnapshot>
DOC="
<domainsnapshot>
<name>${SNAP_ID}</name>
<description>snap ${SNAP_ID}</description>
<name>${DISK_ID}-${SNAP_ID}</name>
<description>snap ${DISK_ID}-${SNAP_ID}</description>
<disks>"
for disk in $ALL_DISKS; do
@ -142,44 +133,30 @@ if [ ! -d "${SNAP_DIR}" ]; then
mkdir "${SNAP_DIR}"
fi
PREVIOUS_SNAP=$(readlink $SYSTEM_DS_DISK_PATH)
# 57 is DISK_SNAPSHOT. When the snapshot is done with the VM in running state
# TODO: LCM_STATE will *always* be 57. Need to check virsh status.
if [ "$LCM_STATE" = "57" ] && [ "$VMMMAD" = "kvm" ] ; then
# The file must be created beforehand or libvirt complains with
# "permission denied"
touch $SNAP_PATH
# Temporary xml file
FILENAME="/tmp/snapshot-\$(date +%s)"
FILENAME="/tmp/snapshot-$VMID-$DISK_ID-$SNAP_ID"
echo -e "$DOC" > \$FILENAME
virsh -c qemu:///system snapshot-create one-$VMID --disk-only --atomic \
--xmlfile \$FILENAME --quiesce
virsh -c qemu:///system snapshot-create $DEPLOY_ID --disk-only --atomic \
--xmlfile \$FILENAME
rm \${FILENAME}
qemu-img rebase -u -b "\${PREVIOUS_SNAP}" "${SNAP_PATH}"
ln -sf $SNAP_PATH $SYSTEM_DS_DISK_PATH
rm \$FILENAME
else
if [ "$SNAP_ID" = "1" ]; then
ORIG="$DISK_PATH_ORIG"
else
ORIG="$LAST_SNAP_PATH"
fi
qemu-img create -f qcow2 -b "\${ORIG}" "${SNAP_PATH}"
qemu-img create -f qcow2 -b "\${PREVIOUS_SNAP}" "${SNAP_PATH}"
ln -sf $SNAP_PATH $SYSTEM_DS_DISK_PATH
fi
if [ "$SNAP_ID" = "1" ] && [ "$CLONE" != "YES" ]; then
ln -sf "${DISK_PATH_ORIG}" "${SNAP_DIR}/0"
fi
BACKING_FILE=\$(qemu-img info ${SNAP_PATH} | grep '^backing file:' | \
cut -d: -f2 | sed 's/^ //')
if [ "\${BACKING_FILE}" = "${SYSTEM_DS_DISK_PATH}" ]; then
REAL_BACKING_FILE="${DISK_PATH_ORIG}"
qemu-img rebase -u -b "\${REAL_BACKING_FILE}" "${SNAP_PATH}"
fi
EOT
)

View File

@ -69,8 +69,6 @@ fi
SNAP_DIR="${DISK_PATH}.snap"
SNAP_PATH="${SNAP_DIR}/${SNAP_ID}"
SNAP_PATH_RELATIVE=$(basename ${SNAP_PATH})
CURRENT_PATH=${DISK_PATH}
ssh_exec_and_log "${SRC_HOST}" "rm ${SNAP_PATH}" \
"Error deleting snapshot ${SNAP_PATH}"

View File

@ -57,27 +57,20 @@ done < <(onevm show -x $VMID| $XPATH \
DISK_SRC="${XPATH_ELEMENTS[j++]}"
CLONE="${XPATH_ELEMENTS[j++]}"
SYSTEM_DS_PATH=$(dirname ${SRC_PATH})
IMAGE_DS_PATH=$(dirname ${DISK_SRC})
if [ "$CLONE" = "YES" ]; then
DISK_PATH="${SYSTEM_DS_PATH}/disk.${DISK_ID}"
DISK_PATH="${SYSTEM_DS_PATH}/disk.${DISK_ID}"
if [ "${CLONE}" = "YES" ]; then
SNAP_DIR="${DISK_PATH}.snap"
else
DISK_PATH=$DISK_SRC
SNAP_DIR="${DISK_SRC}.snap"
fi
NEXT_ID=$(( $SNAP_ID + 1 ))
SNAP_DIR="${DISK_PATH}.snap"
SNAP_PATH="${SNAP_DIR}/${SNAP_ID}"
SNAP_PATH_NEXT="${SNAP_DIR}/${NEXT_ID}"
SNAP_PATH_RELATIVE=$(basename ${SNAP_PATH})
CURRENT_PATH=${DISK_PATH}
CMD="set -ex ; \
qemu-img create -f qcow2 -b \"${SNAP_PATH}\" \"${CURRENT_PATH}\"; \
"
SNAP_CMD="qemu-img create -f qcow2 -b \"${SNAP_PATH}\" \"\$(readlink ${DISK_PATH})\""
ssh_exec_and_log "${SRC_HOST}" "${CMD}" \
ssh_exec_and_log "${SRC_HOST}" "${SNAP_CMD}" \
"Error reverting snapshot to ${SNAP_PATH}"

View File

@ -52,6 +52,7 @@ DST_DS_PATH="$(dirname $(dirname $(dirname $DST_PATH)))"
SRC_DS_PATH="$(dirname $(dirname $SRC_ARG_PATH))"
SRC_PATH="${DST_DS_PATH}${SRC_ARG_PATH##$SRC_DS_PATH}"
SNAP_DIR="${SRC_PATH}.snap"
#-------------------------------------------------------------------------------
# Create DST path
@ -66,18 +67,19 @@ log "Linking $SRC_PATH in $DST"
CMD=$(cat <<EOT
set -ex
SRC="$SRC_PATH"
SNAP_DIR="${SRC_PATH}.snap"
mkdir -p "${SNAP_DIR}"
if [ -d "\${SNAP_DIR}" ]; then
SNAP="\$(ls \${SNAP_DIR} | sort -n | tail -n 1)"
SRC="\${SNAP_DIR}/\${SNAP}"
SNAP="\$(ls ${SNAP_DIR} | sort -n | tail -n 1)"
if [ -z "\${SNAP}" ]; then
SNAP=0
ln -sf "$SRC_PATH" "$SNAP_DIR/0"
fi
ln -sf "\$SRC" "$DST_PATH"
ln -sf "$SNAP_DIR/\$SNAP" "$DST_PATH"
EOT
)
ssh_exec_and_log $DST_HOST "$CMD" \
"Error linking $SRC to $DST"
ssh_exec_and_log $DST_HOST "$CMD" "Error linking $SRC to $DST"
exit 0