From: priya.ramasubbu Date: Fri, 20 Nov 2015 16:18:20 +0000 (+0530) Subject: Ovsdb Southbound 3 node Clustering Csit X-Git-Tag: release/beryllium-sr1~258 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=integration%2Ftest.git;a=commitdiff_plain;h=0b43a2b7b6932bc47259a23d15edfe743acaaee0 Ovsdb Southbound 3 node Clustering Csit * Create bridge in config datastore * Retrieve bridge in operational datastore Change-Id: Ibfedea32e3af59d0ac96d1f84e9910f4699201a8 Signed-off-by: priya.ramasubbu --- diff --git a/csit/libraries/ClusterOvsdb.robot b/csit/libraries/ClusterOvsdb.robot new file mode 100644 index 0000000000..d6a6ce737d --- /dev/null +++ b/csit/libraries/ClusterOvsdb.robot @@ -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 index 0000000000..a7d903fa04 --- /dev/null +++ b/csit/suites/ovsdb/Southbound_Cluster/010__Ovsdb_Southbound_Cluster.robot @@ -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 index 0000000000..7b46bb6110 --- /dev/null +++ b/csit/testplans/ovsdb-clustering.txt @@ -0,0 +1,3 @@ +# Place the suites in run order: +integration/test/csit/suites/ovsdb/Southbound_Cluster + diff --git a/csit/variables/Variables.py b/csit/variables/Variables.py index f3bf705bae..9b3f6593ab 100644 --- a/csit/variables/Variables.py +++ b/csit/variables/Variables.py @@ -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 index 0000000000..3e86f6d2bc --- /dev/null +++ b/csit/variables/ovsdb/create_bridge_3node.json @@ -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']" + } + ] +}