Skip to content

Commit

Permalink
Add openstack charm func test runner
Browse files Browse the repository at this point in the history
Also includes tool to identify func test targets from the charm.
  • Loading branch information
dosaboy committed Aug 31, 2024
1 parent 96a984b commit 4a41ec5
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 0 deletions.
102 changes: 102 additions & 0 deletions openstack/tools/charmed_openstack_functest_runner.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#!/bin/bash -eux
FUNC_TEST_PR=
SKIP_BUILD=false

while (($# > 0))
do
case "$1" in
--func-test-pr)
FUNC_TEST_PR=$2
shift
;;
--skip-build)
SKIP_BUILD=true
;;
*)
echo "ERROR: invalid input '$1'"
exit 1
;;
esac
shift
done


source ~/novarc
export {,TEST_}CIDR_EXT=`openstack subnet show subnet_${OS_USERNAME}-psd-extra -c cidr -f value`
FIP_MAX=$(ipcalc $CIDR_EXT| awk '$1=="HostMax:" {print $2}')
FIP_MIN=$(ipcalc $CIDR_EXT| awk '$1=="HostMin:" {print $2}')
FIP_MIN_ABC=${FIP_MIN%.*}
FIP_MIN_D=${FIP_MIN##*.}
FIP_MIN=${FIP_MIN_ABC}.$(($FIP_MIN_D + 64))

CIDR_OAM=`openstack subnet show subnet_${OS_USERNAME}-psd -c cidr -f value`
OAM_MAX=$(ipcalc $CIDR_OAM| awk '$1=="HostMax:" {print $2}')
OAM_MIN=$(ipcalc $CIDR_OAM| awk '$1=="HostMin:" {print $2}')
OAM_MIN_ABC=${OAM_MIN%.*}
OAM_MAX_D=${OAM_MAX##*.}
# Picking last two addresses and hoping they dont get used by Neutron.
export OS_VIP00=${OAM_MIN_ABC}.$(($OAM_MAX_D - 1))
export OS_VIP01=${OAM_MIN_ABC}.$(($OAM_MAX_D - 2))

# More information on config https://github.com/openstack-charmers/zaza/blob/master/doc/source/runningcharmtests.rst
export {,TEST_}NET_ID=$(openstack network show net_${OS_USERNAME}-psd-extra -f value -c id)
export {,TEST_}FIP_RANGE=$FIP_MIN:$FIP_MAX
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 SWIFT_IP=10.140.56.22
export TEST_MODEL_SETTINGS="image-stream=released;default-series=jammy;test-mode=true;transmit-vendor-metrics=false"
# 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

# NOTE: this should not be necessary for > juju 2.x but since we still have a need for it we add it in
export TEST_ZAZA_BUG_LP1987332=1

# Some charms point to an upstream constraints file that installs python-libjuju 2.x so we need to do this to ensure we get 3.x
export TEST_CONSTRAINTS_FILE=https://raw.githubusercontent.com/openstack-charmers/zaza/master/constraints-juju34.txt

## 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 $(grep charmcraft_channel osci.yaml| sed -r 's/.+:\s+(\S+)/\1/')

# 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

# If a func test pr is provided switch to that pr.
if [[ -n $FUNC_TEST_PR ]]; then
(
[[ -d src ]] && cd src
# We use the zosci-config tools to do this.
[[ -d ~/zosci-config ]] || ( cd; git clone https://github.com/openstack-charmers/zosci-config; )
(cd ~/zosci-config; git checkout master; git pull;)
MSG=$(echo "Func-Test-Pr: https://github.com/openstack-charmers/zaza-openstack-tests/pull/$FUNC_TEST_PR"| base64)
~/zosci-config/roles/handle-func-test-pr/files/process_func_test_pr.py -f ./test-requirements.txt "$MSG"
)
fi

for target in $(python3 $(realpath $(dirname $0))/identify_charm_func_tests.py); do
[[ -d src ]] && pushd src || true
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

20 changes: 20 additions & 0 deletions openstack/tools/identify_charm_func_tests.py
Original file line number Diff line number Diff line change
@@ -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)))

0 comments on commit 4a41ec5

Please sign in to comment.