#!/bin/bash # # Copyright (c) 2016 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # export TMOUT=0 . /etc/nova/openrc TEST_SCRIPT_TAG=${TEST_SCRIPT_TAG:-"TEST_SCRIPT"} UUID_FORMAT=^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ NOVA_LIST_UUID=1 NOVA_LIST_HOST=2 NOVA_LIST_NAME=3 VM_UUID=1 VM_HOST=2 VM_NAME=3 VM_STATE=4 VM_TASK_STATE=5 VM_POWER_STATE=6 ################################################################################ # Get raw results of nova list ################################################################################ function get_nova_list { NOVA_LIST_RESULT="$(nova list --all-tenants --field OS-EXT-SRV-ATTR:host,name,status,task_state,power_state 2>&1)" RET=$? if [ ${RET} -ne 0 ] then echo "Failed to get nova list, error=${RET}" NOVA_LIST_RESULT="" fi } ################################################################################ ################################################################################ # Get random VM ################################################################################ function get_random_vm { declare -a VM_LIST declare VM_COUNT=0 get_nova_list while read -r line do IFS='| ' read -a vm <<< "${line}" if [[ ${vm[${NOVA_LIST_UUID}]} =~ ${UUID_FORMAT} ]] then VM_LIST[${VM_COUNT}]="${line}" ((VM_COUNT++)) fi done <<< "${NOVA_LIST_RESULT}" if [ ${VM_COUNT} -ne 0 ] then VM_INDEX=$((RANDOM % ${VM_COUNT})) VM=${VM_LIST[${VM_INDEX}]} else VM="" fi # echo "${#VM_LIST[*]}" } ################################################################################ ################################################################################ # Get VM by name ################################################################################ function get_vm_by_name { vm_name=${1} VM="" get_nova_list while read -r line do IFS='| ' read -a vm <<< "${line}" if [[ ${vm[${NOVA_LIST_UUID}]} =~ ${UUID_FORMAT} ]] then if [ ${vm[${NOVA_LIST_NAME}]} == "${vm_name}" ] then VM="${line}" break fi fi done <<< "${NOVA_LIST_RESULT}" } ################################################################################ ################################################################################ # Wait for VM paused ################################################################################ function wait_for_vm_paused { vm_name=${1} while [ True ] do get_vm_by_name ${vm_name} if [ -z "${VM}" ] then echo "Failed to get instance ${vm_name}" continue fi IFS='| ' read -a vm <<< "${VM}" if [ "PAUSED" == "${vm[${VM_STATE}]}" ] then if [ "None" == "${vm[${VM_TASK_STATE}]}" ] then if [ "Paused" == "${vm[${VM_POWER_STATE}]}" ] then break fi fi fi sleep 5 done } ################################################################################ ################################################################################ # Wait for VM suspended ################################################################################ function wait_for_vm_suspended { vm_name=${1} while [ True ] do get_vm_by_name ${vm_name} if [ -z "${VM}" ] then echo "Failed to get instance ${vm_name}" continue fi IFS='| ' read -a vm <<< "${VM}" if [ "SUSPENDED" == "${vm[${VM_STATE}]}" ] then if [ "None" == "${vm[${VM_TASK_STATE}]}" ] then if [ "Shutdown" == "${vm[${VM_POWER_STATE}]}" ] then break fi fi fi sleep 5 done } ################################################################################ ################################################################################ # Wait for VM shutdown ################################################################################ function wait_for_vm_shutdown { vm_name=${1} while [ True ] do get_vm_by_name ${vm_name} if [ -z "${VM}" ] then echo "Failed to get instance ${vm_name}" continue fi IFS='| ' read -a vm <<< "${VM}" if [ "SHUTOFF" == "${vm[${VM_STATE}]}" ] then if [ "None" == "${vm[${VM_TASK_STATE}]}" ] then if [ "Shutdown" == "${vm[${VM_POWER_STATE}]}" ] then break fi fi fi sleep 5 done } ################################################################################ ################################################################################ # Wait for VM recovery ################################################################################ function wait_for_vm_recovery { vm_name=${1} while [ True ] do get_vm_by_name ${vm_name} if [ -z "${VM}" ] then echo "Failed to get instance ${vm_name}" continue fi IFS='| ' read -a vm <<< "${VM}" if [ "ACTIVE" == "${vm[${VM_STATE}]}" ] then if [ "None" == "${vm[${VM_TASK_STATE}]}" ] then if [ "Running" == "${vm[${VM_POWER_STATE}]}" ] then break fi fi fi sleep 5 done } ################################################################################ ################################################################################ # Main Entry ################################################################################ STATIC_CMD_INDEX=999 options=':c:' while getopts $options option do case ${option} in c) STATIC_CMD_INDEX=$OPTARG;; esac done CMD_COUNT=0 while [ True ] do TODAY=$(date) ((CMD_COUNT++)) if [ ${STATIC_CMD_INDEX} -ne 999 ] then CMD_INDEX=${STATIC_CMD_INDEX} else CMD_INDEX=$((1 + RANDOM % 8)) fi if [ ${CMD_INDEX} -lt 7 ] then get_random_vm if [ -z "${VM}" ] then echo "Failed to get an instance" continue fi IFS='| ' read -a vm <<< "${VM}" fi case ${CMD_INDEX} in 1) echo "${TODAY}: ${CMD_COUNT}. Reboot (hard) ${vm[${VM_NAME}]}" nova reboot --hard "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_recovery "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Reboot (hard) ${vm_name} complete" ;; 2) echo "${TODAY}: ${CMD_COUNT}. Reboot (soft) ${vm[${VM_NAME}]}" nova reboot "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_recovery "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Reboot (soft) ${vm_name} complete" ;; 3) echo "${TODAY}: ${CMD_COUNT}. Live-Migrate ${vm[${VM_NAME}]}" nova live-migration "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_recovery "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Live-Migrate ${vm_name} complete" ;; 4) echo "${TODAY}: ${CMD_COUNT}. Stop ${vm[${VM_NAME}]}" nova stop "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_shutdown "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Stop ${vm_name} complete" sleep 5 echo "${TODAY}: ${CMD_COUNT}. Start ${vm[${VM_NAME}]}" nova start "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_recovery "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Start ${vm_name} complete" ;; 5) echo "${TODAY}: ${CMD_COUNT}. Pause ${vm[${VM_NAME}]}" nova pause "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_paused "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Pause ${vm_name} complete" sleep 5 echo "${TODAY}: ${CMD_COUNT}. Unpause ${vm[${VM_NAME}]}" nova unpause "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_recovery "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Unpause ${vm_name} complete" ;; 6) echo "${TODAY}: ${CMD_COUNT}. Suspend ${vm[${VM_NAME}]}" nova suspend "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_suspended "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Suspend ${vm_name} complete" sleep 5 echo "${TODAY}: ${CMD_COUNT}. Resume ${vm[${VM_NAME}]}" nova resume "${vm[${VM_NAME}]}" 2>&1 >/dev/null sleep 10 wait_for_vm_recovery "${vm[${VM_NAME}]}" echo "${TODAY}: ${CMD_COUNT}. Resume ${vm_name} complete" ;; 7) echo "${TODAY}: ${CMD_COUNT}. Add Hosts (compute40, compute41, compute42, compute43, compute44, compute45, compute46)" system host-add --hostname compute40 --personality worker --mgmt_mac 5a:ec:8b:20:02:65 --bm_mac 58:20:B2:0A:6A:72 --bm_ip 10.32.254.71 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null system host-add --hostname compute41 --personality worker --mgmt_mac 5a:ec:8b:20:02:66 --bm_mac 58:20:B2:0A:6A:73 --bm_ip 10.32.254.72 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null system host-add --hostname compute42 --personality worker --mgmt_mac 5a:ec:8b:20:02:69 --bm_mac 58:20:b2:0b:73:30 --bm_ip 10.32.254.73 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null system host-add --hostname compute43 --personality worker --mgmt_mac 5a:ec:8b:20:02:70 --bm_mac 58:20:b2:0b:73:31 --bm_ip 10.32.254.74 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null system host-add --hostname compute44 --personality worker --mgmt_mac 5a:ec:8b:20:02:6d --bm_mac 58:20:b2:0b:9a:6a --bm_ip 10.32.254.75 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null system host-add --hostname compute45 --personality worker --mgmt_mac 5a:ec:8b:20:02:6f --bm_mac 58:20:B2:0B:DA:06 --bm_ip 10.32.254.76 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null system host-add --hostname compute46 --personality worker --mgmt_mac 5a:ec:8b:20:02:71 --bm_mac 58:20:B2:0A:68:38 --bm_ip 10.32.254.77 --bm_type ilo4 --bm_username hpadmin --bm_password HPinvent2016 2>&1 >/dev/null echo "${TODAY}: ${CMD_COUNT}. Added Hosts (compute40, compute41, compute42, compute43, compute44, compute45, compute46)" sleep 30 echo "${TODAY}: ${CMD_COUNT}. Delete Hosts (compute40, compute41, compute42, compute43, compute44, compute45, compute46)" system host-delete compute40 2>&1 >/dev/null system host-delete compute41 2>&1 >/dev/null system host-delete compute42 2>&1 >/dev/null system host-delete compute43 2>&1 >/dev/null system host-delete compute44 2>&1 >/dev/null system host-delete compute45 2>&1 >/dev/null system host-delete compute46 2>&1 >/dev/null echo "${TODAY}: ${CMD_COUNT}. Deleted Hosts (compute40, compute41, compute42, compute43, compute44, compute45, compute46)" ;; 8) vm_array=( "my-vm-1" "my-vm-2" "my-vm-3" "my-vm-4" "my-vm-5" "my-vm-6" ) for vm_name in "${vm_array[@]}" do get_vm_by_name "${vm_name}" if [ -z "${VM}" ] then echo "${TODAY}: ${CMD_COUNT}. Add VM ${vm_name}" nova boot --image cirros --flavor tiny --nic net-id=aa83f540-d222-4957-aadf-a5e788f9b8f1 ${vm_name} 2>&1 >/dev/null echo "${TODAY}: ${CMD_COUNT}. Added VM ${vm_name}" else echo "${TODAY}: ${CMD_COUNT}. Delete VM ${vm_name}" nova delete ${vm_name} 2>&1 >/dev/null echo "${TODAY}: ${CMD_COUNT}. Deleted VM ${vm_name}" fi done sleep 30 ;; *) ;; esac done ################################################################################