Add ovsdb test case for validating bug 7414
[integration/test.git] / csit / suites / ovsdb / Southbound_Domain / Bug_Validation.robot
index a5f09957e4668669973fedacc62fb20b05eee086..bda8292d7abf759b53cc3c777894e330c30c9f28 100644 (file)
@@ -1,27 +1,99 @@
 *** Settings ***
 Documentation     Collection of test cases to validate OVSDB projects bugs.
-...               - https://bugs.opendaylight.org/show_bug.cgi?id=5221
-...               - https://bugs.opendaylight.org/show_bug.cgi?id=5177
-...               - https://bugs.opendaylight.org/show_bug.cgi?id=4794
+...
+...               TODO: there seems to be some thoughts around never having one-off bug reproduction
+...               test cases, but rather they should exist as another test case in some appropriate
+...               suite. Also it was suggested that using bug ids for test case names was not ideal
+...               this to-do is written in case it's decided to refactor all of these test cases out
+...               of this suite and/or to rename the test cases at a later time.
 Suite Setup       OVSDB Connection Manager Suite Setup
 Suite Teardown    OVSDB Connection Manager Suite Teardown
-Test Setup        Log Testcase Start To Controller Karaf
+Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
 Force Tags        Southbound
 Library           OperatingSystem
 Library           String
 Library           RequestsLibrary
 Variables         ../../../variables/Variables.py
 Resource          ../../../libraries/Utils.robot
+Resource          ../../../libraries/SetupUtils.robot
 Resource          ../../../libraries/WaitForFailure.robot
 Resource          ../../../libraries/OVSDB.robot
 
 *** Variables ***
 ${OVSDB_PORT}     6634
-${BRIDGE}         ovsdb-csit-test-5177
+${BRIDGE}         ovsdb-csit-bug-validation
 ${SOUTHBOUND_CONFIG_API}    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2F${TOOLS_SYSTEM_IP}:${OVSDB_PORT}
 ${OVSDB_CONFIG_DIR}    ${CURDIR}/../../../variables/ovsdb
 
 *** Test Cases ***
+Bug 7414 Same Endpoint Name
+    [Documentation]    To help validate bug 7414, this test case will send a single rest request to create two
+    ...    ports (one for each of two OVS instances connected). The port names will be the same.
+    ...    If the bug happens, the request would be accepted, but internally the two creations are seen as the
+    ...    same and there is a conflict such that neither ovs will receive the port create.
+    [Tags]    7414
+    [Setup]    Run Keywords    Clean OVSDB Test Environment    ${TOOLS_SYSTEM_IP}
+    ...    AND    Clean OVSDB Test Environment    ${TOOLS_SYSTEM_2_IP}
+    # connect two ovs
+    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl set-manager tcp:${ODL_SYSTEM_IP}:6640
+    Run Command On Remote System    ${TOOLS_SYSTEM_2_IP}    sudo ovs-vsctl set-manager tcp:${ODL_SYSTEM_IP}:6640
+    Wait Until Keyword Succeeds    5s    1s    Verify OVS Reports Connected    ${TOOLS_SYSTEM_IP}
+    Wait Until Keyword Succeeds    5s    1s    Verify OVS Reports Connected    ${TOOLS_SYSTEM_2_IP}
+    # add brtest to both
+    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl add-br ${BRIDGE}
+    Run Command On Remote System    ${TOOLS_SYSTEM_2_IP}    sudo ovs-vsctl add-br ${BRIDGE}
+    # send one rest request to create a TP endpoint on each ovs (same name)
+    ${body}=    Modify Multi Port Body    vtep1    vtep1
+    ${resp}    RequestsLibrary.Put Request    session    ${CONFIG_TOPO_API}    data=${body}
+    Log    ${resp.content}
+    # check that each ovs has the correct endpoint
+    ${ovs_1_output}=    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl show
+    Log    ${ovs_1_output}
+    ${ovs_2_output}=    Run Command On Remote System    ${TOOLS_SYSTEM_2_IP}    sudo ovs-vsctl show
+    Log    ${ovs_2_output}
+    Should Contain    ${ovs_1_output}    local_ip="${TOOLS_SYSTEM_IP}", remote_ip="${TOOLS_SYSTEM_2_IP}"
+    Should Not Contain    ${ovs_1_output}    local_ip="${TOOLS_SYSTEM_2_IP}", remote_ip="${TOOLS_SYSTEM_IP}"
+    Should Contain    ${ovs_2_output}    local_ip="${TOOLS_SYSTEM_2_IP}", remote_ip="${TOOLS_SYSTEM_IP}"
+    Should Not Contain    ${ovs_2_output}    local_ip="${TOOLS_SYSTEM_IP}", remote_ip="${TOOLS_SYSTEM_2_IP}"
+    [Teardown]    Run Keywords    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}    data=${body}
+    ...    AND    Clean OVSDB Test Environment    ${TOOLS_SYSTEM_IP}
+    ...    AND    Clean OVSDB Test Environment    ${TOOLS_SYSTEM_2_IP}
+
+Bug 7414 Different Endpoint Name
+    [Documentation]    This test case is supplemental to the other test case for bug 7414. Even when the other
+    ...    test case would fail and no ovs would receive a port create because the port names are the same, this
+    ...    case should still be able to create ports on the ovs since the port names are different. However,
+    ...    another symptom of this bug is that multiple creations in the same request would end up creating
+    ...    all the ports on all of the ovs, which is incorrect. Both test cases check for this, but in the
+    ...    case where the other test case were to fail this would also help understand if this symptom is still
+    ...    happening
+    [Tags]    7414
+    [Setup]    Clean OVSDB Test Environment
+    # connect two ovs
+    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl set-manager tcp:${ODL_SYSTEM_IP}:6640
+    Run Command On Remote System    ${TOOLS_SYSTEM_2_IP}    sudo ovs-vsctl set-manager tcp:${ODL_SYSTEM_IP}:6640
+    Wait Until Keyword Succeeds    5s    1s    Verify OVS Reports Connected    ${TOOLS_SYSTEM_IP}
+    Wait Until Keyword Succeeds    5s    1s    Verify OVS Reports Connected    ${TOOLS_SYSTEM_2_IP}
+    # add brtest to both
+    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl add-br ${BRIDGE}
+    Run Command On Remote System    ${TOOLS_SYSTEM_2_IP}    sudo ovs-vsctl add-br ${BRIDGE}
+    # send one rest request to create a TP endpoint on each ovs (different name)
+    ${body}=    Modify Multi Port Body    vtep1    vtep2
+    ${resp}    RequestsLibrary.Put Request    session    ${CONFIG_TOPO_API}    data=${body}
+    Log    ${resp.content}
+    # check that each ovs has the correct endpoint
+    ${ovs_1_output}=    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl show
+    Log    ${ovs_1_output}
+    ${ovs_2_output}=    Run Command On Remote System    ${TOOLS_SYSTEM_2_IP}    sudo ovs-vsctl show
+    Log    ${ovs_2_output}
+    Should Contain    ${ovs_1_output}    local_ip="${TOOLS_SYSTEM_IP}", remote_ip="${TOOLS_SYSTEM_2_IP}"
+    Should Not Contain    ${ovs_1_output}    local_ip="${TOOLS_SYSTEM_2_IP}", remote_ip="${TOOLS_SYSTEM_IP}"
+    Should Contain    ${ovs_2_output}    local_ip="${TOOLS_SYSTEM_2_IP}", remote_ip="${TOOLS_SYSTEM_IP}"
+    Should Not Contain    ${ovs_2_output}    local_ip="${TOOLS_SYSTEM_IP}", remote_ip="${TOOLS_SYSTEM_2_IP}"
+    [Teardown]    Run Keywords    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}    data=${body}
+    ...    AND    Clean OVSDB Test Environment    ${TOOLS_SYSTEM_IP}
+    ...    AND    Clean OVSDB Test Environment    ${TOOLS_SYSTEM_2_IP}
+
 Bug 5221
     [Documentation]    In the case that an ovs node is rebooted, or the ovs service is
     ...    otherwise restarted, a controller initiated connection should reconnect when
@@ -40,6 +112,8 @@ Bug 5221
     # Depending on when the retry timers are firing, it may take some 10s of seconds to reconnect, so setting to 30 to cover that.
     Wait Until Keyword Succeeds    30s    2s    Check For Elements At URI    ${OPERATIONAL_TOPO_API}/topology/ovsdb:1    ${list}
     [Teardown]    Run Keywords    Clean OVSDB Test Environment
+    ...    AND    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2F${TOOLS_SYSTEM_IP}:6634%2Fbridge%2F${BRIDGE}
+    ...    AND    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2F${TOOLS_SYSTEM_IP}:6634
     ...    AND    Report_Failure_Due_To_Bug    5221
 
 Bug 5177
@@ -81,8 +155,50 @@ Bug 4794
     [Teardown]    Run Keywords    Clean OVSDB Test Environment
     ...    AND    Report_Failure_Due_To_Bug    4794
 
+Bug 7160
+    [Documentation]    If this bug is reproduced, it's possible that the operational store will be
+    ...    stuck with leftover nodes and further system tests could fail. It's advised to run this
+    ...    test last if possible. See the bug description for high level steps to reproduce
+    ...    https://bugs.opendaylight.org/show_bug.cgi?id=7160#c0
+    [Setup]    Run Keywords    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+    ...    AND    Clean OVSDB Test Environment
+    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl set-manager ptcp:${OVSDB_PORT}
+    Connect Controller To OVSDB Node
+    ${QOS}=    Set Variable    QOS-1
+    ${QUEUE}=    Set Variable    QUEUE-1
+    ${sample}    OperatingSystem.Get File    ${OVSDB_CONFIG_DIR}/create_node.json
+    ${sample1}    Replace String    ${sample}    127.0.0.1    ${TOOLS_SYSTEM_IP}
+    ${body}    Replace String    ${sample1}    61644    ${OVSDB_PORT}
+    ${resp}    RequestsLibrary.Post Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1    data=${body}
+    Log Config And Operational Topology
+    ${body}    OperatingSystem.Get File    ${OVSDB_CONFIG_DIR}/create_qos.json
+    ${resp}    RequestsLibrary.Put Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1/ovsdb:qos-entries/${QOS}/    data=${body}
+    Log Config And Operational Topology
+    ${body}    OperatingSystem.Get File    ${OVSDB_CONFIG_DIR}/create_queue.json
+    ${resp}    RequestsLibrary.Put Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1/ovsdb:queues/${QUEUE}/    data=${body}
+    Log Config And Operational Topology
+    ${body}    OperatingSystem.Get File    ${OVSDB_CONFIG_DIR}/bug_7160/create_qoslinkedqueue.json
+    ${resp}    RequestsLibrary.Put Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1    data=${body}
+    Log Config And Operational Topology
+    ${resp}    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1/ovsdb:qos-entries/${QOS}/queue-list/0/
+    Log Config And Operational Topology
+    ${resp}    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1/ovsdb:qos-entries/${QOS}/
+    Log Config And Operational Topology
+    ${resp}    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1/ovsdb:queues/${QUEUE}/
+    Log Config And Operational Topology
+    ${resp}    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:HOST1
+    Log Config And Operational Topology
+    Run Command On Remote System    ${TOOLS_SYSTEM_IP}    sudo ovs-vsctl del-manager
+    ${node}    Set Variable    ovsdb:%2F%2F${TOOLS_SYSTEM_IP}:${OVSDB_PORT}
+    RequestsLibrary.Delete Request    session    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/${node}
+    Log Config And Operational Topology
+    Wait Until Keyword Succeeds    5s    1s    Config and Operational Topology Should Be Empty
+    [Teardown]    Run Keywords    Clean OVSDB Test Environment
+    ...    AND    Report_Failure_Due_To_Bug    7160
+
 *** Keywords ***
 OVSDB Connection Manager Suite Setup
+    SetupUtils.Setup_Utils_For_Setup_And_Teardown
     Open Controller Karaf Console On Background
     Create Session    session    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}    headers=${HEADERS}
     Clean OVSDB Test Environment    ${TOOLS_SYSTEM_IP}
@@ -133,3 +249,35 @@ Connect Controller To OVSDB Node
     Log    ${resp.content}
     Should Contain    ${ALLOWED_STATUS_CODES}    ${resp.status_code}
     Wait Until Keyword Succeeds    5s    1s    Verify OVS Reports Connected
+
+Log Config And Operational Topology
+    [Documentation]    For debugging purposes, this will log both config and operational topo data stores
+    ${resp}    RequestsLibrary.Get Request    session    ${CONFIG_TOPO_API}
+    Log    ${resp.content}
+    ${resp}    RequestsLibrary.Get Request    session    ${OPERATIONAL_TOPO_API}
+    Log    ${resp.content}
+
+Config and Operational Topology Should Be Empty
+    [Documentation]    This will check that only the expected output is there for both operational and config
+    ...    topology data stores. Empty probably means that only ovsdb:1 is there.
+    ${config_resp}    RequestsLibrary.Get Request    session    ${CONFIG_TOPO_API}
+    ${operational_resp}    RequestsLibrary.Get Request    session    ${OPERATIONAL_TOPO_API}
+    Should Contain    ${config_resp.content}    {"topology-id":"ovsdb:1"}
+    Should Contain    ${operational_resp.content}    {"topology-id":"ovsdb:1"}
+
+Modify Multi Port Body
+    [Arguments]    ${ovs_1_port_name}    ${ovs_2_port_name}
+    [Documentation]    these steps are needed multiple times in bug reproductions above.
+    ${body}    OperatingSystem.Get File    ${OVSDB_CONFIG_DIR}/bug_7414/create_multiple_ports.json
+    ${ovs_1_ovsdb_uuid}=    Get OVSDB UUID    ${TOOLS_SYSTEM_IP}
+    ${ovs_2_ovsdb_uuid}=    Get OVSDB UUID    ${TOOLS_SYSTEM_2_IP}
+    ${body}    Replace String    ${body}    OVS_1_UUID    ${ovs_1_ovsdb_uuid}
+    ${body}    Replace String    ${body}    OVS_2_UUID    ${ovs_2_ovsdb_uuid}
+    ${body}    Replace String    ${body}    OVS_1_BRIDGE_NAME    ${BRIDGE}
+    ${body}    Replace String    ${body}    OVS_2_BRIDGE_NAME    ${BRIDGE}
+    ${body}    Replace String    ${body}    OVS_1_IP    ${TOOLS_SYSTEM_IP}
+    ${body}    Replace String    ${body}    OVS_2_IP    ${TOOLS_SYSTEM_2_IP}
+    ${body}    Replace String    ${body}    OVS_1_PORT_NAME    ${ovs_1_port_name}
+    ${body}    Replace String    ${body}    OVS_2_PORT_NAME    ${ovs_2_port_name}
+    Log    ${body}
+    [Return]    ${body}