canonical-ubuntu-qa team mailing list archive
-
canonical-ubuntu-qa team
-
Mailing list archive
-
Message #03091
[Merge] ~andersson123/autopkgtest-cloud:create-test-instances-refactor into autopkgtest-cloud:master
Tim Andersson has proposed merging ~andersson123/autopkgtest-cloud:create-test-instances-refactor into autopkgtest-cloud:master.
Requested reviews:
Canonical's Ubuntu QA (canonical-ubuntu-qa)
For more details, see:
https://code.launchpad.net/~andersson123/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/461125
--
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~andersson123/autopkgtest-cloud:create-test-instances-refactor into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-instances-common.sh b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-instances-common.sh
new file mode 100644
index 0000000..0eed9fa
--- /dev/null
+++ b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-instances-common.sh
@@ -0,0 +1,155 @@
+#!/bin/bash
+# shellcheck disable=SC2154
+
+# Common functions shared by scripts in this directory which create openstack instances
+
+make_and_load_key(){
+ # $1 rc file
+ # $2 name prefix
+ key_id="${2}-key"
+ if openstack keypair show "${key_id}" &>/dev/null; then
+ openstack keypair delete "${key_id}" &> /dev/null
+ fi
+ if ! openstack keypair create --public-key ~/.ssh/id_rsa.pub "${key_id}" &> /dev/null; then
+ printf "keypair creation failed for %s, skipping" "${1}"
+ exit 1
+ fi
+ # Not changing as it'll show but not be loaded I think - needs testing
+ while ! openstack keypair list | grep "${key_id}" &>/dev/null; do
+ ctr=$((ctr+1))
+ if [ $ctr -gt 9 ]; then
+ printf "key not loading for %s, exiting" "${1}"
+ exit 1
+ fi
+ done
+ printf "%s" "${key_id}"
+}
+
+get_arch(){
+ # $1 rc file
+ arch=$(echo "${1}" | awk -F[-.] '{print $2}')
+ if [ -z "$arch" ]; then
+ arch="arm64"
+ elif [[ "${arch}" == *"rc"* ]]; then
+ arch="arm64"
+ fi
+ if [[ "${OS_REGION_NAME}" == "prodstack5" ]]; then
+ arch="amd64"
+ elif [[ "${OS_REGION_NAME}" == "scalingstack-lgw01" ]]; then
+ arch="amd64"
+ fi
+ printf "%s" "${arch}"
+}
+
+get_image(){
+ # $1 release
+ # $2 arch
+ image=$(openstack image list | grep "${1}" | grep "${2}" | grep adt | cut -d' ' -f2)
+ printf "%s" "${image}"
+}
+
+get_net(){
+ # $1 network name
+ vals=$(openstack network show "${1}" --format=shell)
+ eval "${vals}"
+ printf "%s" "${id}"
+}
+
+get_netid(){
+ net=""
+ if [[ "${OS_USERNAME}" == *"stg"* ]]; then
+ if openstack network show net_stg-proposed-migration-environment &> /dev/null; then
+ net=$(get_net net_stg-proposed-migration-environment)
+ elif openstack network show net_prod-proposed-migration-environment &> /dev/null; then
+ net=$(get_net net_prod-proposed-migration-environment)
+ else
+ echo "Network finding failure, skipping ${FILE}..."
+ exit 1
+ fi
+ elif [[ "${OS_USERNAME}" == *"prod"* ]]; then
+ net=$(get_net net_prod-proposed-migration)
+ fi
+ printf "%s" "${net}"
+}
+
+wait_for_server_to_build(){
+ # $1 server name
+ # $2 key
+ while :; do
+ vals=$(openstack server show "${1}" --format shell)
+ eval "${vals}"
+ if [[ "${status}" == "ACTIVE" ]]; then
+ break
+ elif [[ "${status}" == "ERROR" ]]; then
+ openstack keypair delete "${2}"
+ echo "Server building failed, see below..."
+ openstack server show "${1}"
+ exit 1
+ fi
+ done
+}
+
+wait_for_server_connectivity(){
+ # $1 server_name
+ ip_address=$(openstack server show "${1}" --column addresses --format value | cut -d'=' -f2)
+ sleep 10
+ while ! ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ubuntu@"${ip_address}" : &>/dev/null; do
+ # echo "waiting for server to have connectivity..."
+ sleep 3
+ done
+ printf "%s" "${ip_address}"
+}
+
+create_server_and_wait_for_connectivity(){
+ # $1 release
+ # $2 name_prefix
+ # $3 rc file
+ # $4 arch (default is amd64 unless specified in rc file or by CLA)
+ # shellcheck disable=SC1090
+ if ! source "${3}"; then
+ printf "Sourcing file: %s failed, exiting...\n" "${3}"
+ exit 1
+ fi
+
+ key=$(make_and_load_key "${3}" "${2}")
+ server_name="${2}"
+ if openstack server show "${server_name}" &> /dev/null; then
+ openstack server delete "${server_name}" &> /dev/null
+ fi
+ arch=$(get_arch "${3}")
+ if [ $# -gt 3 ]; then
+ arch="${4}"
+ fi
+ img=$(get_image "${1}" "${arch}")
+ flavor="autopkgtest"
+ netid=$(get_netid)
+ openstack server create --key-name "${key}" --image "${img}" --flavor "${flavor}" --nic net-id="${netid}" -- "${server_name}" &> /dev/null
+ wait_for_server_to_build "${server_name}" "${key}"
+ ip=$(wait_for_server_connectivity "${server_name}")
+ printf "%s|%s|%s" "${server_name}" "${key}" "${ip}"
+}
+
+show_server_details(){
+ # $1 server details
+ name=$(printf "%s" "${1}" | cut -d'|' -f1)
+ key=$(printf "%s" "${1}" | cut -d'|' -f2)
+ ip=$(printf "%s" "${1}" | cut -d'|' -f3)
+ printf "%s\n%s\n%s\n" "${name}" "${key}" "${ip}"
+}
+
+get_server_ip(){
+ # $1 server details
+ printf "%s" "${1}" | cut -d'|' -f3
+}
+
+kill_server(){
+ # $1 server details
+ # $2 file
+ # shellcheck disable=SC1090
+ source "${2}"
+ printf "Killing server: \n%s" "$(show_server_details "${1}")"
+ server_name=$(printf "%s" "${1}" | cut -d'|' -f1)
+ key=$(printf "%s" "${1}" | cut -d'|' -f2)
+ openstack server delete "${server_name}"
+ openstack keypair delete "${key}"
+}
diff --git a/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances
index 674dde3..42b57e1 100755
--- a/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances
+++ b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances
@@ -1,17 +1,22 @@
-#!/bin/sh
+#!/bin/bash
#
# Used to spin up multiple instances in a region to test instance creation
# Should be followed by a connectivity (ssh) test
+set -e
# Architecture to test
ARCH=$1
# Development release
+RC_FILE=$2
DEVEL=$(distro-info --devel)
-# IMAGE is the latest adt image for that arch and region
-IMAGE=$(openstack image list --format csv -c Name --quote none | grep "adt/ubuntu-$DEVEL-$ARCH")
-# NET_ID is the prop-proposed-migration network from `openstack network list`
-NET_ID=$(openstack network list --format csv -c Name --quote none | grep proposed-migration)
+SERVERNAME="creation-test"
-for i in $(seq 1 2); do
- openstack server create --image "${IMAGE}" --flavor autopkgtest --nic net-id="${NET_ID}" -- "creation-test-$ARCH-$i"
+# shellcheck disable=SC1091
+source ./create-instances-common.sh
+
+for i in $(seq 1 10); do
+ printf "creating server %s\n" "${SERVERNAME}-${i}"
+ server_details=$(create_server_and_wait_for_connectivity "${DEVEL}" "${SERVERNAME}-${i}" "${RC_FILE}" "${ARCH}")
+ show_server_details "${server_details}"
+ kill_server "${server_details}" "${RC_FILE}"
done
References