From 4a402f74e1670dc642e2345901ded87b8bb144db Mon Sep 17 00:00:00 2001 From: Anton Todorov Date: Thu, 14 Jul 2016 00:41:53 +0300 Subject: [PATCH] rework premigrate and postmigrate scripts The change was inspired by the live-migrate scripts for SYSTEM_DS with `shared` TM_MAD After some rework I've figured out that it could be made as some sort of generic one. The proposed changes * tm_common.sh - new function migrate_other() receiving all arguments from the caller script The function parses the TEMPLATE blob and exposes BASH arrays: DISK_ID_ARRAY - array of all VM DISK_ID TM_MAD_ARRAY - array of TM_MADs for each DISK_ID CLONE_ARRAY - aray of all CLONE values for each DISK_ID The function exposes DISK_ID of the CONTEXT disk too as CONTEXT_DISK_ID The function check for extra argument to prevent recursion loops For each TM_MAD it it is not current one the corresponding script is called with same arguments but one additional - to mark that it is called not from in the SYSTEM_DS context Usage: migrate_common "$@" The function is appended to the following TM_MADs: ceph fs_lvm qcow2 shared ssh The General idea is to allow live-migration of VMs with mix of disks with any of the above TM_MADs (different datastores) For example if we have VM with the following disks disk.0 ceph disk.1 ceph (context) disk.2 - ceph disk.3 - fs_lvm disk.4 - qcow2 In the above scenario when live migration is issed the following scripts will be called ceph/premigrate fs_lvm/premigrate "ceph" qcow2/premigrate "ceph" As most probably I am missing someting I am open for discussion :) --- src/tm_mad/ceph/postmigrate | 2 ++ src/tm_mad/ceph/premigrate | 2 ++ src/tm_mad/common/prepostmigrate | 55 ++++++++++++++++++++++++++++++++ src/tm_mad/fs_lvm/postmigrate | 2 ++ src/tm_mad/fs_lvm/premigrate | 2 ++ src/tm_mad/qcow2/postmigrate | 2 +- src/tm_mad/qcow2/premigrate | 2 +- src/tm_mad/shared/postmigrate | 18 +---------- src/tm_mad/shared/premigrate | 18 +---------- src/tm_mad/ssh/postmigrate | 2 +- src/tm_mad/ssh/premigrate | 2 +- src/tm_mad/tm_common.sh | 45 ++++++++++++++++++++++++++ 12 files changed, 114 insertions(+), 38 deletions(-) create mode 100755 src/tm_mad/common/prepostmigrate mode change 100755 => 120000 src/tm_mad/shared/postmigrate mode change 100755 => 120000 src/tm_mad/shared/premigrate diff --git a/src/tm_mad/ceph/postmigrate b/src/tm_mad/ceph/postmigrate index 8d7db40e85..f56874e4fe 100755 --- a/src/tm_mad/ceph/postmigrate +++ b/src/tm_mad/ceph/postmigrate @@ -53,6 +53,8 @@ fi #-------------------------------------------------------------------------------- +migrate_other "$@" + exec_and_log "$SSH $SRC_HOST rm -rf $DST_PATH" exit 0 diff --git a/src/tm_mad/ceph/premigrate b/src/tm_mad/ceph/premigrate index 7f44a3b10f..c4845d40c5 100755 --- a/src/tm_mad/ceph/premigrate +++ b/src/tm_mad/ceph/premigrate @@ -68,4 +68,6 @@ TAR_COPY="$TAR_COPY | $SSH $DST_HOST '$TAR -C $DST_PATH_DIRNAME --sparse -xf -'" exec_and_log "eval $TAR_COPY" "Error copying disk directory to target host" +migrate_other "$@" + exit 0 diff --git a/src/tm_mad/common/prepostmigrate b/src/tm_mad/common/prepostmigrate new file mode 100755 index 0000000000..3948c77672 --- /dev/null +++ b/src/tm_mad/common/prepostmigrate @@ -0,0 +1,55 @@ +#!/bin/bash + +# -------------------------------------------------------------------------- # +# Copyright 2002-2016, 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. # +#--------------------------------------------------------------------------- # +# PREMIGRATE SOURCE DST remote_system_dir vmid dsid template system_ds_mad +# POSTMIGRATE SOURCE DST remote_system_dir vmid dsid template system_ds_mad +# - SOURCE is the host where the VM is running +# - DST is the host where the VM is to be migrated +# - remote_system_dir is the path for the VM home in the system datastore +# - vmid is the id of the VM +# - dsid is the target datastore +# - template is the template of the VM in XML and base64 encoded +# - system_ds_mad flag if called by other SYSTEM_DS TM_MAD + +SRC="$1" +DST="$2" +DST_PATH="$3" +VM_ID="$4" +DS_ID="$5" +TEMPLATE_64="$6" +SYSTEM_MAD="$7" + +#-------------------------------------------------------------------------------- + +if [ -z "${ONE_LOCATION}" ]; then + TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh +else + TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh +fi + +source $TMCOMMON + +#-------------------------------------------------------------------------------- + +if [ "$SRC_HOST" == "$DST_HOST" ]; then + log "Not moving $SRC_HOST to $DST_HOST, they are the same host" + exit 0 +fi + +#-------------------------------------------------------------------------------- + +migrate_other "$@" diff --git a/src/tm_mad/fs_lvm/postmigrate b/src/tm_mad/fs_lvm/postmigrate index f216d427ad..bef1e6a9a6 100755 --- a/src/tm_mad/fs_lvm/postmigrate +++ b/src/tm_mad/fs_lvm/postmigrate @@ -59,3 +59,5 @@ EOF ssh_exec_and_log $SRC_HOST "$CMD" \ "Error running fs_lvm postmigrate" + +migrate_other "$@" diff --git a/src/tm_mad/fs_lvm/premigrate b/src/tm_mad/fs_lvm/premigrate index 0e4038f0ec..531c2660db 100755 --- a/src/tm_mad/fs_lvm/premigrate +++ b/src/tm_mad/fs_lvm/premigrate @@ -59,3 +59,5 @@ EOF ssh_exec_and_log $DST_HOST "$CMD" \ "Error running fs_lvm premigrate" + +migrate_other "$@" diff --git a/src/tm_mad/qcow2/postmigrate b/src/tm_mad/qcow2/postmigrate index d580dd8260..ae93fad874 120000 --- a/src/tm_mad/qcow2/postmigrate +++ b/src/tm_mad/qcow2/postmigrate @@ -1 +1 @@ -../common/postmigrate \ No newline at end of file +../common/prepostmigrate \ No newline at end of file diff --git a/src/tm_mad/qcow2/premigrate b/src/tm_mad/qcow2/premigrate index 0e108a8a26..ae93fad874 120000 --- a/src/tm_mad/qcow2/premigrate +++ b/src/tm_mad/qcow2/premigrate @@ -1 +1 @@ -../common/premigrate \ No newline at end of file +../common/prepostmigrate \ No newline at end of file diff --git a/src/tm_mad/shared/postmigrate b/src/tm_mad/shared/postmigrate deleted file mode 100755 index c6ab193730..0000000000 --- a/src/tm_mad/shared/postmigrate +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -DRIVER_PATH=$(dirname $0) - -DISK_COUNT=$(onevm show $4 -x|grep DISK_ID| wc -l) -TMS=$(onevm show $4 -x|sed -rn 's/[[:space:]]*<\!\[CDATA\[([^]]*).*/\1/p') - -XPATH="${DRIVER_PATH}/../../datastore/xpath.rb -b $7" - -for i in `seq 1 $DISK_COUNT`; do - TM=`echo $TMS|cut -d" " -f$i` - DISK_ID=`echo $i-1 | bc` - DEV=`ssh $1 "readlink $3/disk.$DISK_ID"` - ${DRIVER_PATH}/../$TMS/postmigrate "$1" "$2" "$DEV" -done - -exit 0 diff --git a/src/tm_mad/shared/postmigrate b/src/tm_mad/shared/postmigrate new file mode 120000 index 0000000000..ae93fad874 --- /dev/null +++ b/src/tm_mad/shared/postmigrate @@ -0,0 +1 @@ +../common/prepostmigrate \ No newline at end of file diff --git a/src/tm_mad/shared/premigrate b/src/tm_mad/shared/premigrate deleted file mode 100755 index df9ad4b168..0000000000 --- a/src/tm_mad/shared/premigrate +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -DRIVER_PATH=$(dirname $0) - -DISK_COUNT=$(onevm show $4 -x|grep DISK_ID| wc -l) -TMS=$(onevm show $4 -x|sed -rn 's/[[:space:]]*<\!\[CDATA\[([^]]*).*/\1/p') - -XPATH="${DRIVER_PATH}/../../datastore/xpath.rb -b $7" - -for i in `seq 1 $DISK_COUNT`; do - TM=`echo $TMS|cut -d" " -f$i` - DISK_ID=$(($i-1)) - DEV=`ssh $1 "readlink $3/disk.$DISK_ID"` - ${DRIVER_PATH}/../$TMS/premigrate "$1" "$2" "$DEV" -done - -exit 0 diff --git a/src/tm_mad/shared/premigrate b/src/tm_mad/shared/premigrate new file mode 120000 index 0000000000..ae93fad874 --- /dev/null +++ b/src/tm_mad/shared/premigrate @@ -0,0 +1 @@ +../common/prepostmigrate \ No newline at end of file diff --git a/src/tm_mad/ssh/postmigrate b/src/tm_mad/ssh/postmigrate index d580dd8260..ae93fad874 120000 --- a/src/tm_mad/ssh/postmigrate +++ b/src/tm_mad/ssh/postmigrate @@ -1 +1 @@ -../common/postmigrate \ No newline at end of file +../common/prepostmigrate \ No newline at end of file diff --git a/src/tm_mad/ssh/premigrate b/src/tm_mad/ssh/premigrate index 0e108a8a26..ae93fad874 120000 --- a/src/tm_mad/ssh/premigrate +++ b/src/tm_mad/ssh/premigrate @@ -1 +1 @@ -../common/premigrate \ No newline at end of file +../common/prepostmigrate \ No newline at end of file diff --git a/src/tm_mad/tm_common.sh b/src/tm_mad/tm_common.sh index 4a73a2e731..2adb33d0c7 100644 --- a/src/tm_mad/tm_common.sh +++ b/src/tm_mad/tm_common.sh @@ -112,3 +112,48 @@ function lcm_state echo $LCM_STATE } + +function migrate_other +{ + DRIVER_PATH=$(dirname $0) + MAD=${DRIVER_PATH##*/} + + XPATH="$DRIVER_PATH/../../datastore/xpath.rb" + + unset i + while IFS= read -r -d '' element; do + XPATH_ELEMENTS[i++]="$element" + done< <("$XPATH" -b "$6" \ + /VM/TEMPLATE/CONTEXT/DISK_ID \ + %m%/VM/TEMPLATE/DISK/DISK_ID \ + %m%/VM/TEMPLATE/DISK/CLONE \ + %m%/VM/TEMPLATE/DISK/TM_MAD) + + unset i + CONTEXT_DISK_ID="${XPATH_ELEMENTS[i++]}" + DISK_IDS="${XPATH_ELEMENTS[i++]}" + CLONES="${XPATH_ELEMENTS[i++]}" + TM_MADS="${XPATH_ELEMENTS[i++]}" + DISK_ID_ARRAY=($DISK_IDS) + CLONE_ARRAY=($CLONES) + TM_MAD_ARRAY=($TM_MADS) + + if [ -n "$7" ]; then + return 0 + fi + + for i in ${!TM_MAD_ARRAY[@]}; do + TM="${TM_MAD_ARRAY[i]}" + + if [ "$TM" = "$MAD" ]; then + continue + fi + if [ "${PROCESSED/ $TM /}" = "$PROCESSED" ]; then + # call the other TM_MADs with same arguments + # but mark that it is not SYSTEM_DS + log "Call $TM/${0##*/}" + "${DRIVER_PATH}/../$TM/${0##*/}" "$@" "$MAD" + PROCESSED+=" $TM " + fi + done +}