#!/bin/bash # os-migrate-instance.sh, ABr, 20141010 # Migrate instance to another host # Provide usage function usage { echo "Usage: $0 [VM_ID|VM_NAME] [VM_TENANT]" exit 1 } function do_exit { rm -f $l_tmp exit $1 } # work file l_tmp="/tmp/os-migrate-instance.$$" # check for usage [[ $# -eq 0 ]] && usage l_in_vm_id_name="$1" l_in_vm_tenant="$2" # get the ID l_rc=0 if [ "$l_in_vm_tenant" = "" ]; then nova show "$l_in_vm_id_name" 2>/dev/null > $l_tmp l_rc=$? else nova --os-tenant-name="$l_in_vm_tenant" show "$l_in_vm_id_name" 2>/dev/null > $l_tmp l_rc=$? fi if [ $l_rc -ne 0 ]; then echo -n "Invalid VM ID or name '" [[ "$l_in_vm_tenant" != "" ]] && echo -n "$l_in_vm_tenant" echo "$l_in_vm_id_name'" do_exit 1 fi #set -x l_vm_id=$(cat $l_tmp | grep -e "^| id" | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') # get initial state of VM l_vm_name=$(cat $l_tmp | grep -e "^| name" | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') l_vm_tenant_id=$(cat $l_tmp | grep -e "^| tenant_id" | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') l_vm_state=$(cat $l_tmp | grep -e "^| OS-EXT-STS:vm_state" | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') l_vm_status=`cat "$l_tmp" | grep status | awk '{print $4}'` l_vm_tenant=$(keystone tenant-get $l_vm_tenant_id | grep -e ' name ' | cut -d'|' -f 3 | sed -e 's#^ \+##; s#[ \t]*$##') set +x # determine what we can do l_state=0 case "$l_vm_status" in SHUTOFF) # we can migrate l_state=0 ;; VERIFY_RESIZE) # we can verify l_state=2 ;; RESIZE) # we can wait l_state=1 ;; *) # invalid state l_rc=2 ;; esac if [ $l_rc -ne 0 ]; then echo "$l_vm_tenant:$l_vm_name ($l_vm_id); invalid status ($l_vm_status); cannot migrate" do_exit $l_rc fi # Migrate the VM to an alternate hypervisor l_time=$(date +"%Y%d%m-%H:%M") echo -n "$l_time: Migrate $l_vm_tenant:$l_vm_name ($l_vm_id): " l_ok=1 if [ $l_state -eq 0 ]; then l_ok=0 nova migrate $l_vm_id && l_ok=1 fi l_ctr=0 if [ $l_ok -eq 1 ]; then nova show $l_vm_id > $l_tmp l_vm_status=`cat "$l_tmp" | grep status | awk '{print $4}'` while [ "$l_vm_status" = "RESIZE" ]; do l_ctr=$(( $l_ctr + 1 )) l_modulo=$(( $l_ctr % 4 )) [ $l_modulo -eq 0 ] && echo -n '|' [ $l_modulo -eq 1 ] && echo -n '/' [ $l_modulo -eq 2 ] && echo -n '-' [ $l_modulo -eq 3 ] && echo -n "\\" sleep 3 if nova show $l_vm_id > $l_tmp; then l_vm_status=`cat "$l_tmp" | grep status | awk '{print $4}'` echo -e -n '\b' else l_vm_status='foo' fi done # check result if [[ "$l_vm_status" != "VERIFY_RESIZE" ]]; then echo "FAIL! ($l_vm_status)" else if nova resize-confirm $l_vm_id; then sleep 5 echo "OK." fi fi fi l_time=$(date +"%Y%d%m-%H:%M") echo "$l_time: VM status:" nova show $l_vm_id do_exit 0