Add ability to compose java command according to version
[integration/test.git] / csit / libraries / NexusKeywords.robot
index 6928891a9d81917e8225e62de61c344542587063..850711e5d0c9066e2a05298459b1da230320fd58 100644 (file)
@@ -11,45 +11,111 @@ Documentation     Nexus repository access keywords.
 ...               This library encapsulates a bunch of somewhat complex and commonly used
 ...               netconf operations into reusable keywords to make writing netconf
 ...               test suites easier.
+Library           OperatingSystem
 Library           SSHLibrary
+Library           String
+Resource          SSHKeywords.robot
+
+*** Variables ***
+${NEXUS_FALLBACK_URL}    ${NEXUSURL_PREFIX}/content/repositories/opendaylight.snapshot
 
 *** Keywords ***
-NexusKeywords__Get_Version_From_Metadata
-    ${version}=    SSHLibrary.Execute_Command    cat metadata.xml | grep latest | cut -d '>' -f 2 | cut -d '<' -f 1
+Initialize_Artifact_Deployment_And_Usage
+    [Arguments]    ${tools_system_connect}=True
+    [Documentation]    Places search utility to ODL system, which will be needed for version detection.
+    ...    By default also initialize a SSH connection to Tools system,
+    ...    as following Keywords assume a working connection towards target 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
+    # Optionally connect to the Tools System machine.
+    BuiltIn.Return_From_Keyword_If    not (${tools_system_connect})    # the argument may be a convoluted Python expression
+    SSHKeywords.Open_Connection_To_Tools_System
+
+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]    ${directory}    ${name_prefix}    ${name_suffix}=-executable.jar    ${type}=snapshot
+    [Arguments]    ${component}    ${artifact}    ${name_prefix}    ${name_suffix}=-executable.jar    ${fallback_url}=${NEXUS_FALLBACK_URL}
     [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/${directory}
-    ${response}=    SSHLibrary.Execute_Command    curl ${urlbase}/maven-metadata.xml >metadata.xml
-    BuiltIn.Log    ${response}
+    ...    Must have ${BUNDLE_URL} variable set to the URL from which the
+    ...    tested ODL distribution was downloaded and this place must be
+    ...    inside a repository created by a standard distribution
+    ...    construction job. If this is detected to ne be the case, fallback URL is used.
+    ${urlbase}=    String.Fetch_From_Left    ${BUNDLE_URL}    /org/opendaylight
+    # If the BUNDLE_URL points somewhere else (perhaps *patch-test* job in Jenkins),
+    # ${urlbase} is the whole ${BUNDLE_URL}, in which case we use the ${fallback_url}
+    ${urlbase}=    BuiltIn.Set_Variable_If    '${urlbase}' != '${BUNDLE_URL}'    ${urlbase}    ${fallback_url}
+    ${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}
+    ${namepart}=    BuiltIn.Set_Variable_If    ${length} == 0    ${version}    ${namepart}
     ${filename}=    BuiltIn.Set_Variable    ${name_prefix}${namepart}${name_suffix}
     BuiltIn.Log    ${filename}
-    ${response}=    SSHLibrary.Execute_Command    wget -q -N ${urlbase}/${version}/${filename} 2>&1
+    ${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}
     [Return]    ${filename}
 
 Deploy_Test_Tool
-    [Arguments]    ${name}    ${suffix}=executable    ${type}=snapshot
+    [Arguments]    ${component}    ${artifact}    ${suffix}=executable
     [Documentation]    Deploy a test tool.
     ...    The test tools have naming convention of the form
-    ...    "${type}/some/dir/somewhere/<tool-name>/<tool-name>-<version-tag>-${suffix}.jar"
+    ...    "<repository_url>/some/dir/somewhere/<tool-name>/<tool-name>-<version-tag>-${suffix}.jar"
     ...    where "<tool-name>" is the name of the tool and "<version-tag>" is
     ...    the version tag that is digged out of the maven metadata. This
     ...    keyword calculates ${name_prefix} and ${name_suffix} for
     ...    "Deploy_Artifact" and then calls "Deploy_Artifact" to do the real
     ...    work of deploying the artifact.
-    ${name_part}=    BuiltIn.Evaluate    '${name}'.split("/").pop()
-    ${name_prefix}=    BuiltIn.Set_Variable    ${name_part}-
+    ${name_prefix}=    BuiltIn.Set_Variable    ${artifact}-
     ${name_suffix}=    BuiltIn.Set_Variable    -${suffix}.jar
-    ${filename}=    Deploy_Artifact    ${name}    ${name_prefix}    ${name_suffix}    ${type}
+    ${filename}=    Deploy_Artifact    ${component}    ${artifact}    ${name_prefix}    ${name_suffix}
     [Return]    ${filename}
+
+Compose_Base_Java_Command
+    [Arguments]    ${openjdk}=${JDKVERSION}
+    [Documentation]    Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
+    ...    Not directly related to nexus, but different versioned Java artifacts may need this.
+    BuiltIn.Return_From_Keyword_If    """${openjdk}""" == "openjdk8"    /usr/lib/jvm/java-1.8.0/bin/java
+    BuiltIn.Return_From_Keyword_If    """${openjdk}""" == "openjdk7"    /usr/lib/jvm/java-1.7.0/bin/java
+    BuiltIn.Return_From_Keyword    java
+
+Compose_Full_Java_Command
+    [Arguments]    ${options}    ${openjdk}=${JDKVERSION}
+    [Documentation]    Return full Bash command to run Java with given options.
+    ...    The options may include JVM options, application command line arguments, Bash redirects and other constructs.
+    ${base_command} =    Compose_Base_Java_Command    openjdk=${openjdk}
+    ${full_command} =    BuiltIn.Set_Variable    ${base_command} ${options}
+    BuiltIn.Log    ${full_command}
+    [Return]    ${full_command}