X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=csit%2Flibraries%2FUtils.robot;h=e653ae431e303e60eaf732de71aacfb32da4201e;hb=fe6babdf0e67ed9836bd7254fd3f945f3d4f06d7;hp=9acdba054c7fa4c17f034a111d81192df7e7e1c8;hpb=d63cae74873f3c47a1a093ffa132ed88037e1968;p=integration%2Ftest.git diff --git a/csit/libraries/Utils.robot b/csit/libraries/Utils.robot index 9acdba054c..e653ae431e 100644 --- a/csit/libraries/Utils.robot +++ b/csit/libraries/Utils.robot @@ -8,6 +8,7 @@ Library Collections Library RequestsLibrary Library ./UtilLibrary.py Resource KarafKeywords.robot +Resource TemplatedRequests.robot Variables ../variables/Variables.py *** Variables *** @@ -232,12 +233,14 @@ Run Command On Remote System [Documentation] Reduces the common work of running a command on a remote system to a single higher level ... robot keyword, taking care to log in with a public key and. The command given is written ... and the output returned. No test conditions are checked. - Log Attempting to execute ${cmd} on ${system} by ${user} with ${keyfile_pass} and ${prompt} + ${current_ssh_connection}= SSHLibrary.Get Connection + Log Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" ${conn_id}= SSHLibrary.Open Connection ${system} prompt=${prompt} timeout=${prompt_timeout} Flexible SSH Login ${user} ${password} ${stdout} ${stderr} SSHLibrary.Execute Command ${cmd} return_stderr=True SSHLibrary.Close Connection Log ${stderr} + [Teardown] KarafKeywords.Restore_Current_SSH_Connection_From_Index ${current_ssh_connection.index} [Return] ${stdout} Write_Bare_Ctrl_C @@ -313,20 +316,21 @@ Concatenate the String [Return] ${output} Post Elements To URI - [Arguments] ${rest_uri} ${data} ${headers}=${headers} + [Arguments] ${rest_uri} ${data} ${headers}=${headers} ${session}=session [Documentation] Perform a POST rest operation, using the URL and data provided - ${resp} = RequestsLibrary.Post Request session ${rest_uri} data=${data} headers=${headers} - Should Be Equal As Strings ${resp.status_code} 200 + ${resp} = RequestsLibrary.Post Request ${session} ${rest_uri} data=${data} headers=${headers} + Log ${resp.content} + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Remove All Elements At URI [Arguments] ${uri} ${resp} RequestsLibrary.Delete Request session ${uri} - Should Be Equal As Strings ${resp.status_code} 200 + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Remove All Elements At URI And Verify [Arguments] ${uri} ${resp} RequestsLibrary.Delete Request session ${uri} - Should Be Equal As Strings ${resp.status_code} 200 + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} ${resp} RequestsLibrary.Get Request session ${uri} Should Be Equal As Strings ${resp.status_code} 404 @@ -334,20 +338,20 @@ Add Elements To URI From File [Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${body} OperatingSystem.Get File ${data_file} ${resp} RequestsLibrary.Put Request session ${dest_uri} data=${body} headers=${headers} - Should Be Equal As Strings ${resp.status_code} 200 + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Add Elements To URI From File And Verify [Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${body} OperatingSystem.Get File ${data_file} ${resp} RequestsLibrary.Put Request session ${dest_uri} data=${body} headers=${headers} - Should Be Equal As Strings ${resp.status_code} 200 + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} ${resp} RequestsLibrary.Get Request session ${dest_uri} Should Not Be Equal ${resp.status_code} 404 Add Elements To URI And Verify [Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${resp} RequestsLibrary.Put Request session ${dest_uri} ${data_file} headers=${headers} - Should Be Equal As Strings ${resp.status_code} 200 + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} ${resp} RequestsLibrary.Get Request session ${dest_uri} Should Not Be Equal ${resp.status_code} 404 @@ -355,7 +359,7 @@ Post Elements To URI From File [Arguments] ${dest_uri} ${data_file} ${headers}=${headers} ${body} OperatingSystem.Get File ${data_file} ${resp} RequestsLibrary.Post Request session ${dest_uri} data=${body} headers=${headers} - Should Be Equal As Strings ${resp.status_code} 200 + Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Run Process With Logging And Status Check [Arguments] @{proc_args} @@ -395,7 +399,7 @@ Get Index From List Of Dictionaries ${index}= Set Variable -1 : FOR ${i} IN RANGE ${length} \ ${dictionary}= Get From List ${dictionary_list} ${i} - \ Run Keyword If '&{dictionary}[${key}]' == '${value}' Set Test Variable ${index} ${i} + \ Run Keyword If """&{dictionary}[${key}]""" == """${value}""" Set Test Variable ${index} ${i} [Return] ${index} Check Item Occurrence @@ -427,12 +431,15 @@ Set_User_Configurable_Variable_Default [Documentation] Set a default value for an user configurable variable. ... This keyword is needed if your default value is calculated using ... a complex expression which needs BuiltIn.Evaluate or even more - ... complex keywords. It sets the variable ${name} to ${value} but - ... only if the variable ${name} was not set previously. This keyword - ... is intended for user configurable variables which are supposed to - ... be set only with pybot -v; calling this keyword on a variable - ... that was already set by another keyword is a bug in the suite or - ... resource trying to call this keyword. + ... complex keywords. It sets the variable ${name} (the name of the + ... variable MUST be specified WITHOUT the ${} syntactic sugar due + ... to limitations of Robot Framework) to ${value} but only if the + ... variable ${name} was not set previously. This keyword is intended + ... for user configurable variables which are supposed to be set only + ... with pybot -v; calling this keyword on a variable that was already + ... set by another keyword will silently turn the call into a NOP and + ... thus is a bug in the suite or resource trying to call this + ... keyword. # TODO: Figure out how to make the ${value} evaluation "lazy" (meaning # evaluating it only when the user did not set anything and thus the # default is needed). This might be needed to avoid potentially costly @@ -441,5 +448,56 @@ Set_User_Configurable_Variable_Default # comments the best approach would be to create another keyword that # expects a ScalarClosure in the place of ${value} and calls the # closure to get the value but only if the value is needed). + # The best idea how to implement this "laziness" would be to have the + # used to define another keyword that will be responsible for getting + # the default value and then passing the name of this getter keyword + # to this keyword. Then this keyword would call the getter (to obtain + # the expensive default value) only if it discovers that this value + # is really needed (because the variable is not set yet). + # TODO: Is the above TODO really necessary? Right now we don't have any + # examples of "expensive default values" where to obtain the default + # value is so expensive on resources (e.g. need to SSH somewhere to + # check something) that we would want to skip the calculation if the + # variable for which it is needed has a value already provided by the + # user using "pybot -v" or something. One example would be + # JAVA_HOME if it would be designed as user-configurable variable + # (currently it is not; users can specify "use jdk7" or "use jdk8" + # but not "use the jdk over there"; and there actually is no JAVA_HOME + # present in the resource, rather the Java invocation command uses the + # Java invocation with a full path). The default value of JAVA_HOME + # has to be obtained by issuing commands on the SSH connection where + # the resulting Java invocation command will be used (to check + # multiple candidate paths until one that fits is found) and we could + # skip all this checking if a JAVA_HOME was supplied by the user using + # "pybot -v". ${value}= BuiltIn.Get_Variable_Value \${${name}} ${value} BuiltIn.Set_Suite_Variable \${${name}} ${value} + +Convert_To_Minutes + [Arguments] ${time} + [Documentation] Convert a Robot time string to an integer expressing the time in minutes, rounded up + ... This is a wrapper around DateTime.Convert_Time which does not + ... provide this functionality directly nor is even able to produce + ... an integer directly. It is needed for RestPerfClient which + ... cannot accept floats for its --timeout parameter and interprets + ... the value supplied in this parameter in minutes. + ${seconds}= DateTime.Convert_Time ${time} result_format=number + ${minutes}= BuiltIn.Evaluate int(math.ceil(${seconds}/60.0)) modules=math + [Return] ${minutes} + +Write Commands Until Expected Prompt + [Arguments] ${cmd} ${prompt} ${timeout}=30s + [Documentation] quick wrapper for Write and Read Until Prompt Keywords to make test cases more readable + SSHLibrary.Set Client Configuration timeout=${timeout} + SSHLibrary.Write ${cmd} + ${output}= SSHLibrary.Read Until ${prompt} + [Return] ${output} + +Install Package On Ubuntu System + [Arguments] ${package_name} ${system}=${TOOLS_SYSTEM_IP} ${user}=${TOOLS_SYSTEM_USER} ${password}=${TOOLS_SYSTEM_PASSWORD} ${prompt}=${DEFAULT_LINUX_PROMPT} ${prompt_timeout}=30s + [Documentation] Keyword to install packages for testing to Ubuntu Mininet VM + Log Keyword to install package to Mininet Ubuntu VM + Open Connection ${system} prompt=${prompt} timeout=${prompt_timeout} + Flexible Mininet Login user=${user} password=${password} + Write sudo apt-get install -y ${package_name} + Read Until ${prompt}