← Back to team overview

canonical-ubuntu-qa team mailing list archive

[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