Use test tools from release that is under test 95/33995/10
authorJozef Behran <jbehran@cisco.com>
Wed, 3 Feb 2016 10:42:50 +0000 (11:42 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 5 Feb 2016 12:45:43 +0000 (12:45 +0000)
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 <jbehran@cisco.com>
csit/libraries/NexusKeywords.robot
csit/libraries/SSHKeywords.robot
tools/deployment/search.sh [new file with mode: 0644]

index e6853f8e61dc573c705b822756656bd604c50ae7..6cd2342682811597181dfb33e6c31d39c8224904 100644 (file)
@@ -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 '<version>' | 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}
index e38cc5f32ca60d96e05f150d4126cc996f641466..f3f79a2d6a8051da1cbefd9335629be4a1a92bad 100644 (file)
@@ -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 (file)
index 0000000..97839fe
--- /dev/null
@@ -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