... When the Keywords assume a SSH session is active,
... and if the Keywords do not fit into a more specific Resource,
... you can place them here.
-...
-... TODO: Migrate Keywords related to handling SSH here.
-... That may include Utils.Flexible_SSH_Login, and similar.
Library SSHLibrary
Resource ${CURDIR}/Utils.robot
Resource ../variables/Variables.robot
*** Variables ***
${SSHKeywords__current_remote_working_directory} .
${SSHKeywords__current_venv_path} /tmp/defaultvenv
+${NETSTAT_COMMAND} netstat -punta
*** Keywords ***
Open_Connection_To_ODL_System
[Arguments] ${ip_address}=${ODL_SYSTEM_IP} ${timeout}=10s
[Documentation] Open a connection to the ODL system at ${ip_address} and return its identifier.
${odl_connection} = SSHLibrary.Open_Connection ${ip_address} prompt=${ODL_SYSTEM_PROMPT} timeout=${timeout}
- Utils.Flexible_Controller_Login
+ Flexible_Controller_Login
[Return] ${odl_connection}
Open_Connection_To_Tools_System
- [Arguments] ${ip_address}=${TOOLS_SYSTEM_IP} ${timeout}=10s
+ [Arguments] ${ip_address}=${TOOLS_SYSTEM_IP} ${timeout}=10s ${prompt}=${TOOLS_SYSTEM_PROMPT}
[Documentation] Open a connection to the tools system at ${ip_address} and return its identifier.
- ${tools_connection} = SSHLibrary.Open_Connection ${ip_address} prompt=${TOOLS_SYSTEM_PROMPT} timeout=${timeout}
- Utils.Flexible_Mininet_Login
+ ${tools_connection} = SSHLibrary.Open_Connection ${ip_address} prompt=${prompt} timeout=${timeout}
+ Flexible_Mininet_Login
[Return] ${tools_connection}
Restore_Current_Ssh_Connection_From_Index
# Resource name has to be prepended, as KarafKeywords still contains a redirect.
[Teardown] SSHKeywords.Restore_Current_SSH_Connection_From_Index ${current_connection.index}
+Run_Keyword_With_Ssh
+ [Arguments] ${ip_address} ${keyword_name} @{args} &{kwargs}
+ [Documentation] Open temporary connection to given IP address, run keyword, close connection, restore previously active connection, return result.
+ Run_Keyword_Preserve_Connection Run_Unsafely_Keyword_Over_Temporary_Odl_Session ${ip_address} ${keyword_name} @{args} &{kwargs}
+
+Run_Unsafely_Keyword_Over_Temporary_Odl_Session
+ [Arguments] ${ip_address} ${keyword_name} @{args} &{kwargs}
+ [Documentation] Open connection to given IP address, run keyword, close connection, return result.
+ ... This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.
+ Open_Connection_To_ODL_System ${ip_address}
+ # Not using Teardown, to avoid a call to close if the previous line fails.
+ ${status} ${result} = BuiltIn.Run_Keyword_And_Ignore_Error ${keyword_name} @{args} &{kwargs}
+ SSHLibrary.Close_Connection
+ BuiltIn.Return_From_Keyword_If "${status}" == "PASS" ${result}
+ BuiltIn.Fail ${result}
+
Log_Command_Results
[Arguments] ${stdout} ${stderr} ${rc}
[Documentation] Log everything returned by SSHLibrary.Execute_Command
Count_Port_Occurences
[Arguments] ${port} ${state} ${name}
[Documentation] Run 'netstat' on the remote machine and count occurences of given port in the given state connected to process with the given name.
- ${output} = SSHLibrary.Execute_Command netstat -natp 2> /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l
+ ${output} = SSHLibrary.Execute_Command ${NETSTAT_COMMAND} 2> /dev/null | grep -E ":${port} .+ ${state} .+${name}" | wc -l
[Return] ${output}
Virtual_Env_Set_Path
BuiltIn.Set_Global_Variable \${SSHKeywords__current_venv_path} ${venv_path}
Virtual_Env_Create
+ [Arguments] ${upgrade_pip}=True
[Documentation] Creates virtual env. If not to use the default name, use Virtual_Env_Set_Path kw. Returns stdout.
Execute_Command_At_Cwd_Should_Pass virtualenv ${SSHKeywords__current_venv_path}
- BuiltIn.Run_Keyword_And_Return Virtual_Env_Run_Cmd_At_Cwd pip install --upgrade pip
+ BuiltIn.Run_Keyword_And_Return_If ${upgrade_pip} Virtual_Env_Run_Cmd_At_Cwd pip install --upgrade pip
Virtual_Env_Delete
[Documentation] Deletes a directory with virtual env.
[Documentation] Copy the ${source} file to the ${destination} file on the remote ${system}. The keyword opens and closes a single
... ssh connection and does not rely on any existing ssh connection that may be open.
SSHLibrary.Open_Connection ${system} prompt=${prompt} timeout=${prompt_timeout}
- Utils.Flexible_SSH_Login ${user} ${password}
+ Flexible_SSH_Login ${user} ${password}
SSHLibrary.Put_File ${source} ${destination}
SSHLibrary.Close Connection
[Arguments] ${system} ${source} ${destination}=./
[Documentation] Wrapper keyword to make it easier to copy a file to an Tools specific system
SSHKeywords.Copy_File_To_Remote_System ${system} ${source} ${destination} ${TOOLS_SYSTEM_USER} ${TOOLS_SYSTEM_PASSWORD} ${TOOLS_SYSTEM_PROMPT}
+
+Flexible_SSH_Login
+ [Arguments] ${user} ${password}=${EMPTY} ${delay}=0.5s
+ [Documentation] On active SSH session: if given non-empty password, do Login, else do Login With Public Key.
+ ${pwd_length} = BuiltIn.Get Length ${password}
+ # ${pwd_length} is guaranteed to be an integer, so we are safe to evaluate it as Python expression.
+ BuiltIn.Run Keyword And Return If ${pwd_length} > 0 SSHLibrary.Login ${user} ${password} delay=${delay}
+ BuiltIn.Run Keyword And Return SSHLibrary.Login With Public Key ${user} ${USER_HOME}/.ssh/${SSH_KEY} ${KEYFILE_PASS} delay=${delay}
+
+Flexible_Mininet_Login
+ [Arguments] ${user}=${TOOLS_SYSTEM_USER} ${password}=${TOOLS_SYSTEM_PASSWORD} ${delay}=0.5s
+ [Documentation] Call Flexible SSH Login, but with default values suitable for Mininet machine.
+ BuiltIn.Run Keyword And Return Flexible SSH Login user=${user} password=${password} delay=${delay}
+
+Flexible_Controller_Login
+ [Arguments] ${user}=${ODL_SYSTEM_USER} ${password}=${ODL_SYSTEM_PASSWORD} ${delay}=0.5s
+ [Documentation] Call Flexible SSH Login, but with default values suitable for Controller machine.
+ BuiltIn.Run Keyword And Return Flexible SSH Login user=${user} password=${password} delay=${delay}
+
+Move_File_To_Remote_System
+ [Arguments] ${system} ${source} ${destination}=./ ${user}=${DEFAULT_USER} ${password}=${DEFAULT_PASSWORD} ${prompt}=${DEFAULT_LINUX_PROMPT}
+ ... ${prompt_timeout}=5s
+ [Documentation] Moves the ${source} file to the ${destination} file on the remote ${system}. Any pre-existing active
+ ... ssh connection will be retained.
+ SSHKeywords.Run_Keyword_Preserve_Connection Unsafe_Move_File_To_Remote_System ${system} ${source} ${destination} ${user} ${password}
+ ... ${prompt} ${prompt_timeout}
+
+Unsafe_Move_File_To_Remote_System
+ [Arguments] ${system} ${source} ${destination}=./ ${user}=${DEFAULT_USER} ${password}=${DEFAULT_PASSWORD} ${prompt}=${DEFAULT_LINUX_PROMPT}
+ ... ${prompt_timeout}=5s
+ [Documentation] Moves the ${source} file to the ${destination} file on the remote ${system}. The keyword opens and closes a single
+ ... ssh connection and does not rely on any existing ssh connection that may be open.
+ SSHLibrary.Open_Connection ${system} prompt=${prompt} timeout=${prompt_timeout}
+ Flexible_SSH_Login ${user} ${password}
+ SSHLibrary.Put File ${source} ${destination}
+ OperatingSystem.Remove File ${source}
+ SSHLibrary.Close Connection