*** 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 ClusterManagement.robot
Resource MininetKeywords.robot
Resource Utils.robot
+Resource OVSDB.robot
Variables ../variables/Variables.py
+*** Variables ***
+@{SHARD_OPER_LIST} topology default entity-ownership
+@{SHARD_CONF_LIST} topology default
+${BRIDGE} br01
+${OVSDB_CONFIG_DIR} ${CURDIR}/../variables/ovsdb
+
*** Keywords ***
Check Ovsdb Shards Status
- [Arguments] ${controller_index_list}
+ [Arguments] ${controller_index_list}=${EMPTY}
[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}
+ ClusterManagement.Verify_Leader_Exists_For_Each_Shard shard_name_list=${SHARD_OPER_LIST} shard_type=operational member_index_list=${controller_index_list}
+ ClusterManagement.Verify_Leader_Exists_For_Each_Shard shard_name_list=${SHARD_CONF_LIST} shard_type=config member_index_list=${controller_index_list}
+
+Check Ovsdb Shards Status After Cluster Event
+ [Arguments] ${controller_index_list}=${EMPTY}
+ [Documentation] Check Shard Status after some cluster event.
+ Wait Until Keyword Succeeds 90s 1s Check Ovsdb Shards Status ${controller_index_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}
- # the UUID will not always be the same so need to use regexp to remove this string
- ${data}= Replace String Using Regexp ${data} \/network-topology:node\\[network-topology:node-id='ovsdb://uuid/........-....-....-....-............ ${EMPTY}
- Log ${data}
- ${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}
+ [Arguments] ${device} ${controller_index} ${controller_index_list}=${EMPTY}
+ [Documentation] Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.
+ ${owner} ${successor_list} Wait Until Keyword Succeeds 20s 1s ClusterManagement.Verify_Owner_And_Successors_For_Device device_name=${device}
+ ... device_type=ovsdb member_index=${controller_index} candidate_list=${controller_index_list}
+ [Return] ${owner} ${successor_list}
+
+Create Sample Bridge Manually And Verify
+ [Arguments] ${ovs_system_ip}=${TOOLS_SYSTEM_IP} ${controller_index_list}=${EMPTY}
+ [Documentation] Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.
+ Utils.Run Command On Mininet ${ovs_system_ip} sudo ovs-vsctl add-br br-s1
+ ${dictionary_operational}= Create Dictionary br-s1=5
+ ${dictionary_config}= Create Dictionary br-s1=0
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${CONFIG_TOPO_API} dictionary=${dictionary_config} member_index_list=${controller_index_list}
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary_operational} member_index_list=${controller_index_list}
+
+Add Sample Port To The Manual Bridge And Verify
+ [Arguments] ${ovs_system_ip}=${TOOLS_SYSTEM_IP} ${controller_index_list}=${EMPTY}
+ [Documentation] Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.
+ Utils.Run Command On Mininet ${ovs_system_ip} sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan
+ ${dictionary_operational}= Create Dictionary vx1=2
+ ${dictionary_config}= Create Dictionary vx1=0
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${CONFIG_TOPO_API} dictionary=${dictionary_config} member_index_list=${controller_index_list}
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary_operational} member_index_list=${controller_index_list}
+
+Create Sample Tap Device
+ [Arguments] ${ovs_system_ip}=${TOOLS_SYSTEM_IP}
+ [Documentation] Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.
+ Utils.Run Command On Mininet ${ovs_system_ip} ip tuntap add mode tap vport1
+ Utils.Run Command On Mininet ${ovs_system_ip} ip tuntap add mode tap vport2
+ Utils.Run Command On Mininet ${ovs_system_ip} ifconfig vport1 up
+ Utils.Run Command On Mininet ${ovs_system_ip} ifconfig vport2 up
+
+Add Sample Tap Device To The Manual Bridge And Verify
+ [Arguments] ${ovs_system_ip}=${TOOLS_SYSTEM_IP} ${controller_index_list}=${EMPTY}
+ [Documentation] Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.
+ Utils.Run Command On Mininet ${ovs_system_ip} sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2
+ ${dictionary_operational}= Create Dictionary vport1=2 vport2=2
+ ${dictionary_config}= Create Dictionary vport1=0 vport2=0
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${CONFIG_TOPO_API} dictionary=${dictionary_config} member_index_list=${controller_index_list}
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary_operational} member_index_list=${controller_index_list}
+
+Delete Sample Bridge Manually And Verify
+ [Arguments] ${ovs_system_ip}=${TOOLS_SYSTEM_IP} ${controller_index_list}=${EMPTY}
+ [Documentation] Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.
+ Utils.Run Command On Mininet ${ovs_system_ip} sudo ovs-vsctl del-br br-s1
+ ${dictionary}= Create Dictionary br-s1=0
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary} member_index_list=${controller_index_list}
+
+Create Sample Bridge And Verify
+ [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
+ [Documentation] Create bridge ${BRIDGE} in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.
+ ${body}= OperatingSystem.Get File ${CURDIR}/../variables/ovsdb/create_bridge_3node.json
+ ${body} Replace String ${body} ovsdb://127.0.0.1:61644 ovsdb://uuid/${ovsdb_uuid}
+ ${body} Replace String ${body} tcp:controller1:6633 tcp:${ODL_SYSTEM_1_IP}:6633
+ ${body} Replace String ${body} tcp:controller2:6633 tcp:${ODL_SYSTEM_2_IP}:6633
+ ${body} Replace String ${body} tcp:controller3:6633 tcp:${ODL_SYSTEM_3_IP}:6633
+ ${body} Replace String ${body} 127.0.0.1 ${TOOLS_SYSTEM_IP}
+ ${body} Replace String ${body} br01 ${BRIDGE}
+ ${body} Replace String ${body} 61644 ${OVSDB_PORT}
Log ${body}
- ${dictionary}= Create Dictionary ${MININET}=1 ${OVSDBPORT}=4 ${BRIDGE}=1
- Put And Check At URI In Cluster ${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}
+ ${TOOLS_SYSTEM_IP1} Replace String ${TOOLS_SYSTEM_IP} ${TOOLS_SYSTEM_IP} "${TOOLS_SYSTEM_IP}"
+ ${dictionary}= Create Dictionary ${TOOLS_SYSTEM_IP1}=1 ${OVSDBPORT}=4 ${BRIDGE}=1
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Put_As_Json_And_Check_Member_List_Or_All ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE} ${body} ${controller_index}
+ ... ${controller_index_list}
+ Wait Until Keyword Succeeds 10s 2s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid} dictionary=${dictionary} member_index_list=${controller_index_list}
+
+Create Sample Port And Verify
+ [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
+ [Documentation] Add Port vx2 to bridge ${BRIDGE} in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.
+ ${sample} OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_port_3node.json
+ ${body} Replace String ${sample} 192.168.1.10 ${TOOLS_SYSTEM_IP}
+ Log ${body}
+ Log URL is ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}/termination-point/vx2/
+ ${port_dictionary}= Create Dictionary ${BRIDGE}=1 vx2=3
+ ClusterManagement.Put_As_Json_And_Check_Member_List_Or_All ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}/termination-point/vx2/ ${body} ${controller_index} ${controller_index_list}
+ Wait Until Keyword Succeeds 10s 2s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}/termination-point/vx2/ dictionary=${port_dictionary} member_index_list=${controller_index_list}
+
+Modify the destination IP of Sample Port
+ [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
+ [Documentation] Modify the dst ip of port vx2 in bridge ${BRIDGE} in controller ${controller_index}.
+ ${sample} OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_port_3node.json
+ ${body} Replace String ${sample} 192.168.1.10 10.0.0.19
+ Log URL is ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}/termination-point/vx2/
+ Log ${body}
+ ClusterManagement.Put_As_Json_And_Check_Member_List_Or_All ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}/termination-point/vx2/ ${body} ${controller_index} ${controller_index_list}
+
+Verify Sample Port Is Modified
+ [Arguments] ${controller_index_list}=${EMPTY}
+ [Documentation] Verify dst ip of port vx2 in bridge ${BRIDGE} gets modified in all instances in ${controller_index_list}.
+ ${port_dictionary} Create Dictionary br01=6 vx2=3 10.0.0.19=1
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE} dictionary=${port_dictionary} member_index_list=${controller_index_list}
+
+Delete Sample Port And Verify
+ [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
+ [Documentation] Delete port vx2 from bridge ${BRIDGE} in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.
+ ${dictionary}= Create Dictionary vx2=0
+ ClusterManagement.Delete_And_Check_Member_List_Or_All ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}/termination-point/vx2/ ${controller_index} ${controller_index_list}
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid} dictionary=${dictionary} member_index_list=${controller_index_list}
+
+Delete Sample Bridge And Verify
+ [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
+ [Documentation] Delete bridge ${BRIDGE} in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.
+ ${dictionary}= Create Dictionary ${BRIDGE}=0
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Delete_And_Check_Member_List_Or_All ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE} ${controller_index} ${controller_index_list}
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2Fuuid%2F${ovsdb_uuid} dictionary=${dictionary} member_index_list=${controller_index_list}
+
+Configure Exit OVSDB Connection
+ [Arguments] ${controller_index_list}=${EMPTY}
+ [Documentation] Cleans up test environment, close existing sessions.
+ OVSDB.Clean OVSDB Test Environment ${TOOLS_SYSTEM_IP}
+ ${dictionary}= Create Dictionary ovsdb://uuid=0
+ Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary} member_index_list=${controller_index_list}