Merge ~andersson123/autopkgtest-cloud:create-test-instances-refactor into autopkgtest-cloud:master

Proposed by Tim Andersson
Status: Merged
Approved by: Skia
Approved revision: 127f64493fbb07700940e60e5b32a58f69ec13b1
Merged at revision: 70e4e3be396e93692f8792a085158c0007b28806
Proposed branch: ~andersson123/autopkgtest-cloud:create-test-instances-refactor
Merge into: autopkgtest-cloud:master
Diff against target: 212 lines (+184/-10)
2 files modified
charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-instances-common.sh (+155/-0)
charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances (+29/-10)
Reviewer Review Type Date Requested Status
Skia Approve
Review via email: mp+461125@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Tim Andersson (andersson123) wrote :

needs testing and the commit messages need more detail :)

Revision history for this message
Tim Andersson (andersson123) wrote :

amended and ready for review :)

Revision history for this message
Skia (hyask) wrote :

That looks absolutely great! Added a small comment if you have time, but otherwise, feel free to merge this :-)

review: Approve
Revision history for this message
Tim Andersson (andersson123) wrote :

perfectly valid comment, will do :)

Revision history for this message
Tim Andersson (andersson123) wrote :

I'm going to merge once CI passes.

Revision history for this message
Skia (hyask) :
review: Approve
Revision history for this message
Tim Andersson (andersson123) wrote :

woops looks like I forgot about this as per usual, merging now

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --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
2new file mode 100644
3index 0000000..0eed9fa
4--- /dev/null
5+++ b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-instances-common.sh
6@@ -0,0 +1,155 @@
7+#!/bin/bash
8+# shellcheck disable=SC2154
9+
10+# Common functions shared by scripts in this directory which create openstack instances
11+
12+make_and_load_key(){
13+ # $1 rc file
14+ # $2 name prefix
15+ key_id="${2}-key"
16+ if openstack keypair show "${key_id}" &>/dev/null; then
17+ openstack keypair delete "${key_id}" &> /dev/null
18+ fi
19+ if ! openstack keypair create --public-key ~/.ssh/id_rsa.pub "${key_id}" &> /dev/null; then
20+ printf "keypair creation failed for %s, skipping" "${1}"
21+ exit 1
22+ fi
23+ # Not changing as it'll show but not be loaded I think - needs testing
24+ while ! openstack keypair list | grep "${key_id}" &>/dev/null; do
25+ ctr=$((ctr+1))
26+ if [ $ctr -gt 9 ]; then
27+ printf "key not loading for %s, exiting" "${1}"
28+ exit 1
29+ fi
30+ done
31+ printf "%s" "${key_id}"
32+}
33+
34+get_arch(){
35+ # $1 rc file
36+ arch=$(echo "${1}" | awk -F[-.] '{print $2}')
37+ if [ -z "$arch" ]; then
38+ arch="arm64"
39+ elif [[ "${arch}" == *"rc"* ]]; then
40+ arch="arm64"
41+ fi
42+ if [[ "${OS_REGION_NAME}" == "prodstack5" ]]; then
43+ arch="amd64"
44+ elif [[ "${OS_REGION_NAME}" == "scalingstack-lgw01" ]]; then
45+ arch="amd64"
46+ fi
47+ printf "%s" "${arch}"
48+}
49+
50+get_image(){
51+ # $1 release
52+ # $2 arch
53+ image=$(openstack image list | grep "${1}" | grep "${2}" | grep adt | cut -d' ' -f2)
54+ printf "%s" "${image}"
55+}
56+
57+get_net(){
58+ # $1 network name
59+ vals=$(openstack network show "${1}" --format=shell)
60+ eval "${vals}"
61+ printf "%s" "${id}"
62+}
63+
64+get_netid(){
65+ net=""
66+ if [[ "${OS_USERNAME}" == *"stg"* ]]; then
67+ if openstack network show net_stg-proposed-migration-environment &> /dev/null; then
68+ net=$(get_net net_stg-proposed-migration-environment)
69+ elif openstack network show net_prod-proposed-migration-environment &> /dev/null; then
70+ net=$(get_net net_prod-proposed-migration-environment)
71+ else
72+ echo "Network finding failure, skipping ${FILE}..."
73+ exit 1
74+ fi
75+ elif [[ "${OS_USERNAME}" == *"prod"* ]]; then
76+ net=$(get_net net_prod-proposed-migration)
77+ fi
78+ printf "%s" "${net}"
79+}
80+
81+wait_for_server_to_build(){
82+ # $1 server name
83+ # $2 key
84+ while :; do
85+ vals=$(openstack server show "${1}" --format shell)
86+ eval "${vals}"
87+ if [[ "${status}" == "ACTIVE" ]]; then
88+ break
89+ elif [[ "${status}" == "ERROR" ]]; then
90+ openstack keypair delete "${2}"
91+ echo "Server building failed, see below..."
92+ openstack server show "${1}"
93+ exit 1
94+ fi
95+ done
96+}
97+
98+wait_for_server_connectivity(){
99+ # $1 server_name
100+ ip_address=$(openstack server show "${1}" --column addresses --format value | cut -d'=' -f2)
101+ sleep 10
102+ while ! ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ubuntu@"${ip_address}" : &>/dev/null; do
103+ # echo "waiting for server to have connectivity..."
104+ sleep 3
105+ done
106+ printf "%s" "${ip_address}"
107+}
108+
109+create_server_and_wait_for_connectivity(){
110+ # $1 release
111+ # $2 name_prefix
112+ # $3 rc file
113+ # $4 arch (default is amd64 unless specified in rc file or by CLA)
114+ # shellcheck disable=SC1090
115+ if ! source "${3}"; then
116+ printf "Sourcing file: %s failed, exiting...\n" "${3}"
117+ exit 1
118+ fi
119+
120+ key=$(make_and_load_key "${3}" "${2}")
121+ server_name="${2}"
122+ if openstack server show "${server_name}" &> /dev/null; then
123+ openstack server delete "${server_name}" &> /dev/null
124+ fi
125+ arch=$(get_arch "${3}")
126+ if [ $# -gt 3 ]; then
127+ arch="${4}"
128+ fi
129+ img=$(get_image "${1}" "${arch}")
130+ flavor="autopkgtest"
131+ netid=$(get_netid)
132+ openstack server create --key-name "${key}" --image "${img}" --flavor "${flavor}" --nic net-id="${netid}" -- "${server_name}" &> /dev/null
133+ wait_for_server_to_build "${server_name}" "${key}"
134+ ip=$(wait_for_server_connectivity "${server_name}")
135+ printf "%s|%s|%s" "${server_name}" "${key}" "${ip}"
136+}
137+
138+show_server_details(){
139+ # $1 server details
140+ name=$(printf "%s" "${1}" | cut -d'|' -f1)
141+ key=$(printf "%s" "${1}" | cut -d'|' -f2)
142+ ip=$(printf "%s" "${1}" | cut -d'|' -f3)
143+ printf "%s\n%s\n%s\n" "${name}" "${key}" "${ip}"
144+}
145+
146+get_server_ip(){
147+ # $1 server details
148+ printf "%s" "${1}" | cut -d'|' -f3
149+}
150+
151+kill_server(){
152+ # $1 server details
153+ # $2 file
154+ # shellcheck disable=SC1090
155+ source "${2}"
156+ printf "Killing server: \n%s" "$(show_server_details "${1}")"
157+ server_name=$(printf "%s" "${1}" | cut -d'|' -f1)
158+ key=$(printf "%s" "${1}" | cut -d'|' -f2)
159+ openstack server delete "${server_name}"
160+ openstack keypair delete "${key}"
161+}
162diff --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
163index 674dde3..0936bc0 100755
164--- a/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances
165+++ b/charms/focal/autopkgtest-cloud-worker/autopkgtest-cloud/tools/create-test-instances
166@@ -1,17 +1,36 @@
167-#!/bin/sh
168+#!/bin/bash
169 #
170 # Used to spin up multiple instances in a region to test instance creation
171 # Should be followed by a connectivity (ssh) test
172+set -e
173+
174+ARCH=""
175+RC_FILE=""
176+
177+while getopts 'a:f:' option; do
178+ case "$option" in
179+ a)
180+ ARCH="$OPTARG"
181+ ;;
182+ f)
183+ RC_FILE="$OPTARG"
184+ ;;
185+ *)
186+ printf "Invalid use of script! Please use like this: ./create-test-instances -a ARCH -f /path/to/rc/file\n"
187+ exit 1
188+ ;;
189+ esac
190+done
191
192-# Architecture to test
193-ARCH=$1
194-# Development release
195 DEVEL=$(distro-info --devel)
196-# IMAGE is the latest adt image for that arch and region
197-IMAGE=$(openstack image list --format csv -c Name --quote none | grep "adt/ubuntu-$DEVEL-$ARCH")
198-# NET_ID is the prop-proposed-migration network from `openstack network list`
199-NET_ID=$(openstack network list --format csv -c Name --quote none | grep proposed-migration)
200+SERVERNAME="creation-test"
201+
202+# shellcheck disable=SC1091
203+source ./create-instances-common.sh
204
205-for i in $(seq 1 2); do
206- openstack server create --image "${IMAGE}" --flavor autopkgtest --nic net-id="${NET_ID}" -- "creation-test-$ARCH-$i"
207+for i in $(seq 1 10); do
208+ printf "creating server %s\n" "${SERVERNAME}-${i}"
209+ server_details=$(create_server_and_wait_for_connectivity "${DEVEL}" "${SERVERNAME}-${i}" "${RC_FILE}" "${ARCH}")
210+ show_server_details "${server_details}"
211+ kill_server "${server_details}" "${RC_FILE}"
212 done

Subscribers

People subscribed via source and target branches