+ [Arguments] ${component} ${artifact} ${suffix}=executable ${fallback_url}=${NEXUS_FALLBACK_URL} ${explicit_url}=${EMPTY} ${build_version}=${EMPTY} ${build_location}=${EMPTY}
+ ${name_prefix} = BuiltIn.Set_Variable ${artifact}-
+ ${extension} = BuiltIn.Set_Variable_If '${component}'=='odl-micro' tar jar
+ ${name_suffix} = BuiltIn.Set_Variable_If "${suffix}" != "" -${suffix}.${extension} .${extension}
+ ${filename} = Deploy_Artifact
+ ... ${component}
+ ... ${artifact}
+ ... ${name_prefix}
+ ... ${name_suffix}
+ ... ${fallback_url}
+ ... ${explicit_url}
+ ... ${build_version}
+ ... ${build_location}
+ RETURN ${filename}
+
+Install_And_Start_Java_Artifact
+ [Documentation] Deploy the artifact, assign name for log file, figure out java command, write the command to active SSH connection and return the log name.
+ ... This keyword does not examine whether the artifact was started successfully or whether is still running upon return.
+ [Arguments] ${component} ${artifact} ${suffix}=executable ${tool_options}=${EMPTY} ${java_options}=${EMPTY} ${openjdk}=${JDKVERSION}
+ ... ${fallback_url}=${NEXUS_FALLBACK_URL} ${explicit_url}=${EMPTY}
+ # TODO: Unify this keyword with what NexusKeywords.Install_And_Start_Testtool does.
+ ${actual_java_options} = BuiltIn.Set_Variable_If
+ ... """${java_options}""" != ""
+ ... ${java_options}
+ ... ${JAVA_OPTIONS}
+ ${filename} = Deploy_Test_Tool ${component} ${artifact} ${suffix} ${fallback_url} ${explicit_url}
+ ${command} = Compose_Full_Java_Command ${actual_java_options} -jar ${filename} ${tool_options}
+ ${logfile} = Utils.Get_Log_File_Name ${artifact}
+ SSHLibrary.Write ${command} >${logfile} 2>&1
+ RETURN ${logfile}
+
+Compose_Dilemma_Filepath
+ [Documentation] Query active SSH connection, return specific path if it exists else default path.
+ [Arguments] ${default_path} ${specific_path}
+ ${out} ${rc} = SSHLibrary.Execute_Command ls -lA ${specific_path} 2>&1 return_rc=True
+ IF ${rc} == 0 RETURN ${specific_path}
+ RETURN ${default_path}
+
+Compose_Base_Java_Command
+ [Documentation] Return string suitable for launching Java programs over SSHLibrary, depending on JRE version needed.
+ ... This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
+ ... Commands composed for one SSH connection shall not be reused on other SSH connections as the two connections may have different Java setups.
+ ... Not directly related to Nexus, but versioned Java tools may need this.
+ [Arguments] ${openjdk}=${JDKVERSION}
+ # Check whether the user set the override and return it if yes.
+ BuiltIn.Run_Keyword_And_Return_If
+ ... """${openjdk}""" == "openjdk8"
+ ... Compose_Dilemma_Filepath
+ ... ${JAVA_8_HOME_CENTOS}/bin/java
+ ... ${JAVA_8_HOME_UBUNTU}/bin/java
+ BuiltIn.Run_Keyword_And_Return_If
+ ... """${openjdk}""" == "openjdk11"
+ ... Compose_Dilemma_Filepath
+ ... ${JAVA_11_HOME_CENTOS}/bin/java
+ ... ${JAVA_11_HOME_UBUNTU}/bin/java
+ BuiltIn.Run_Keyword_And_Return_If
+ ... """${openjdk}""" == "openjdk17"
+ ... Compose_Dilemma_Filepath
+ ... ${JAVA_17_HOME_CENTOS}/bin/java
+ ... ${JAVA_17_HOME_UBUNTU}/bin/java
+ # Attempt to call plain "java" command directly. If it works, return it.
+ ${out} ${rc} = SSHLibrary.Execute_Command java -version 2>&1 return_rc=True
+ IF ${rc} == 0 RETURN java
+ # Query the virtual machine for the JAVA_HOME environment variable and
+ # use it to assemble a (hopefully) working command. If that worked out,
+ # return the result.
+ ${java} = SSHLibrary.Execute_Command echo $JAVA_HOME/bin/java 2>&1
+ ${out} ${rc} = SSHLibrary.Execute_Command ${java} -version 2>&1 return_rc=True
+ IF ${rc} == 0 RETURN ${java}
+ # There are bizzare test environment setups where the (correct) JAVA_HOME
+ # is set in the VM where Robot is running but not in the VM where the
+ # tools are supposed to run (usually because these two are really one
+ # and the same system and idiosyncracies of BASH prevent easy injection
+ # of the JAVA_HOME environment variable into a place where connections
+ # made by SSHLibrary would pick it up). So try to use that value to
+ # create a java command and check that it works.
+ ${JAVA_HOME} = OperatingSystem.Get_Environment_Variable JAVA_HOME ${EMPTY}
+ ${java} = BuiltIn.Set_Variable_If """${JAVA_HOME}"""!="" ${JAVA_HOME}/bin/java false
+ ${out} ${rc} = SSHLibrary.Execute_Command ${java} -version 2>&1 return_rc=True
+ IF ${rc} == 0 RETURN ${java}
+ # Nothing works, most likely java is not installed at all on the target
+ # machine or it is hopelesly lost. Bail out with a helpful message
+ # telling the user how to make it accessible for the script.
+ BuiltIn.Fail
+ ... Unable to find Java; specify \${JDKVERSION}, put it to your PATH or set JAVA_HOME environment variable.
+
+Compose_Full_Java_Command
+ [Documentation] Return full Bash command to run Java with given options.
+ ... This requires that the SSH connection on which the command is going to be used is active as it is needed for querying files.
+ ... The options may include JVM options, application command line arguments, Bash redirects and other constructs.
+ [Arguments] ${options} ${openjdk}=${JDKVERSION}
+ ${base_command} = Compose_Base_Java_Command openjdk=${openjdk}
+ ${full_command} = BuiltIn.Set_Variable ${base_command} ${options}
+ BuiltIn.Log ${full_command}
+ RETURN ${full_command}
+
+Compose_Java_Home
+ [Documentation] Compose base java command and strip trailing "/bin/java".
+ [Arguments] ${openjdk}=${JDKVERSION}
+ ${java_command} = Compose_Base_Java_Command
+ ${java_home} ${bin} ${java} = String.Split_String_From_Right
+ ... ${java_command}
+ ... separator=/
+ ... max_split=2
+ RETURN ${java_home}
+
+Install_Maven_Bare
+ [Documentation] Download and unpack Maven, prepare launch command with proper Java version and download settings file.
+ ... This Keyword requires an active SSH connection to target machine.
+ ... This Keyword sets global variables, so that suites can reuse existing installation.
+ ... This Keyword can only place Maven (and settings) to remote current working directory.
+ ... This Keyword does not perform any initial or final cleanup.
+ [Arguments] ${maven_version}=3.3.9 ${openjdk}=${JDKVERSION}
+ # Avoid multiple initialization by several downstream libraries.
+ ${installed_version} = BuiltIn.Get_Variable_Value \${Maven__installed_version} None
+ IF """${installed_version}""" == """${maven_version}""" RETURN
+ BuiltIn.Set_Global_Variable \${Maven__installed_version} ${maven_version}
+ BuiltIn.Set_Global_Variable \${maven_directory} apache-maven-${maven_version}
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass rm -rf '${maven_directory}'
+ ${maven_archive_filename} = BuiltIn.Set_Variable ${maven_directory}-bin.tar.gz
+ ${maven_download_url} = BuiltIn.Set_Variable
+ ... http://www-us.apache.org/dist/maven/maven-3/${maven_version}/binaries/${maven_archive_filename}
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass wget -N '${maven_download_url}' stderr_must_be_empty=False
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass tar xvf '${maven_archive_filename}'
+ ${java_home} = NexusKeywords.Compose_Java_Home openjdk=${openjdk}
+ BuiltIn.Set_Global_Variable
+ ... \${maven_bash_command}
+ ... export JAVA_HOME='${java_home}' && export MAVEN_OPTS='${JAVA_OPTIONS}' && ./${maven_directory}/bin/mvn
+ # TODO: Get settings files from Jenkins settings provider, somehow.
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass
+ ... wget '${MAVEN_SETTINGS_URL}' -O settings.xml
+ ... stderr_must_be_empty=False
+
+Install_Maven
+ [Documentation] Install Maven.
+ ... Depending on arguments, perform a multipatch build to populate local Maven repository with patched artifacts.
+ [Arguments] ${maven_version}=3.3.9 ${openjdk}=${JDKVERSION} ${branch}=${EMPTY} ${patches}=${EMPTY}
+ Install_Maven_Bare maven_version=${maven_version} openjdk=${openjdk}
+ IF """${patches}""" == "" RETURN No post-install build requested.
+ IF """${branch}""" == ""
+ BuiltIn.Fail BRANCH needs to be specified for multipatch builds.
+ END
+ ${script_name} = BuiltIn.Set_Variable include-raw-integration-multipatch-distribution-test.sh
+ ${script_url} = BuiltIn.Set_Variable
+ ... https://raw.githubusercontent.com/opendaylight/releng-builder/master/jjb/integration/${script_name}
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass wget -N '${script_url}' stderr_must_be_empty=False
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass
+ ... export WORKSPACE='${WORKSPACE}' && export BRANCH='${branch}' && export PATCHES_TO_BUILD='${patches}' && bash '${script_name}'
+ ... stderr_must_be_empty=False
+ Run_Maven pom_file=${WORKSPACE}/patch_tester/pom.xml
+
+Run_Maven
+ [Documentation] Determine arguments to use and call mvn command against given pom file.
+ [Arguments] ${pom_file}=pom.xml ${log_file}=${MAVEN_DEFAULT_OUTPUT_FILENAME}
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass mkdir -p '${MAVEN_REPOSITORY_PATH}'
+ ${maven_repository_options} = BuiltIn.Set_Variable
+ ... -Dmaven.repo.local=${MAVEN_REPOSITORY_PATH} -Dorg.ops4j.pax.url.mvn.localRepository=${MAVEN_REPOSITORY_PATH}
+ SSHKeywords.Execute_Command_At_Cwd_Should_Pass
+ ... ${maven_bash_command} clean install dependency:tree -V -B -DoutputFile=dependency_tree.log -s './settings.xml' -f '${pom_file}' ${MAVEN_OPTIONS} ${maven_repository_options} > '${log_file}'
+
+Get_ODL_Versions_From_Nexus
+ [Documentation] Returns name of last release found on nexus and list of all versions.
+ RequestsLibrary.Create_Session nexus ${NEXUS_RELEASES_URL} verify=${TRUE}
+ ${uri} = BuiltIn.Set_Variable maven-metadata.xml
+ ${response} = RequestsLibrary.GET On Session nexus url=${uri}
+ BuiltIn.Log ${response.text}
+ ${root} = XML.Parse_XML ${response.text}
+ ${element} = XML.Get_Element ${root} versioning/latest
+ ${latest} = BuiltIn.Set_Variable ${element.text}
+ BuiltIn.Log ${latest}
+ @{elements} = XML.Get_Elements ${root} .//version
+ ${versions} = BuiltIn.Create_List
+ FOR ${element} IN @{elements}
+ Collections.Append_To_List ${versions} ${element.text}
+ END
+ Collections.Sort_List ${versions}
+ BuiltIn.Log_Many @{versions}
+ RETURN ${latest} @{versions}
+
+Get_Latest_ODL_Release_From_Nexus
+ [Documentation] Returns name of last release found on nexus
+ ${latest} @{versions} = Get_ODL_Versions_From_Nexus
+ RETURN ${latest}
+
+Get_Latest_ODL_Stream_Release
+ [Documentation] Returns name for last release for specified stream.
+ [Arguments] ${stream}=latest
+ ${latest} @{versions} = Get_ODL_Versions_From_Nexus
+ IF '${stream}'=='latest' RETURN ${latest}
+ ${latest_version} = BuiltIn.Set_Variable xxx
+ FOR ${version} IN @{versions}
+ ${latest_version} = BuiltIn.Set_Variable_If
+ ... '${stream}'.title() in '${version}'
+ ... ${version}
+ ... ${latest_version}
+ END
+ IF '${latest_version}'=='xxx'
+ BuiltIn.Fail Could not find latest release for stream ${stream}
+ END
+ BuiltIn.Log ${latest_version}
+ RETURN ${latest_version}
+
+Get_Latest_ODL_Stream_Release_URL
+ [Documentation] Returns URL for last release for specified stream. Default format is .zip.
+ [Arguments] ${stream}=latest ${format}=.zip
+ ${latest_version} = Get_Latest_ODL_Stream_Release ${stream}
+ ${url} = BuiltIn.Set_Variable ${NEXUS_RELEASES_URL}/${latest_version}/karaf-${latest_version}${format}
+ BuiltIn.Log ${url}
+ RETURN ${url}
+
+Get_Latest_ODL_Previous_Stream_Release
+ [Documentation] Returns name for last release for previous stream of specified stream.
+ ... Note: If specified stream is not found on nexus, then it is taken as new one (not released yet).
+ ... So in this case, latest release version is return.
+ ...
+ ... NOTE: the below logic is stripping the initial 0. values from the 0.x.x version string that is
+ ... the current (and future) version numbering scheme. There is always a leading 0. to the version
+ ... strings and stripping it makes is easier to do int comparison to find the largest version in the
+ ... list. Comparing as strings does not work. There are some python libs like distutils.version
+ ... or packaging that can do a better job comparing versions, but since ODL version numbering is simple
+ ... at this point, this convention will suffice. The leading 0. will be added back after the the latest
+ ... version is found from the list. The CompareStream.robot library keeps a mapping of major version
+ ... numbers to the global variable ${ODL_STREAM} so that is used to ensure we get a major version that is
+ ... older than the current running major version.
+ [Arguments] ${stream}=${ODL_STREAM}
+ ${latest} @{versions} = Get_ODL_Versions_From_Nexus
+ ${current_version} = BuiltIn.Set_Variable ${Stream_dict}[${ODL_STREAM}].0
+ ${latest_version} = BuiltIn.Set_Variable 0.0
+ FOR ${version} IN @{versions}
+ ${version} = String.Replace String Using Regexp ${version} ^0\. ${EMPTY}
+ ${latest_version} = Set Variable If
+ ... ${version} > ${latest_version} and ${version} < ${current_version}
+ ... ${version}
+ ... ${latest_version}
+ END
+ ${latest_version} = Set Variable 0.${latest_version}
+ IF '${latest_version}'=='0.0.0'
+ BuiltIn.Fail Could not find latest previous release for stream ${stream}
+ END
+ BuiltIn.Log ${latest_version}
+ RETURN ${latest_version}
+
+Get_Latest_ODL_Previous_Stream_Release_URL
+ [Documentation] Returns URL for last release for previous stream of specified stream. Default format is .zip.
+ [Arguments] ${stream}=${ODL_STREAM} ${format}=.zip
+ ${latest_version} = Get_Latest_ODL_Previous_Stream_Release ${stream}
+ ${url} = BuiltIn.Set_Variable ${NEXUS_RELEASES_URL}/${latest_version}/karaf-${latest_version}${format}
+ BuiltIn.Log ${url}
+ RETURN ${url}