From 2f92996e0b54ed4528bfc1e6c8fe87a57ad64674 Mon Sep 17 00:00:00 2001 From: Edward Hope-Morley Date: Wed, 28 Aug 2024 16:49:04 +0100 Subject: [PATCH] Add openstack charm func test runner Also includes tool to identify func test targets from the charm. --- .../charmed_openstack_functest_runner.sh | 79 +++++++++++++++++++ openstack/tools/identify_charm_func_tests.py | 20 +++++ 2 files changed, 99 insertions(+) create mode 100755 openstack/tools/charmed_openstack_functest_runner.sh create mode 100644 openstack/tools/identify_charm_func_tests.py diff --git a/openstack/tools/charmed_openstack_functest_runner.sh b/openstack/tools/charmed_openstack_functest_runner.sh new file mode 100755 index 00000000..7bfd4df5 --- /dev/null +++ b/openstack/tools/charmed_openstack_functest_runner.sh @@ -0,0 +1,79 @@ +#!/bin/bash -eux +SKIP_BUILD=false + +while (($# > 0)) +do + case "$1" in + --skip-build) + SKIP_BUILD=true + ;; + *) + echo "ERROR: invalid input '$1'" + exit 1 + ;; + esac + shift +done + + +source ~/novarc +CIDR=`openstack subnet show subnet_${OS_USERNAME}-psd-extra -c cidr -f value` +FIP_MAX=$(ipcalc $CIDR| awk '$1=="HostMax:" {print $2}') +FIP_MIN=$(ipcalc $CIDR| awk '$1=="HostMin:" {print $2}') +FIP_MIN_ABC=${FIP_MIN%.*} +FIP_MIN_D=${FIP_MIN##*.} +FIP_MIN=${FIP_MIN_ABC}.$(($FIP_MIN_D + 64)) + +# More information on confog https://github.com/openstack-charmers/zaza/blob/master/doc/source/runningcharmtests.rst +export TEST_HTTP_PROXY=http://squid.internal:3128 +export TEST_FIP_RANGE=FIP_MIN:FIP_MAX +export TEST_CIDR_EXT=CIDR +export TEST_GATEWAY=$(openstack subnet show subnet_${OS_USERNAME}-psd-extra -c gateway_ip -f value) +export TEST_NAME_SERVER=91.189.91.131 +export TEST_CIDR_PRIV=192.168.21.0/24 +export TEST_SWIFT_IP=10.140.56.22 +export TEST_MODEL_SETTINGS="image-stream=released;default-series=jammy;test-mode=true;transmit-vendor-metrics=false" +export TEST_CONSTRAINTS_FILE=https://raw.githubusercontent.com/openstack-charmers/zaza/master/constraints-juju34.txt +# We need to set TEST_JUJU3 as well as the constraints file +# Ref: https://github.com/openstack-charmers/zaza/blob/e96ab098f00951079fccb34bc38d4ae6ebb38606/setup.py#L47 +export TEST_JUJU3=1 +export NET_ID=$(openstack network show net_${OS_USERNAME}-psd -f value -c id) + +## Build Charm +# Note: If you have a reactive charm, some paths may be prefixed by src/, like +# src/.tox or src/tests +# +# 1. Check charmcraft channel required in zosci.yaml and refresh it to the +# matching version. The version will differ based on stable branch version, +# e.g. yoga is often 1.5, zed is often 2.0, master 2.x.. some noble-caracal +# ones may be on 3.x + +sudo snap refresh charmcraft --channel 2.x/stable + +# Ensure lxc initialised +lxd init --auto || true + +# 2. Build. This should always do the right thing, regardless of how the +# charm is built. +if ! $SKIP_BUILD; then + tox -re build +fi + +# 3. Run tests + +for target in $(python3 $(realpath $(dirname $0))/identify_charm_func_tests.py); do + tox -re func-target $target + + read -p "Destroy model and run next test? [ENTER]" + # cleanup before next run + model=`juju list-models| egrep -o "^zaza-\S+"|tr -d '*'` + juju destroy-model --no-prompt $model --force --no-wait --destroy-storage +done + +# To troubleshoot issues with a run you can do the following: +# +# . .tox/func-target/bin/activate +# cd tests/distro-regression/ +# model=`juju list-models| egrep -o "^zaza-\S+"|tr -d '*'` +# functest-configure -m TARGET:$model + diff --git a/openstack/tools/identify_charm_func_tests.py b/openstack/tools/identify_charm_func_tests.py new file mode 100644 index 00000000..70dde933 --- /dev/null +++ b/openstack/tools/identify_charm_func_tests.py @@ -0,0 +1,20 @@ +# Get names of test targets that OSCI would run for the given charm. Should be +# run from within the charm root. +# +# Outputs space seperated list of target names. +# +import os +import yaml + +CLASSIC_TESTS_YAML = 'tests/tests.yaml' +REACTIVE_TESTS_YAML = os.path.join('src', CLASSIC_TESTS_YAML) + +if os.path.exists(REACTIVE_TESTS_YAML): + bundles = yaml.safe_load(open(REACTIVE_TESTS_YAML)) +else: + bundles = yaml.safe_load(open(CLASSIC_TESTS_YAML)) + +targets = set(bundles['smoke_bundles'] + bundles['gate_bundles'] + + bundles['dev_bundles']) + +print(' '.join(sorted(targets)))