diff --git a/tools/use_tempest_lib.sh b/tools/use_tempest_lib.sh new file mode 100755 index 0000000000..ca62c4ae25 --- /dev/null +++ b/tools/use_tempest_lib.sh @@ -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"