Merge "Create script that finds candidate tests for refstack"
This commit is contained in:
commit
a93487957e
254
tools/cross_check/cross_check.sh
Executable file
254
tools/cross_check/cross_check.sh
Executable file
@ -0,0 +1,254 @@
|
||||
#!/bin/bash
|
||||
# This script is useful when it is time to find
|
||||
# new candidate tests for refstack. It lists
|
||||
# all API tests from tempest, designate-tempest-plugin,
|
||||
# heat-tempest-plugin and manila tempest-plugin except
|
||||
# those that:
|
||||
# * are/were part of interop repository or
|
||||
# * are mentioned in exclude file (see option --exclude-file) or
|
||||
# * are scenario tests or
|
||||
# * require admin access.
|
||||
#
|
||||
# The list of tests that is produced by this script is
|
||||
# good start to find new tests but not all tests listed
|
||||
# by the script must necessarily be added to the refstack.
|
||||
|
||||
function print_help() {
|
||||
SCRIPT_NAME="basename ${BASH_SOURCE[0]}"
|
||||
echo "Usage: ${SCRIPT_NAME} [OPTION] ..."
|
||||
echo "Find missing test in interop repository."
|
||||
echo ""
|
||||
echo "--interop-url URL to download interop git repository"
|
||||
echo "--interop-commit ID of interop commit that should be used"
|
||||
echo "--tempest-url URL to download tempest git repository"
|
||||
echo "--tempest-commit ID of tempest commit that should be used"
|
||||
echo "--designate-url URL to download designate-tempest-plugin git repository"
|
||||
echo "--designate-commit ID of designate-tempest-plugin commit that should be used"
|
||||
echo "--heat-url URL to download heat-tempest-plugin"
|
||||
echo "--heat-commit ID of heat-tempest-plugin commit that should be used"
|
||||
echo "--manila-url URL to download manila-tempest-plugin"
|
||||
echo "--manila-commit ID of manila-tempest-plugin commit that should be used"
|
||||
echo "--exclude-file File that contains tests that should be ignored"
|
||||
echo " (Default: ./exclude_file.txt)"
|
||||
}
|
||||
|
||||
TEMPEST_GIT_URL=https://opendev.org/openstack/tempest.git
|
||||
TEMPEST_COMMIT=e64c78dcf720202a0542bb1e1184f5229a11524f
|
||||
|
||||
DESIGNATE_GIT_URL=https://opendev.org/openstack/designate-tempest-plugin.git
|
||||
DESIGNATE_COMMIT=master
|
||||
|
||||
HEAT_GIT_URL=https://opendev.org/openstack/heat-tempest-plugin.git
|
||||
HEAT_COMMIT=master
|
||||
|
||||
MANILA_GIT_URL=https://opendev.org/openstack/manila-tempest-plugin.git
|
||||
MANILA_COMMIT=master
|
||||
|
||||
INTEROP_GIT_URL=https://opendev.org/osf/interop.git
|
||||
INTEROP_COMMIT=master
|
||||
|
||||
TMP_DIR=$(mktemp -d)
|
||||
SCRIPTDIR=$(dirname $0)
|
||||
EXCLUDE_FILE="${SCRIPTDIR}/exclude_file.txt"
|
||||
|
||||
while [[ ! -z "$1" ]]; do
|
||||
case "$1" in
|
||||
--interop-url)
|
||||
INTEROP_GIT_URL="$2";
|
||||
shift 2;;
|
||||
--interop-commit)
|
||||
INTEROP_COMMIT="$2";
|
||||
shift 2;;
|
||||
--tempest-url)
|
||||
TEMPEST_GIT_URL="$2";
|
||||
shift 2;;
|
||||
--tempest-commit)
|
||||
TEMPEST_COMMIT="$2";
|
||||
shift 2;;
|
||||
--designate-url)
|
||||
DESIGNATE_GIT_URL="$2";
|
||||
shift 2;;
|
||||
--designate-commit)
|
||||
DESIGNATE_COMMIT="$2";
|
||||
shift 2;;
|
||||
--heat-url)
|
||||
HEAT_URL="$2";
|
||||
shift 2;;
|
||||
--heat-commit)
|
||||
HEAT_COMMIT="$2";
|
||||
shift 2;;
|
||||
--manila-url)
|
||||
MANILA_URL="$2";
|
||||
shift 2;;
|
||||
--manila-commit)
|
||||
MANILA_COMMIT="$2"
|
||||
shift 2;;
|
||||
--exclude-file)
|
||||
EXCLUDE_FILE="$2";
|
||||
shift 2;;
|
||||
--help)
|
||||
print_help
|
||||
exit;;
|
||||
*)
|
||||
echo "ERROR: Not valid option used ($1)";
|
||||
exit;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ! -z ${EXCLUDE_FILE} ]] && [[ -f ${EXCLUDE_FILE} ]]; then
|
||||
EXCLUDE_FILE=$(realpath ${EXCLUDE_FILE})
|
||||
elif [[ ! -z ${EXCLUDE_FILE} ]] && [[ ! -f ${EXCLUDE_FILE} ]]; then
|
||||
echo "ERROR: Not valid exclude file (${EXCLUDE_FILE})"
|
||||
exit
|
||||
else
|
||||
touch ${TMP_DIR}/exclude_file.txt
|
||||
EXCLUDE_FILE="${TMP_DIR}/exclude_file.txt"
|
||||
fi
|
||||
|
||||
echo "Temporary directory used by cross_check.sh: ${TMP_DIR}"
|
||||
|
||||
# Clone repositories
|
||||
echo "Cloning interop repository ..."
|
||||
git clone --quiet ${INTEROP_GIT_URL} ${TMP_DIR}/interop
|
||||
cd ${TMP_DIR}/interop
|
||||
git checkout --quiet ${INTEROP_COMMIT}
|
||||
cd - &> /dev/null
|
||||
|
||||
echo "Cloning tempest repository ..."
|
||||
git clone --quiet ${TEMPEST_GIT_URL} ${TMP_DIR}/tempest
|
||||
cd ${TMP_DIR}/tempest
|
||||
git checkout --quiet ${TEMPEST_COMMIT}
|
||||
cd - &> /dev/null
|
||||
|
||||
echo "Cloning designate-tempest-plugin repository ..."
|
||||
git clone --quiet ${DESIGNATE_GIT_URL} ${TMP_DIR}/designate-tempest-plugin
|
||||
cd ${TMP_DIR}/designate-tempest-plugin
|
||||
git checkout --quiet ${DESIGNATE_COMMIT}
|
||||
cd - &> /dev/null
|
||||
|
||||
echo "Cloning heat-tempest-plugin repository ..."
|
||||
git clone --quiet ${HEAT_GIT_URL} ${TMP_DIR}/heat-tempest-plugin
|
||||
cd ${TMP_DIR}/heat-tempest-plugin
|
||||
git checkout --quiet ${HEAT_COMMIT}
|
||||
cd - &> /dev/null
|
||||
|
||||
echo "Cloning manila-tempest-plugin repository ..."
|
||||
git clone --quiet ${MANILA_GIT_URL} ${TMP_DIR}/manila-tempest-plugin
|
||||
cd ${TMP_DIR}/manila-tempest-plugin
|
||||
git checkout --quiet ${MANILA_COMMIT}
|
||||
cd - &> /dev/null
|
||||
|
||||
########################################################
|
||||
# Find and print missing tests from interop repository.
|
||||
#
|
||||
# GLOBALS:
|
||||
# TMP_DIR, EXCLUDE_FILE
|
||||
# ARGUMENTS:
|
||||
# 1 - Path to the repository in which the missing
|
||||
# tests should be found.
|
||||
# OUTPUTS:
|
||||
# List of tests that are part of passed repository
|
||||
# but not part of interop and not mentioned in
|
||||
# exclude file.
|
||||
#
|
||||
#######################################################
|
||||
function cross_check() {
|
||||
|
||||
REPO_DIR=$1
|
||||
|
||||
# Get every idempotent id from the repository
|
||||
grep -hr --exclude-dir="doc" "@decorators.idempotent_id('" ${REPO_DIR} \
|
||||
| sed --expression="s/@decorators.idempotent_id('//g" \
|
||||
| sed --expression="s/')//g" \
|
||||
| sed --expression="s/ *//g" \
|
||||
| sort > ${TMP_DIR}/repo_idempotent_ids.txt
|
||||
|
||||
# Get every idempotent id from interop
|
||||
cd ${TMP_DIR}/interop/guidelines
|
||||
cat $(ls -1 | grep -E "[0-9]{4}\.[0-9]{2}\.json|next.json") ${TMP_DIR}/interop/add-ons/guidelines/* \
|
||||
| grep -oE "id-[[:alnum:]]{8}-[[:alnum:]]{4}-[[:alnum:]]{4}-[[:alnum:]]{4}-[[:alnum:]]{12}" \
|
||||
| sed --expression='s/id-//g' \
|
||||
| sort > ${TMP_DIR}/interop_idempotent_ids.txt
|
||||
cd - &> /dev/null
|
||||
|
||||
|
||||
# Get ids of missing tests in interop
|
||||
comm -23 ${TMP_DIR}/repo_idempotent_ids.txt ${TMP_DIR}/interop_idempotent_ids.txt \
|
||||
| sort > ${TMP_DIR}/missing_idempotent_ids.txt
|
||||
|
||||
# Print missing tests to stdout
|
||||
cd ${REPO_DIR}
|
||||
while read ID; do
|
||||
FILE=$(grep -rl "${ID}" && cd - > /dev/null)
|
||||
|
||||
FUNC_NAME=$(sed -e "1,/${ID}/d" ${FILE} \
|
||||
| grep -m1 "def" \
|
||||
| sed "s/def//g; s/(.*//g; s/ //g")
|
||||
|
||||
CLASS_NAME=$(sed "/${ID}/q" ${FILE} \
|
||||
| grep "^class " \
|
||||
| tail -1 \
|
||||
| sed "s/class//g; s/(.*//g; s/ //g")
|
||||
|
||||
FILE_ID=$(echo ${FILE} | sed "s/\.py//g; s/\.\///g; s/\//\./g")
|
||||
TEST_NAME="${FILE_ID}.${CLASS_NAME}.${FUNC_NAME}"
|
||||
|
||||
# Check if test:
|
||||
# * requires admin access or
|
||||
# * is already present in interop next files
|
||||
# (necessary for older next files as they do not
|
||||
# use idempotent ids) or
|
||||
# * is scenario test or
|
||||
# * is present in exclude file.
|
||||
ADMIN_TEST=$(echo ${FILE_ID} | grep "\.admin\.")
|
||||
SCENARIO_TEST=$(echo ${FILE_ID} | grep "\.scenario\.")
|
||||
IN_INTEROP=$(grep -r ${TEST_NAME} ${TMP_DIR}/interop)
|
||||
IN_EXCLUDE=$(cat ${EXCLUDE_FILE} | grep "${TEST_NAME}")
|
||||
|
||||
if [[ ! ${IN_INTEROP} ]] && \
|
||||
[[ ! ${ADMIN_TEST} ]] && \
|
||||
[[ ! ${IN_EXCLUDE} ]] && \
|
||||
[[ ! ${SCENARIO_TEST} ]]
|
||||
then
|
||||
echo "${TEST_NAME}[${ID}]"
|
||||
fi
|
||||
|
||||
done < ${TMP_DIR}/missing_idempotent_ids.txt
|
||||
cd - &> /dev/null
|
||||
|
||||
}
|
||||
|
||||
echo "Searching tempest repository ..."
|
||||
cross_check ${TMP_DIR}/tempest > ${TMP_DIR}/tempest_tests.txt
|
||||
|
||||
echo "Searching designate-tempest-plugin repository ..."
|
||||
cross_check ${TMP_DIR}/designate-tempest-plugin > ${TMP_DIR}/designate_tests.txt
|
||||
|
||||
echo "Searching heat-tempest-plugin repository ..."
|
||||
cross_check ${TMP_DIR}/heat-tempest-plugin > ${TMP_DIR}/heat_tests.txt
|
||||
|
||||
echo "Searching manila-tempest-plugin repository ..."
|
||||
cross_check ${TMP_DIR}/manila-tempest-plugin > ${TMP_DIR}/manila_tests.txt
|
||||
|
||||
echo "Tempest tests:"
|
||||
echo "--------------"
|
||||
sort ${TMP_DIR}/tempest_tests.txt
|
||||
echo ""
|
||||
|
||||
echo "Designate-tempest-plugin tests:"
|
||||
echo "-------------------------------"
|
||||
sort ${TMP_DIR}/designate_tests.txt
|
||||
echo ""
|
||||
|
||||
echo "Heat-tempest-plugin tests:"
|
||||
echo "--------------------------"
|
||||
sort ${TMP_DIR}/heat_tests.txt
|
||||
echo ""
|
||||
|
||||
echo "Manila-tempest-plugin tests:"
|
||||
echo "----------------------------"
|
||||
sort ${TMP_DIR}/manila_tests.txt
|
||||
|
||||
# Cleanup
|
||||
rm -rf ${TMP_DIR}
|
||||
|
20
tools/cross_check/exclude_file.txt
Normal file
20
tools/cross_check/exclude_file.txt
Normal file
@ -0,0 +1,20 @@
|
||||
# This file is used by cross_check.sh script. It contains list of tests
|
||||
# that should be ignored by the script. Each test (or group of tests) should
|
||||
# be accompanied by a comment explaining why the test should be ignored.
|
||||
|
||||
# Tests marked as deprecated (see: https://review.opendev.org/c/osf/interop/+/800795/)
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions.FloatingIPsAssociationTestJSON.test_associate_already_associated_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions.FloatingIPsAssociationTestJSON.test_associate_disassociate_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions.FloatingIPsTestJSON.test_allocate_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions.FloatingIPsTestJSON.test_delete_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions_negative.FloatingIPsAssociationNegativeTestJSON.test_associate_ip_to_server_with_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions_negative.FloatingIPsAssociationNegativeTestJSON.test_associate_ip_to_server_without_passing_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions_negative.FloatingIPsAssociationNegativeTestJSON.test_associate_nonexistent_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions_negative.FloatingIPsAssociationNegativeTestJSON.test_dissociate_nonexistent_floating_ip
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions_negative.FloatingIPsNegativeTestJSON.test_allocate_floating_ip_from_nonexistent_pool
|
||||
tempest.api.compute.floating_ips.test_floating_ips_actions_negative.FloatingIPsNegativeTestJSON.test_delete_nonexistent_floating_ip
|
||||
tempest.api.compute.floating_ips.test_list_floating_ips.FloatingIPDetailsTestJSON.test_get_floating_ip_details
|
||||
tempest.api.compute.floating_ips.test_list_floating_ips.FloatingIPDetailsTestJSON.test_list_floating_ip_pools
|
||||
tempest.api.compute.floating_ips.test_list_floating_ips.FloatingIPDetailsTestJSON.test_list_floating_ips
|
||||
tempest.api.compute.floating_ips.test_list_floating_ips_negative.FloatingIPDetailsNegativeTestJSON.test_get_nonexistent_floating_ip_details
|
||||
|
Loading…
x
Reference in New Issue
Block a user