Merge "Add script to use tempest-lib files in tempest"

This commit is contained in:
Jenkins 2015-12-04 17:42:54 +00:00 committed by Gerrit Code Review
commit a8a6f0334b

141
tools/use_tempest_lib.sh Executable file
View File

@ -0,0 +1,141 @@
#!/bin/bash
#
# Use this script to use interfaces/files from tempest-lib.
# Many files have been migrated to tempest-lib and tempest has
# its own copy too.
# This script helps to remove those from tempest and make use of tempest-lib.
# It adds the change-id of each file on which they were migrated in lib.
# This should only be done for files which were migrated to lib with
# "Migrated" in commit message as done by tempest-lib/tools/migrate_from_tempest.sh script.
# "Migrated" keyword is used to fetch the migration commit history from lib.
# To use:
# 1. Create a new branch in the tempest repo so not to destroy your current
# working branch
# 2. Run the script from the repo dir and specify the file paths relative to
# the root tempest dir(only code and unit tests):
#
# tools/use_tempest_lib.sh.sh tempest/file1.py tempest/file2.py
function usage {
echo "Usage: $0 [OPTION] file1 file2 .."
echo "Use files from tempest-lib"
echo -e "Input files should be tempest files with path. \n Example- tempest/file1.py tempest/file2.py .."
echo ""
echo "-s, --service_client Specify if files are service clients."
echo "-u, --tempest_lib_git_url Specify the repo to clone tempest-lib from."
}
function check_all_files_valid {
failed=0
for file in $files; do
# Get the latest change-id for each file
latest_commit_id=`git log -n1 -- $file | grep "^commit" | awk '{print $2}'`
cd $tmpdir
filename=`basename $file`
lib_path=`find ./ -name $filename`
if [ -z $lib_path ]; then
echo "ERROR: $filename does not exist in tempest-lib."
failed=$(( failed + 1))
cd - > /dev/null
continue
fi
# Get the CHANGE_ID of tempest-lib patch where file was migrated
migration_change_id=`git log -n1 --grep "Migrated" -- $lib_path | grep "Change-Id: " | awk '{print $2}'`
MIGRATION_IDS=`echo -e "$MIGRATION_IDS\n * $filename: $migration_change_id"`
# Get tempest CHANGE_ID of file which was migrated to lib
migrated_change_id=`git log -n1 --grep "Migrated" -- $lib_path | grep "* $filename"`
migrated_change_id=${migrated_change_id#*:}
cd - > /dev/null
# Get the commit-id of tempest which was migrated to tempest-lib
migrated_commit_id=`git log --grep "$migrated_change_id" -- $file | grep "^commit" | awk '{print $2}'`
DIFF=$(git diff $latest_commit_id $migrated_commit_id $file)
if [ "$DIFF" != "" ]; then
echo "ERROR: $filename in tempest has been updated after migration to tempest-lib. First sync the file to tempest-lib."
failed=$(( failed + 1))
fi
done
if [[ $failed -gt 0 ]]; then
echo "$failed files had issues"
exit $failed
fi
}
set -e
service_client=0
file_list=''
while [ $# -gt 0 ]; do
case "$1" in
-h|--help) usage; exit;;
-u|--tempest_lib_git_url) tempest_lib_git_url="$2"; shift;;
-s|--service_client) service_client=1;;
*) files="$files $1";;
esac
shift
done
if [ -z "$files" ]; then
usage; exit
fi
TEMPEST_LIB_GIT_URL=${tempest_lib_git_url:-git://git.openstack.org/openstack/tempest-lib}
tmpdir=$(mktemp -d -t use-tempest-lib.XXXX)
# Clone tempest-lib
git clone $TEMPEST_LIB_GIT_URL $tmpdir
# Checks all provided files are present in lib and
# not updated in tempest after migration to lib.
check_all_files_valid
for file in $files; do
rm -f $file
tempest_dir=`pwd`
tempest_dir="$tempest_dir/tempest/"
tempest_dirname=`dirname $file`
lib_dirname=`echo $tempest_dirname | sed s@tempest\/@tempest_lib/\@`
# Convert tempest dirname to import string
tempest_import="${tempest_dirname//\//.}"
tempest_import=${tempest_import:2:${#tempest_import}}
if [ $service_client -eq 1 ]; then
# Remove /json path because tempest-lib supports JSON only without XML
lib_dirname=`echo $lib_dirname | sed s@\/json@@`
fi
# Convert tempest-lib dirname to import string
tempest_lib_import="${lib_dirname//\//.}"
tempest_lib_import=${tempest_lib_import:2:${#tempest_lib_import}}
module_name=`basename $file .py`
tempest_import1="from $tempest_import.$module_name"
tempest_lib_import1="from $tempest_lib_import.$module_name"
tempest_import2="from $tempest_import import $module_name"
tempest_lib_import2="from $tempest_lib_import import $module_name"
set +e
grep -rl "$tempest_import1" $tempest_dir | xargs sed -i'' s/"$tempest_import1"/"$tempest_lib_import1"/g 2> /dev/null
grep -rl "$tempest_import2" $tempest_dir | xargs sed -i'' s/"$tempest_import2"/"$tempest_lib_import2"/g 2> /dev/null
set -e
if [[ -z "$file_list" ]]; then
file_list="$module_name"
else
tmp_file_list="$file_list, $module_name"
char_size=`echo $tmp_file_list | wc -c`
if [ $char_size -lt 27 ]; then
file_list="$file_list, $module_name"
fi
fi
done
rm -rf $tmpdir
echo "Completed. Run pep8 and fix error if any"
git add -A tempest/
# Generate a migration commit
commit_message="Use $file_list from tempest-lib"
pre_list=$"The files below have been migrated to tempest-lib\n"
pre_list=`echo -e $pre_list`
post_list=$"Now Tempest-lib provides those as stable interfaces. So Tempest should\nstart using those from lib and remove its own copy."
post_list=`echo -e $post_list`
git commit -m "$commit_message" -m "$pre_list" -m "$MIGRATION_IDS" -m "$post_list"