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 7fc68c42b3..2db7597058 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 aab6b2e1c0..35562d55fb 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 index d580dd8260..ae93fad874 120000 --- a/src/tm_mad/shared/postmigrate +++ b/src/tm_mad/shared/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/shared/premigrate b/src/tm_mad/shared/premigrate index 0e108a8a26..ae93fad874 120000 --- a/src/tm_mad/shared/premigrate +++ b/src/tm_mad/shared/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/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 +}