[VOL-3712] Automatic reconnect of timed out ssh conection to onos

Change-Id: I4f5b84745a5fb3791a70ea02fea3647f71309ca9
diff --git a/libraries/onos.robot b/libraries/onos.robot
index bd9e671..a1542a4 100755
--- a/libraries/onos.robot
+++ b/libraries/onos.robot
@@ -24,6 +24,9 @@
 Library           OperatingSystem
 Resource          ./flows.robot
 
+*** Variables ***
+@{connection_list}
+
 *** Keywords ***
 
 Open ONOS SSH Connection
@@ -31,25 +34,60 @@
     [Arguments]    ${host}    ${port}    ${user}=karaf    ${pass}=karaf
     ${conn_id}=    SSHLibrary.Open Connection    ${host}    port=${port}    timeout=300s    alias=ONOS_SSH
     SSHLibrary.Login    ${user}    ${pass}
-    [Return]    ${conn_id}
+    ${conn_list_entry}=    Create Dictionary    conn_id=${conn_id}    user=${user}    pass=${pass}
+    Append To List    ${connection_list}    ${conn_list_entry}
+    ${conn_list_id}=    Get Index From List    ${connection_list}    ${conn_list_entry}
+    Set Global Variable    ${connection_list}
+    [Return]    ${conn_list_id}
 
 Execute ONOS CLI Command on open connection
     [Documentation]    Execute ONOS CLI Command On an Open Connection
-    [Arguments]    ${connection_alias}  ${cmd}
-    SSHLibrary.Switch Connection   ${connection_alias}
-    @{result_values}    SSHLibrary.Execute Command    ${cmd}    return_rc=True
-    ...    return_stderr=True    return_stdout=True
+    [Arguments]    ${connection_list_id}  ${cmd}
+    ${connection_entry}=    Get From List   ${connection_list}    ${connection_list_id}
+    SSHLibrary.Switch Connection   ${connection_entry.conn_id}
+    ${PassOrFail}    @{result_values}    Run Keyword And Ignore Error    SSHLibrary.Execute Command    ${cmd}
+    ...    return_rc=True    return_stderr=True    return_stdout=True
+    Run Keyword If    '${PassOrFail}'=='FAIL'    Reconnect ONOS SSH Connection    ${connection_list_id}
+    @{result_values}=    Run Keyword If    '${PassOrFail}'=='FAIL'
+    ...    SSHLibrary.Execute Command    ${cmd}    return_rc=True    return_stderr=True    return_stdout=True
+    ...    ELSE    Set Variable    @{result_values}
     ${output}    Set Variable    @{result_values}[0]
     Log    Command output: ${output}
     Should Be Empty    @{result_values}[1]
     Should Be Equal As Integers    @{result_values}[2]    0
     [Return]    ${output}
 
+Reconnect ONOS SSH Connection
+    [Documentation]    Reconnect an SSH Connection
+    [Arguments]    ${connection_list_id}
+    ${connection_entry}=    Get From List   ${connection_list}    ${connection_list_id}
+    ${user}=    Get From Dictionary    ${connection_entry}    user
+    ${pass}=    Get From Dictionary    ${connection_entry}    pass
+    ${oldconndata}=    Get Connection    ${connection_entry.conn_id}
+    SSHLibrary.Switch Connection   ${connection_entry.conn_id}
+    SSHLibrary.Close Connection
+    ${conn_id}=    SSHLibrary.Open Connection    ${oldconndata.host}    port=${oldconndata.port}
+    ...    timeout=300s    alias=ONOS_SSH
+    SSHLibrary.Login    ${user}    ${pass}
+    ${conn_list_entry}=    Create Dictionary    conn_id=${conn_id}    user=${user}    pass=${pass}
+    Set List Value    ${connection_list}    ${connection_list_id}    ${conn_list_entry}
+    Set Global Variable    ${connection_list}
+
 Close ONOS SSH Connection
     [Documentation]    Close an SSH Connection
-    [Arguments]    ${connection_alias}
+    [Arguments]    ${connection_list_id}
+    ${connection_entry}=    Get From List   ${connection_list}    ${connection_list_id}
+    ${connection_alias}=    Get From Dictionary    ${connection_entry}    conn_id
+    ${oldconndata}=    Get Connection    ${connection_entry.conn_id}
     SSHLibrary.Switch Connection   ${connection_alias}
     SSHLibrary.Close Connection
+    Remove From List    ${connection_list}    ${connection_list_id}
+    Set Global Variable    ${connection_list}
+
+Close All ONOS SSH Connections
+    [Documentation]    Close all SSH Connection and clear connection list.
+    SSHLibrary.Close All Connections
+    @{connection_list}    Create List
 
 Validate OLT Device in ONOS
     #    FIXME use volt-olts to check that the OLT is ONOS
@@ -528,8 +566,8 @@
 
 Wait for all flows to in ADDED state
     [Documentation]  Waits until the flows have been provisioned
-    [Arguments]  ${onos_ssh_connection}     ${deviceId}     ${workflow}    ${uni_count}    ${olt_count}    ${provisioned}
-    ...     ${withEapol}    ${withDhcp}     ${withIgmp}     ${withLldp}
+    [Arguments]  ${onos_ssh_connection}     ${deviceId}     ${workflow}    ${uni_count}    ${olt_count}
+    ...    ${provisioned}     ${withEapol}    ${withDhcp}     ${withIgmp}     ${withLldp}
     ${targetFlows}=     Calculate flows by workflow     ${workflow}    ${uni_count}    ${olt_count}     ${provisioned}
     ...     ${withEapol}    ${withDhcp}     ${withIgmp}     ${withLldp}
     Wait Until Keyword Succeeds     10m     5s      Count ADDED flows