tripleo-upgrade/templates/workload_launch.sh.j2
Jose Luis Franco Arza b717d4f089 Force OS_COMPUTE_API_VERSION to a lower one on workload test.
After the upgrade prepare and right before the upgrade run
command a workload test is executed, which creates an instance
and performs a pingtest during the whole upgrade procedure.
The generated rc file for the OC has the OS_COMPUTE_API_VERSION
pointing to 2.latest which provokes a conflict in this situation
as we have a OSP16 Undercloud and a OSP15 overcloud, failing with
the error: Version 2.79 is not supported by the API. Minimum is
Minimum is 2.1 and maximum is 2.72.

This patch forces the maximum version on the script launch to be
2.72 at max.

Change-Id: I8c949de2083fa6b251ad7c8c6a2e57d6b9c3465e
2020-01-10 18:01:32 +01:00

247 lines
7.8 KiB
Django/Jinja

#!/bin/bash
#
# Script that spawns an instance
# Has 2 operational modes:
# - workload: spawn VM with floating ip (default)
# - sanity: spanw VM with floating ip assert it's ssh'able,
# delete VM and associated resources
#
if [[ -n ${1} ]]; then
MODE="${1}"
else
MODE="workload"
fi
function sanity_teardown {
# remove auxiliary resources
local timeout_seconds=180
local elapsed_seconds=0
echo "Remove ${INSTANCE_FIP} from ${INSTANCE_NAME}"
openstack server remove floating ip ${INSTANCE_NAME} ${INSTANCE_FIP}
echo "Delete floating ip ${INSTANCE_FIP}"
openstack floating ip delete ${INSTANCE_FIP}
echo "Remove VM ${INSTANCE_NAME}"
openstack server delete ${INSTANCE_NAME}
while true; do
openstack server list -f value -c Name | grep -q ${INSTANCE_NAME}
if [[ ${?} -eq 1 ]]; then
echo "Instance ${INSTANCE_NAME} successfully removed"
break
fi
elapsed_seconds=$(( ${elapsed_seconds} + 5 ))
if [ $elapsed_seconds -ge $timeout_seconds ]; then
echo "FAILURE: Failed to remove instance ${INSTANCE_NAME}"
exit 1
fi
done
echo "Remove cinder volume ${CINDER_VOL_ID}"
openstack volume delete ${CINDER_VOL_ID}
echo "Clear default gateway from ${TENANT_NET_NAME}_router"
openstack router unset --external-gateway ${TENANT_NET_NAME}_router
echo "Remove subnet ${TENANT_NET_NAME}_subnet from router ${TENANT_NET_NAME}_router"
openstack router remove subnet ${TENANT_NET_NAME}_router ${TENANT_NET_NAME}_subnet
echo "Remove router ${TENANT_NET_NAME}_router"
openstack router delete ${TENANT_NET_NAME}_router
echo "Remove subnet ${TENANT_NET_NAME}_subnet"
openstack subnet delete ${TENANT_NET_NAME}_subnet
echo "Remove network ${TENANT_NET_NAME}"
openstack network delete ${TENANT_NET_NAME}
echo "Remove security group ${SECGROUP_NAME}"
openstack security group delete ${SECGROUP_NAME}
echo "Remove keypair ${KEYPAIR_NAME}"
openstack keypair delete ${KEYPAIR_NAME}
echo "Remove image ${IMAGE_NAME}"
openstack image delete ${IMAGE_NAME}
echo "Remove file ${IMAGE_FILE}"
rm -Rf $(dirname ${IMAGE_FILE})
}
SUFFIX=$(openssl rand -hex 5)
OVERCLOUD_RC='{{ overcloud_rc }}'
IMAGE_URL='{{ workload_image_url }}'
IMAGE_NAME="upgrade_workload_${SUFFIX}"
IMAGE_FILE="$(mktemp -d )/upgrade_workload_image.qcow2"
INSTANCE_NAME="instance_${SUFFIX}"
INSTANCE_USER='{{ workload_user }}'
KEYPAIR_NAME="userkey_${SUFFIX}"
FLAVOR_NAME="v1-1G-{{ workload_disk}}G-${SUFFIX}"
SECGROUP_NAME="allow-icmp-ssh-${SUFFIX}"
TENANT_NET_NAME="internal_net_${SUFFIX}"
EXTERNAL_NET_NAME='{{ external_network_name }}'
source ${OVERCLOUD_RC}
export OS_COMPUTE_API_VERSION=2.72
## create image
openstack image list | grep ${IMAGE_NAME}
if [ $? -ne 0 ]; then
echo "Downloading image ${IMAGE_URL}"
curl --silent --retry 3 -L -4 -o ${IMAGE_FILE} ${IMAGE_URL}
if [ $? -ne 0 ]; then
echo "Failed to download ${IMAGE_URL}"
exit 1
fi
echo "Uploading ${IMAGE_NAME} to Glance"
openstack image create \
--file ${IMAGE_FILE} \
--disk-format qcow2 \
--container-format bare \
${IMAGE_NAME}
fi
## create user key
openstack keypair list | grep ${KEYPAIR_NAME}
if [ $? -ne 0 ]; then
echo "Creating keypair ${KEYPAIR_NAME}"
openstack keypair create --public-key ~/.ssh/id_rsa.pub ${KEYPAIR_NAME}
fi
## create flavor
openstack flavor list | grep ${FLAVOR_NAME}
if [ $? -ne 0 ]; then
echo "Creating flavor ${FLAVOR_NAME}"
openstack flavor create --vcpus {{ workload_vcpu }} \
--ram {{ workload_memory }} \
--disk {{ workload_disk }} \
--swap {{ workload_swap }} \
$FLAVOR_NAME
fi
## create networking
openstack network list | grep ${TENANT_NET_NAME}
if [ $? -ne 0 ]; then
NAMESERVER=$(grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/resolv.conf | head -1)
echo "Creating router ${TENANT_NET_NAME}_router"
openstack router create ${TENANT_NET_NAME}_router
echo "Creating network ${TENANT_NET_NAME}"
openstack network create ${TENANT_NET_NAME}
echo "Creating subnet ${TENANT_NET_NAME}_subnet"
openstack subnet create \
--subnet-range 192.168.0.0/24 \
--allocation-pool start=192.168.0.10,end=192.168.0.100 \
--gateway 192.168.0.254 \
--dns-nameserver ${NAMESERVER} \
--network ${TENANT_NET_NAME} \
${TENANT_NET_NAME}_subnet
echo "Add subnet ${TENANT_NET_NAME}_subnet to router ${TENANT_NET_NAME}_router"
openstack router add subnet ${TENANT_NET_NAME}_router ${TENANT_NET_NAME}_subnet
echo "Set external-gateway for ${TENANT_NET_NAME}_router"
openstack router set --external-gateway ${EXTERNAL_NET_NAME} ${TENANT_NET_NAME}_router
fi
## create security group
openstack security group list | grep ${SECGROUP_NAME}
if [ $? -ne 0 ]; then
echo "Creating security group ${SECGROUP_NAME}"
openstack security group create ${SECGROUP_NAME}
echo "Creating rules for ports 22,80,443 in security group ${SECGROUP_NAME}"
openstack security group rule create --proto icmp ${SECGROUP_NAME}
openstack security group rule create --proto tcp --dst-port 22 ${SECGROUP_NAME}
openstack security group rule create --proto tcp --dst-port 80 ${SECGROUP_NAME}
openstack security group rule create --proto tcp --dst-port 443 ${SECGROUP_NAME}
fi
## create instance
TENANT_NET_ID=$( openstack network show -f json ${TENANT_NET_NAME} | jq -r -c '.id' )
echo "Creating overcloud instance ${INSTANCE_NAME}"
openstack server create \
--image ${IMAGE_NAME} \
--flavor ${FLAVOR_NAME} \
--security-group ${SECGROUP_NAME} \
--key-name ${KEYPAIR_NAME} \
--nic net-id=${TENANT_NET_ID} \
${INSTANCE_NAME}
timeout_seconds=120
elapsed_seconds=0
while true; do
INSTANCE_STATUS=$(openstack server show ${INSTANCE_NAME} -f json | jq -r '.status')
case "${INSTANCE_STATUS}" in
"ACTIVE")
echo "${INSTANCE_NAME} reached 'ACTIVE' status"
break
;;
"ERROR")
echo "${INSTANCE_NAME} failed"
exit 1
esac
sleep 3
elapsed_seconds=$(expr $elapsed_seconds + 3)
if [ $elapsed_seconds -ge $timeout_seconds ]; then
echo "FAILURE: Instance failed to boot within ${elapsed_seconds} seconds"
openstack server show ${INSTANCE_NAME} -f json 2>&1
exit 1
fi
done
## assign floating ip
INSTANCE_FIP=$(openstack floating ip create ${EXTERNAL_NET_NAME} -f json | jq -r -c '.floating_ip_address' )
echo "Assign FIP[${INSTANCE_FIP}] to server ${INSTANCE_NAME}"
openstack server add floating ip ${INSTANCE_NAME} ${INSTANCE_FIP}
## create and attach a volume
CINDER_VOL_ID=$(openstack volume create --size 1 vol_${SUFFIX} -f json | jq -r .id)
echo "Attach volume vol_${SUFFIX} to instance ${INSTANCE_NAME}"
openstack server add volume ${INSTANCE_NAME} ${CINDER_VOL_ID}
## SSH to VM through it's floating ip
if [[ "${MODE}" == "sanity" ]]; then
timeout_seconds=180
elapsed_seconds=0
while true; do
# assert instance is reachable via FIP
echo " [$(date)] Trying to ssh to ${INSTANCE_FIP}"
ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${INSTANCE_USER}@${INSTANCE_FIP} 'whoami'
if [[ ${?} -eq 0 ]]; then
echo "Instance ${INSTANCE_NAME} is reachable via ${INSTANCE_FIP}"
break
fi
sleep 3
elapsed_seconds=$(expr $elapsed_seconds + 3)
if [ $elapsed_seconds -ge $timeout_seconds ]; then
echo "FAILURE: Instance failed to boot."
sanity_teardown
exit 1
fi
done
fi
if [[ "${MODE}" == "workload" ]]; then
echo "floating-ip: ${INSTANCE_FIP}" > ~/${INSTANCE_NAME}
fi
if [[ "${MODE}" == "sanity" ]]; then
sanity_teardown
fi