Ovsdb Southbound 3 node Clustering Csit 75/29975/44
authorpriya.ramasubbu <priya.ramasubbu@hcl.com>
Fri, 20 Nov 2015 16:18:20 +0000 (21:48 +0530)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 12 Dec 2015 18:04:44 +0000 (18:04 +0000)
    * Create bridge in config datastore
    * Retrieve bridge in operational datastore

Change-Id: Ibfedea32e3af59d0ac96d1f84e9910f4699201a8
Signed-off-by: priya.ramasubbu <priya.ramasubbu@hcl.com>
csit/libraries/ClusterOvsdb.robot [new file with mode: 0644]
csit/suites/ovsdb/Southbound_Cluster/010__Ovsdb_Southbound_Cluster.robot [new file with mode: 0644]
csit/testplans/ovsdb-clustering.txt [new file with mode: 0644]
csit/variables/Variables.py
csit/variables/ovsdb/create_bridge_3node.json [new file with mode: 0644]

diff --git a/csit/libraries/ClusterOvsdb.robot b/csit/libraries/ClusterOvsdb.robot
new file mode 100644 (file)
index 0000000..d6a6ce7
--- /dev/null
@@ -0,0 +1,121 @@
+*** Settings ***
+Documentation     Cluster Ovsdb library. So far this library is only to be used by Ovsdb cluster test as it is very specific for this test.
+Library           RequestsLibrary
+Resource          ClusterKeywords.robot
+Resource          MininetKeywords.robot
+Resource          Utils.robot
+Variables         ../variables/Variables.py
+
+*** Keywords ***
+Check Ovsdb Shards Status
+    [Arguments]    ${controller_index_list}
+    [Documentation]    Check Status for all shards in Ovsdb application.
+    ${topo_conf_leader}    ${topo_conf_followers_list}    Wait Until Keyword Succeeds    10s    1s    Get Cluster Shard Status    ${controller_index_list}
+    ...    config    topology
+    ${topo_oper_leader}    ${topo_oper_followers_list}    Wait Until Keyword Succeeds    10s    1s    Get Cluster Shard Status    ${controller_index_list}
+    ...    operational    topology
+    Log    config topology Leader is ${topo_conf_leader} and followers are ${topo_conf_followers_list}
+    Log    operational topology Leader is ${topo_oper_leader} and followers are ${topo_oper_followers_list}
+
+Get Ovsdb Entity Owner Status For One Device
+    [Arguments]    ${controller_index_list}
+    [Documentation]    Check Entity Owner Status and identify owner and candidate.
+    ${owner}    ${candidates_list}    Wait Until Keyword Succeeds    10s    1s    Get Cluster Entity Owner For Ovsdb    ${controller_index_list}
+    ...    ovsdb    ovsdb:1
+    [Return]    ${owner}    ${candidates_list}
+
+Get Cluster Entity Owner For Ovsdb
+    [Arguments]    ${controller_index_list}    ${device_type}    ${device}
+    [Documentation]    Checks Entity Owner status for a ${device} and returns owner index and list of candidates from a ${controller_index_list}.
+    ...    ${device_type} is openflow, ovsdb, etc...
+    ${length}=    Get Length    ${controller_index_list}
+    ${candidates_list}=    Create List
+    ${data}=    Get Data From URI    controller@{controller_index_list}[0]    /restconf/operational/entity-owners:entity-owners
+    Log    ${data}
+    ${data}=    Replace String    ${data}    /network-topology:network-topology/network-topology:topology[network-topology:topology-id='    ${EMPTY}
+    ${data}=    Replace String    ${data}    /network-topology:node[network-topology:node-id='ovsdb://uuid/a96ec4e2-c457-4a2c-963c-1e6300210032    ${EMPTY}
+    ${clear_data}=    Replace String    ${data}    ']    ${EMPTY}
+    Log    ${clear_data}
+    ${json}=    To Json    ${clear_data}
+    ${entity_type_list}=    Get From Dictionary    &{json}[entity-owners]    entity-type
+    ${entity_type_index}=    Get Index From List Of Dictionaries    ${entity_type_list}    type    ${device_type}
+    Should Not Be Equal    ${entity_type_index}    -1    No Entity Owner found for ${device_type}
+    ${entity_list}=    Get From Dictionary    @{entity_type_list}[${entity_type_index}]    entity
+    ${entity_index}=    Get Index From List Of Dictionaries    ${entity_list}    id    ${device}
+    Should Not Be Equal    ${entity_index}    -1    Device ${device} not found in Entity Owner ${device_type}
+    ${entity_owner}=    Get From Dictionary    @{entity_list}[${entity_index}]    owner
+    Should Not Be Empty    ${entity_owner}    No owner found for ${device}
+    ${owner}=    Replace String    ${entity_owner}    member-    ${EMPTY}
+    ${owner}=    Convert To Integer    ${owner}
+    List Should Contain Value    ${controller_index_list}    ${owner}    Owner ${owner} not exisiting in ${controller_index_list}
+    ${entity_candidates_list}=    Get From Dictionary    @{entity_list}[${entity_index}]    candidate
+    ${list_length}=    Get Length    ${entity_candidates_list}
+    : FOR    ${entity_candidate}    IN    @{entity_candidates_list}
+    \    ${candidate}=    Replace String    &{entity_candidate}[name]    member-    ${EMPTY}
+    \    ${candidate}=    Convert To Integer    ${candidate}
+    \    List Should Contain Value    ${controller_index_list}    ${candidate}    Candidate ${candidate} not exisiting in ${controller_index_list}
+    \    Run Keyword If    '${candidate}' != '${owner}'    Append To List    ${candidates_list}    ${candidate}
+    [Return]    ${owner}    ${candidates_list}
+
+Create Bridge And Verify
+    [Arguments]    ${controller_index_list}    ${controller_index}
+    [Documentation]    Create bridge in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.
+    ${sample}=    OperatingSystem.Get File    ${CURDIR}/../variables/ovsdb/create_bridge_3node.json
+    Log    ${sample}
+    ${sample1}    Replace String    ${sample}    tcp:controller1:6633    tcp:${ODL_SYSTEM_1_IP}:6640
+    Log    ${sample1}
+    ${sample2}    Replace String    ${sample1}    tcp:controller2:6633    tcp:${ODL_SYSTEM_2_IP}:6640
+    Log    ${sample2}
+    ${sample3}    Replace String    ${sample2}    tcp:controller3:6633    tcp:${ODL_SYSTEM_3_IP}:6640
+    Log    ${sample3}
+    ${sample4}    Replace String    ${sample3}    127.0.0.1    ${MININET}
+    Log    ${sample4}
+    ${sample5}    Replace String    ${sample4}    br01    ${BRIDGE}
+    Log    ${sample5}
+    ${body}    Replace String    ${sample5}    61644    ${OVSDB_PORT}
+    Log    ${body}
+    ${dictionary}=    Create Dictionary    ${MININET}=1    ${OVSDBPORT}=4    ${BRIDGE}=1
+    Put And Check At URI In Cluster Ovsdb    ${controller_index_list}    ${controller_index}    ${SOUTHBOUND_CONFIG_API}%2Fbridge%2F${BRIDGE}    ${body}    ${HEADERS}
+    Wait Until Keyword Succeeds    5s    1s    Check Item Occurrence At URI In Cluster    ${controller_index_list}    ${dictionary}    ${OPERATIONAL_TOPO_API}
+
+Put And Check At URI In Cluster Ovsdb
+    [Arguments]    ${controller_index_list}    ${controller_index}    ${uri}    ${body}    ${headers}=${HEADERS}
+    [Documentation]    Send a PUT with the supplied ${uri} and ${body} to a ${controller_index}
+    ...    and check the data is replicated in all instances in ${controller_index_list}.
+    ${expected_body}=    To Json    ${body}
+    ${resp}    RequestsLibrary.Put Request    controller${controller_index}    ${uri}    ${body}    ${headers}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    : FOR    ${i}    IN    @{controller_index_list}
+    \    ${data}    Wait Until Keyword Succeeds    5s    1s    Get Data From URI    controller${i}
+    \    ...    ${uri}    ${headers}
+    \    Log    ${data}
+    \    ${received_body}    To Json    ${data}
+    \    Check Expected And Received Body    ${expected_body}    ${received_body}
+
+Check Expected And Received Body
+    [Arguments]    ${expected_body}    ${received_body}
+    [Documentation]    Checks whether the expected data and the actual received data are equal.
+    Log    ${expected_body}
+    Log    ${received_body}
+    ${content1}    Get From Dictionary    ${expected_body}    node
+    Log    ${content1}
+    ${node1}    Get From List    ${content1}    0
+    Log    ${node1}
+    ${expected_bridge_name}    Get From Dictionary    ${node1}    ovsdb:bridge-name
+    Log    ${expected_bridge_name}
+    ${expected_target_ips}    Get From Dictionary    ${node1}    ovsdb:controller-entry
+    Log    ${expected_target_ips}
+    Sort List    ${expected_target_ips}
+    Log    ${expected_target_ips}
+    ${content2}    Get From Dictionary    ${received_body}    node
+    Log    ${content2}
+    ${node2}    Get From List    ${content2}    0
+    Log    ${node2}
+    ${received_bridge_name}    Get From Dictionary    ${node2}    ovsdb:bridge-name
+    Log    ${received_bridge_name}
+    ${received_target_ips}    Get From Dictionary    ${node2}    ovsdb:controller-entry
+    Log    ${received_target_ips}
+    Sort List    ${received_target_ips}
+    Log    ${received_target_ips}
+    Should Be Equal As Strings    ${received_bridge_name}    ${expected_bridge_name}
+    Lists Should be Equal    ${received_target_ips}    ${expected_target_ips}
diff --git a/csit/suites/ovsdb/Southbound_Cluster/010__Ovsdb_Southbound_Cluster.robot b/csit/suites/ovsdb/Southbound_Cluster/010__Ovsdb_Southbound_Cluster.robot
new file mode 100644 (file)
index 0000000..a7d903f
--- /dev/null
@@ -0,0 +1,41 @@
+*** Settings ***
+Documentation     Test suite for Ovsdb Southbound Cluster
+Suite Setup       Create Controller Sessions
+Suite Teardown    Delete All Sessions
+Library           RequestsLibrary
+Resource          ../../../libraries/ClusterOvsdb.robot
+Resource          ../../../libraries/ClusterKeywords.robot
+Resource          ../../../libraries/MininetKeywords.robot
+Variables         ../../../variables/Variables.py
+
+*** Variables ***
+${SOUTHBOUND_CONFIG_API}    ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2F${MININET}:${OVSDBPORT}
+${OVSDB_CONFIG_DIR}    ${CURDIR}/../../../variables/ovsdb
+${BRIDGE}         br01
+
+*** Test Cases ***
+Create Original Cluster List
+    [Documentation]    Create original cluster list.
+    ${original_cluster_list}    Create Controller Index List
+    Set Suite Variable    ${original_cluster_list}
+    Log    ${original_cluster_list}
+
+Check Shards Status Before Fail
+    [Documentation]    Check Status for all shards in Ovsdb application.
+    Check Ovsdb Shards Status    ${original_cluster_list}
+
+Start Mininet Multiple Connections
+    [Documentation]    Start mininet with connection to all cluster instances.
+    ${mininet_conn_id}    Add Multiple Managers to OVS    ${TOOLS_SYSTEM_IP}    ${original_cluster_list}
+    Set Suite Variable    ${mininet_conn_id}
+
+Check Entity Owner Status And Find Owner and Candidate Before Fail
+    [Documentation]    Check Entity Owner Status and identify owner and candidate.
+    ${original_owner}    ${original_candidates_list}    Get Ovsdb Entity Owner Status For One Device    ${original_cluster_list}
+    ${original_candidate}=    Get From List    ${original_candidates_list}    0
+    Set Suite Variable    ${original_owner}
+    Set Suite Variable    ${original_candidate}
+
+Create Bridge In Owner and Verify Before Fail
+    [Documentation]    Create Bridge in Owner and verify it gets applied from all instances.
+    Create Bridge And Verify    ${original_cluster_list}    ${original_owner}
diff --git a/csit/testplans/ovsdb-clustering.txt b/csit/testplans/ovsdb-clustering.txt
new file mode 100644 (file)
index 0000000..7b46bb6
--- /dev/null
@@ -0,0 +1,3 @@
+# Place the suites in run order:
+integration/test/csit/suites/ovsdb/Southbound_Cluster
+
index f3bf705bae03079b9843c3e8931828e0b82a6508..9b3f6593aba9001aae778bf634bafe429999041d 100644 (file)
@@ -152,6 +152,7 @@ LFM_SB_RPC_API = "/restconf/operations/odl-lisp-sb"
 PORT = '8080'
 RESTPORT = '8282'
 RESTCONFPORT = '8181'
+OVSDBPORT = '6640'
 CONTAINER = 'default'
 PREFIX = 'http://' + ODL_SYSTEM_IP + ':' + PORT  # TODO: determine where this is used; create a better named variable
 USER = 'admin'  # TODO: who is using this?  Can we make it more specific? (e.g.  RESTCONF_USER)
diff --git a/csit/variables/ovsdb/create_bridge_3node.json b/csit/variables/ovsdb/create_bridge_3node.json
new file mode 100644 (file)
index 0000000..3e86f6d
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "node": [
+        {
+            "node-id": "ovsdb://127.0.0.1:61644/bridge/br01",
+            "ovsdb:bridge-name": "br01",
+            "ovsdb:protocol-entry": [
+                {
+                    "protocol": "ovsdb:ovsdb-bridge-protocol-openflow-13"
+                }
+            ],
+            "ovsdb:controller-entry": [
+                {
+                    "target": "tcp:controller1:6633"
+                },
+                {
+                    "target": "tcp:controller2:6633"
+                },
+                {
+                    "target": "tcp:controller3:6633"
+                }
+            ],
+            "ovsdb:bridge-other-configs": [
+                {
+                    "bridge-other-config-key": "datapath-id",
+                    "bridge-other-config-value": "0000000000000001"
+                }
+            ],
+            "ovsdb:managed-by": "/network-topology:network-topology/network-topology:topology[network-topology:topology-id='ovsdb:1']/network-topology:node[network-topology:node-id='ovsdb://127.0.0.1:61644']"
+        }
+    ]
+}