From 1070e381673ac20140ab6ed9064e0ac3d97e1691 Mon Sep 17 00:00:00 2001 From: Jozef Behran Date: Wed, 3 Feb 2016 11:42:50 +0100 Subject: [PATCH] Use test tools from release that is under test The old practice was "use the test tool with the latest version" which almost always means "use the test tool from the latest release". However this will break the tests for the older releases if incompatible change is being made to these tools. This is currently the case as the latest release (Boron) is built with Java 8 and the older releases (Lithium, Beryllium) are built with Java 7 and tested on Java 7 VMs. This adds an ugly piece of code to try to deploy and use test tools from the release that is being tested. The problem that prompts for the ugly code was reported as bug 5206. Change-Id: Id683c352ffd7e506255cbc7e0e28d612c2803360 Signed-off-by: Jozef Behran --- csit/libraries/NexusKeywords.robot | 53 +++++++++++++++++++------ csit/libraries/SSHKeywords.robot | 7 ++++ tools/deployment/search.sh | 63 ++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 tools/deployment/search.sh diff --git a/csit/libraries/NexusKeywords.robot b/csit/libraries/NexusKeywords.robot index e6853f8e61..6cd2342682 100644 --- a/csit/libraries/NexusKeywords.robot +++ b/csit/libraries/NexusKeywords.robot @@ -12,6 +12,7 @@ Documentation Nexus repository access keywords. ... netconf operations into reusable keywords to make writing netconf ... test suites easier. Library SSHLibrary +Library String Resource SSHKeywords.robot *** Keywords *** @@ -20,31 +21,57 @@ Initialize_Artifact_Deployment_And_Usage ... Create and activate a connection to the tools system and perform ... additional configuration to allow the remaining keywords to deploy ... and use artifacts from Nexus on the tools system. - SSHKeywords.Open_Connection_To_Tools_System + # Connect to the ODL machine + ${odl}= SSHKeywords.Open_Connection_To_ODL_System + # Deploy the search tool. + SSHLibrary.Put_File ${CURDIR}/../../tools/deployment/search.sh + SSHLibrary.Close_Connection + # Connect to the Tools System machine + ${tools}= SSHKeywords.Open_Connection_To_Tools_System + BuiltIn.Set_Suite_Variable ${SSHKeywords__tools_system_connection} ${tools} -NexusKeywords__Get_Version_From_Metadata - ${version}= SSHLibrary.Execute_Command cat metadata.xml | grep latest | cut -d '>' -f 2 | cut -d '<' -f 1 +NexusKeywords__Get_Items_To_Look_At + [Arguments] ${component} + [Documentation] Get a list of items that might contain the version number that we are looking for. + BuiltIn.Return_From_Keyword_If '${component}' == 'bgpcep' pcep-impl + [Return] ${component}-impl + +NexusKeywords__Detect_Version_To_Pull + [Arguments] ${component} + [Documentation] Determine the exact Nexus directory to be used as a source for a particular test tool + ... Figure out what version of the tool needs to be pulled out of the + ... Nexus by looking at the version directory of the subsystem from + ... which the tool is being pulled. This code is REALLY UGLY but there + ... is no way around it until the bug + ... https://bugs.opendaylight.org/show_bug.cgi?id=5206 gets fixed. + ... I also don't want to depend on maven-metadata-local.xml and other + ... bits and pieces of ODL distribution which are not required for ODL + ... to function properly. + ${itemlist}= NexusKeywords__Get_Items_To_Look_At ${component} + ${current_ssh_connection}= SSHLibrary.Get Connection + SSHKeywords.Open_Connection_To_ODL_System + ${version} ${result}= SSHLibrary.Execute_Command sh search.sh ${WORKSPACE}/${BUNDLEFOLDER}/system ${itemlist} return_rc=True + SSHLibrary.Close_Connection + Restore Current SSH Connection From Index ${current_ssh_connection.index} BuiltIn.Log ${version} - BuiltIn.Return_From_Keyword_If '${version}' != '' ${version} - ${version}= SSHLibrary.Execute_Command cat metadata.xml | grep '' | sort | tail -n 1 | cut -d '>' -f 2 | cut -d '<' -f 1 - BuiltIn.Return_From_Keyword_If '${version}' != '' ${version} - BuiltIn.Fail Unrecognized metadata format, cannot determine the location of the requested artifact. + BuiltIn.Run_Keyword_If ${result}!=0 BuiltIn.Fail Component "${component}" not found, cannot locate test tool + ${version} ${location}= String.Split_String ${version} max_split=1 + [Return] ${version} ${location} Deploy_Artifact [Arguments] ${component} ${artifact} ${name_prefix} ${name_suffix}=-executable.jar ${type}=snapshot [Documentation] Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points. - ${urlbase}= BuiltIn.Set_Variable ${NEXUSURL_PREFIX}/content/repositories/opendaylight.${type}/org/opendaylight/${component}/${artifact} - ${response}= SSHLibrary.Execute_Command curl ${urlbase}/maven-metadata.xml >metadata.xml - BuiltIn.Log ${response} + ${urlbase}= BuiltIn.Set_Variable ${NEXUSURL_PREFIX}/content/repositories/opendaylight.${type} + ${version} ${location}= NexusKeywords__Detect_Version_To_Pull ${component} # TODO: Use RequestsLibrary and String instead of curl and bash utilities? - ${version}= NexusKeywords__Get_Version_From_Metadata - ${namepart}= SSHLibrary.Execute_Command curl ${urlbase}/${version}/maven-metadata.xml | grep value | head -n 1 | cut -d '>' -f 2 | cut -d '<' -f 1 + ${url}= BuiltIn.Set_Variable ${urlbase}/${location}/${artifact}/${version} + ${namepart}= SSHLibrary.Execute_Command curl ${url}/maven-metadata.xml | grep value | head -n 1 | cut -d '>' -f 2 | cut -d '<' -f 1 BuiltIn.Log ${namepart} ${length}= BuiltIn.Get_Length ${namepart} BuiltIn.Run_Keyword_If ${length} == 0 BuiltIn.Fail Artifact "${artifact}" not found in component "${component}" ${filename}= BuiltIn.Set_Variable ${name_prefix}${namepart}${name_suffix} BuiltIn.Log ${filename} - ${url}= BuiltIn.Set_Variable ${urlbase}/${version}/${filename} + ${url}= BuiltIn.Set_Variable ${url}/${filename} ${response} ${result}= SSHLibrary.Execute_Command wget -q -N ${url} 2>&1 return_rc=True BuiltIn.Log ${response} BuiltIn.Run_Keyword_If ${result} != 0 BuiltIn.Fail Artifact "${artifact}" in component "${component}" could not be downloaded from ${url} diff --git a/csit/libraries/SSHKeywords.robot b/csit/libraries/SSHKeywords.robot index e38cc5f32c..f3f79a2d6a 100644 --- a/csit/libraries/SSHKeywords.robot +++ b/csit/libraries/SSHKeywords.robot @@ -16,6 +16,13 @@ Library SSHLibrary Resource ${CURDIR}/Utils.robot *** Keywords *** +Open_Connection_To_ODL_System + [Documentation] Open a connection to the ODL system and return its identifier. + ... On clustered systems this opens the connection to the first node. + ${odl}= SSHLibrary.Open_Connection ${ODL_SYSTEM_IP} prompt=${ODL_SYSTEM_PROMPT} timeout=10s + Utils.Flexible_Controller_Login + [Return] ${odl} + Open_Connection_To_Tools_System [Documentation] Open a connection to the tools system and return its identifier. ${tools}= SSHLibrary.Open_Connection ${TOOLS_SYSTEM_IP} prompt=${TOOLS_SYSTEM_PROMPT} diff --git a/tools/deployment/search.sh b/tools/deployment/search.sh new file mode 100644 index 0000000000..97839fed52 --- /dev/null +++ b/tools/deployment/search.sh @@ -0,0 +1,63 @@ +# Search the specified directory (parameter $1) for the specified items (the +# remaining parameters). The "item" is expected to be a directory located +# somewhere along the directory tree at which $1 points. This directory must +# have exactly 1 subdirectory and that subdirectory's name is considered to +# be the version number we are looking for. +# +# This tool searches for these items in the order specified and emits the +# first version number it finds. Using an one-line shell script for this task +# turned out to be pretty impossible as the algorithm is quite complicated +# (the "items" may move around the directory tree between releases and even +# some of them might disappear and the others appear) so a full blown utility +# is necessary. + +exec 2>&1 +set -e +directory=$1 +shift +if test -d $directory; then :; else + echo "Path '$directory' does not exist or is not a directory" + exit 1 +fi +if test -d $directory/org/opendaylight; then :; else + echo "Path '$directory' does not look like OpenDaylight System directory" + exit 1 +fi +file_list=`pwd`/filelist.tmp +trap "rm -f $file_list" EXIT +version_found="n/a" +finish=false +for Thing in $@; do + cd $directory + find . -name $Thing -type d -print >$file_list + exec <$file_list + while read -r directory_to_check; do + cd $directory_to_check + for file_in_checked_directory in *; do + if test -d $file_in_checked_directory; then + if test "$version_found" = "n/a"; then + version_found=$file_in_checked_directory + where_found=$directory_to_check + finish=true + else + version_found="n/a" + finish=false + break + fi + fi + done + if $finish; then + break + fi + done + if $finish; then + break + fi +done +if $finish; then + echo $version_found + dirname $where_found | cut -b 3- +else + echo "None of the supplied components were found." + exit 1 +fi -- 2.36.6