Added "survival after connection cycle check" testcases
[integration/test.git] / csit / suites / netconf / MDSAL / northbound.robot
index 23b83675f19f2088ea3c70fa38b42f2b6905e86d..cc96256647d65baa77d3551f15b4d21c43445596 100644 (file)
@@ -6,6 +6,21 @@ Documentation     Metconf MDSAL Northbound test suite.
 ...               This program and the accompanying materials are made available under the
 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
+...
+...
+...               The request produced by test cases "Get Config Running", "Get Config Running
+...               To Confirm No_Edit Before Commit", "Get Config Running To Confirm Delete
+...               After Commit" and "Get Config Candidate To Confirm Discard" all use the same
+...               message id ("empty") for their requests. This is possible because the
+...               requests produced by this suite are strictly serialized. The RFC 6241 does
+...               not state that these IDs are unique, it only requires that each ID used is
+...               "XML attribute normalized" if the client wants it to be returned unmodified.
+...               The RFC specifically says that "the content of this attribute is not
+...               interpreted in any way, it only is stored to be returned with the reply to
+...               the request. The reuse of the "empty" string for the 4 test cases was chosen
+...               for simplicity.
+...
+...               TODO: Change the 4 testcases to use unique message IDs.
 Suite Setup       Setup_Everything
 Suite Teardown    Teardown_Everything
 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Fast_Failing
@@ -14,23 +29,24 @@ Library           RequestsLibrary
 Library           SSHLibrary
 Resource          ${CURDIR}/../../../libraries/FailFast.robot
 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
+Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
 Resource          ${CURDIR}/../../../libraries/Utils.robot
 Variables         ${CURDIR}/../../../variables/Variables.py
 
 *** Variables ***
 ${datadir}        ${CURDIR}/../../../variables/netconf/MDSAL
 ${dataext}        msg
+${ssh_netconf_pid}    -1
 
 *** Test Cases ***
 Connect_To_ODL_Netconf
     [Documentation]    Connect to ODL Netconf and fail if that is not possible.
+    Create_ODL_Netconf_Connection
     Open_ODL_Netconf_Connection
-    ${hello_message}=    Get_Data    hello
-    Transmit_Message    ${hello_message}
 
 Get_Config_Running
     [Documentation]    Make sure the configuration has only the default elements in it.
-    Perform_Test    get-config
+    Check_Test_Objects_Not_Present_In_Config    get-config
 
 Missing_Message_ID_Attribute
     [Documentation]    Check that messages with missing "message-ID" attribute are rejected with the correct error (RFC 6241, section 4.1).
@@ -51,7 +67,7 @@ Edit_Config_Modules_Merge
 
 Get_Config_Running_To_Confirm_No_Edit_Before_Commit
     [Documentation]    Make sure the running configuration is still unchanged as the change was not commited yet.
-    Perform_Test    get-config-no-edit-before-commit
+    Check_Test_Objects_Not_Present_In_Config    get-config-no-edit-before-commit
 
 Commit_Edit
     [Documentation]    Commit the change and check the reply.
@@ -67,6 +83,29 @@ name0_In_Config_Modules_Via_Restconf
     ${data}=    Utils.Get_Data_From_URI    config    config:modules    headers=${ACCEPT_XML}
     BuiltIn.Should_Contain    ${data}    <name>name0</name>
 
+Terminate_Connection_Gracefully
+    [Documentation]    Close the session and disconnect.
+    Close_ODL_Netconf_Connection_Gracefully
+
+name0_In_Config_Modules_Via_Restconf_After_Disconnect
+    [Documentation]    Check that the change is still visible through Restconf after Netconf disconnect.
+    ${data}=    Utils.Get_Data_From_URI    config    config:modules    headers=${ACCEPT_XML}
+    BuiltIn.Should_Contain    ${data}    <name>name0</name>
+
+Reconnect_To_ODL_Netconf_After_Graceful_Session_End
+    [Documentation]    Reconnect to ODL Netconf and fail if that is not possible.
+    Open_ODL_Netconf_Connection
+
+name0_In_Config_Running_After_Reconnect
+    [Documentation]    Check that the change is now in the configuration.
+    ${reply}=    Load_And_Send_Message    get-config-edit-after-commit
+    BuiltIn.Should_Contain    ${reply}    <name>name0</name>
+
+name0_In_Config_Modules_Via_Restconf_After_Reconnect
+    [Documentation]    Check that the change is still visible through Restconf after Netconf reconnect.
+    ${data}=    Utils.Get_Data_From_URI    config    config:modules    headers=${ACCEPT_XML}
+    BuiltIn.Should_Contain    ${data}    <name>name0</name>
+
 Edit_Config_Modules_Create_Shall_Fail_Now
     [Documentation]    Request a "create" operation of an element that already exists and check that it fails with the correct error (RFC 6241, section 7.2, operation "create").
     Perform_Test    config-modules-create
@@ -86,7 +125,7 @@ Commit_Delete
 
 Get_Config_Running_To_Confirm_Delete_After_Commit
     [Documentation]    Check that the element is gone.
-    Perform_Test    get-config-delete-after-commit
+    Check_Test_Objects_Not_Present_In_Config    get-config-delete-after-commit
 
 Restconf_Get_Modules_Shall_Return_404
     [Documentation]    Check that "Not Found" is returned when Restconf is asked for the deleted element.
@@ -97,23 +136,23 @@ Commit_No_Transaction
     [Documentation]    Attempt to perform "commit" when there are no changes in the candidate configuration and check that it fails with the correct error.
     Test_Commit_With_No_Transactions
 
-Edit_Config_Another_Modules_Merge
-    [Documentation]    Create the element in the candidate configuration again and check the reply.
+Edit_Config_Another_Modules_Merge_For_Discard
+    [Documentation]    Create an element to be discarded and check the reply.
     Perform_Test    config-modules-merge-2
 
-Get_Config_Candidate
-    [Documentation]    Check that the element is present in the candidate configuration.
+Get_And_Check_Config_Candidate_For_Discard
+    [Documentation]    Check that the element to be discarded is present in the candidate configuration.
     ${reply}=    Load_And_Send_Message    get-config-candidate
     BuiltIn.Should_Contain    ${reply}    <name>name1</name>
     BuiltIn.Should_Not_Contain    ${reply}    name0
 
-Discard_Changes
+Discard_Changes_Using_Discard_Request
     [Documentation]    Ask the server to discard the candidate and check the reply.
     Perform_Test    commit-discard
 
-Get_Config_Candidate_To_Confirm_Discard
+Get_And_Check_Config_Candidate_To_Confirm_Discard
     [Documentation]    Check that the element was really discarded.
-    Perform_Test    get-config-candidate-discard
+    Check_Test_Objects_Not_Present_In_Config    get-config-candidate-discard
 
 Edit_Config_Modules_Multiple_Modules_Merge_1
     [Documentation]    Create the element with "name2" subelement again and check the reply.
@@ -145,6 +184,28 @@ name2_name3_name4_In_Config_Modules_Via_Restconf
     BuiltIn.Should_Contain    ${data}    <name>name3</name>
     BuiltIn.Should_Contain    ${data}    <name>name4</name>
 
+Abort_Connection_To_Simulate_Session_Failure
+    [Documentation]    Simulate session failure by disconnecting without terminating the session.
+    Abort_ODL_Netconf_Connection
+
+name2_name3_name4_In_Config_Modules_Via_Restconf_After_Session_Fail
+    [Documentation]    Check that the 3 subelements are visible via Restconf.
+    ${data}=    Utils.Get_Data_From_URI    config    config:modules    headers=${ACCEPT_XML}
+    BuiltIn.Should_Contain    ${data}    <name>name2</name>
+    BuiltIn.Should_Contain    ${data}    <name>name3</name>
+    BuiltIn.Should_Contain    ${data}    <name>name4</name>
+
+Reconnect_To_ODL_Netconf_After_Session_Failure
+    [Documentation]    Reconnect to ODL Netconf and fail if that is not possible.
+    Open_ODL_Netconf_Connection
+
+name2_name3_name4_In_Running_Config_After_Session_Failure
+    [Documentation]    Check that the 3 subelements are now present in the running configuration.
+    ${reply}=    Load_And_Send_Message    merge-multiple-check
+    BuiltIn.Should_Contain    ${reply}    <name>name2</name>
+    BuiltIn.Should_Contain    ${reply}    <name>name3</name>
+    BuiltIn.Should_Contain    ${reply}    <name>name4</name>
+
 Edit_Multiple_Modules_Merge
     [Documentation]    Add another subelement named "test" to the element and check the reply.
     Perform_Test    merge-multiple-edit
@@ -230,7 +291,7 @@ Get_Data
     ${data}=    OperatingSystem.Get_File    ${datadir}${/}${name}.${dataext}
     [Return]    ${data}
 
-Open_ODL_Netconf_Connection
+Create_ODL_Netconf_Connection
     [Arguments]    ${host}=${CONTROLLER}    ${port}=${ODL_NETCONF_PORT}    ${user}=${ODL_NETCONF_USER}    ${password}=${ODL_NETCONF_PASSWORD}
     [Documentation]    Open a netconf connecion to the given machine.
     # The "-s netconf" flag (see the "SSHLibrary.Write" line below)    is not
@@ -240,10 +301,37 @@ Open_ODL_Netconf_Connection
     #    going to need to use this operation (Netconf Performance and Scaling
     #    comes to my mind now as one of the things tested is the performance
     #    of the direct netconf connection.
-    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=10s
+    # TODO: Make this keyword return a dictionary object with all the
+    #    data about the prepared connection neatly packaged. Make all
+    #    the other keywords handling the connection accept such an
+    #    object and pull the data out of it rather than relying on
+    #    global variables. This will allow for tracking more Netconf
+    #    connections, increasing utility.
+    ${control}=    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=10s
+    Utils.Flexible_Controller_Login
+    BuiltIn.Set_Suite_Variable    ${ssh_control}    ${control}
+    ${netconf}=    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=10s
     Utils.Flexible_Controller_Login
-    SSHLibrary.Write    sshpass -p ${password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${user}\@127.0.0.1 -p ${port} -s netconf
+    BuiltIn.Set_Suite_Variable    ${ssh_netconf}    ${netconf}
+    BuiltIn.Set_Suite_Variable    ${ssh_port}    ${port}
+    BuiltIn.Set_Suite_Variable    ${ssh_user}    ${user}
+    BuiltIn.Set_Suite_Variable    ${ssh_password}    ${password}
+
+Reopen_ODL_Netconf_Connection
+    [Documentation]    Reopen a closed netconf connection.
+    SSHLibrary.Write    sshpass -p ${ssh_password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${ssh_user}\@127.0.0.1 -p ${ssh_port} -s netconf
     ${hello}=    SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
+    SSHLibrary.Switch_Connection    ${ssh_control}
+    ${pid}=    SSHLibrary.Execute_Command    ps -A | grep sshpass | cut -b 1-6
+    BuiltIn.Set_Suite_Variable    ${ssh_netconf_pid}    ${pid}
+    SSHLibrary.Switch_Connection    ${ssh_netconf}
+    [Return]    ${hello}
+
+Open_ODL_Netconf_Connection
+    [Documentation]    Open a prepared netconf connecion.
+    ${hello}=    Reopen_ODL_Netconf_Connection
+    ${hello_message}=    Get_Data    hello
+    Transmit_Message    ${hello_message}
     [Return]    ${hello}
 
 Transmit_Message
@@ -284,11 +372,21 @@ Load_Expected_Reply
     ${expected}=    Prepare_For_Search    ${expected_reply}
     [Return]    ${expected}
 
-Close_ODL_Netconf_Connection
+Abort_ODL_Netconf_Connection
     [Documentation]    Correctly close the Netconf connection and make sure it is really dead.
-    Utils.Write_Bare_Ctrl_D
+    BuiltIn.Return_From_Keyword_If    ${ssh_netconf_pid} == -1
+    ${kill_command}=    BuiltIn.Set_Variable    kill ${ssh_netconf_pid}
+    BuiltIn.Set_Suite_Variable    ${ssh_netconf_pid}    -1
+    SSHLibrary.Switch_Connection    ${ssh_control}
+    SSHLibrary.Write    ${kill_command}
+    SSHLibrary.Read_Until_Prompt
+    SSHLibrary.Switch_Connection    ${ssh_netconf}
     SSHLibrary.Read_Until_Prompt
 
+Close_ODL_Netconf_Connection_Gracefully
+    Perform_Test    close-session
+    Abort_ODL_Netconf_Connection
+
 Setup_Everything
     [Documentation]    Setup resources and create session for Restconf checking.
     SetupUtils.Setup_Utils_For_Setup_And_Teardown
@@ -296,9 +394,19 @@ Setup_Everything
 
 Teardown_Everything
     [Documentation]    Close the Netconf connection and destroy all sessions in the requests library.
-    Close_ODL_Netconf_Connection
+    Abort_ODL_Netconf_Connection
     RequestsLibrary.Delete_All_Sessions
 
+Check_Test_Objects_Not_Present_In_Config
+    [Arguments]    ${name}
+    [Documentation]    Use dataset with the specified name to get the configuration and check that none of our test objects are there.
+    ${reply}=    Load_And_Send_Message    ${name}
+    BuiltIn.Should_Not_Contain    ${reply}    <name>name0</name>
+    BuiltIn.Should_Not_Contain    ${reply}    <name>name1</name>
+    BuiltIn.Should_Not_Contain    ${reply}    <name>name2</name>
+    BuiltIn.Should_Not_Contain    ${reply}    <name>name3</name>
+    BuiltIn.Should_Not_Contain    ${reply}    <name>name4</name>
+
 Perform_Test
     [Arguments]    ${name}
     [Documentation]    Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.
@@ -308,6 +416,11 @@ Perform_Test
     BuiltIn.Should_Be_Equal    ${actual}    ${newline}${expected}${ODL_NETCONF_PROMPT}
     [Return]    ${actual}
 
+Send_And_Check
+    [Arguments]    ${name}    ${expected}
+    ${actual}=    Load_And_Send_Message    ${name}
+    BuiltIn.Should_Be_Equal    ${actual}    ${expected}
+
 Test_Commit_With_No_Transactions
     [Documentation]    Issue a "commit" RPC request and check that it fails with "No current transactions" error.
     ${reply}=    Load_And_Send_Message    commit-no-transaction