X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=csit%2Flibraries%2FOVSDB.robot;h=5c24845d77a52d24f11a3cb0da86c4076f67c8f4;hb=5e0db03559ff014b9edcf705995e0c862fe363ca;hp=71e407c4d3ae61563896a714e1f779fa4154e5e0;hpb=7567de9b71b833e8c00f948d81df179fabb53865;p=integration%2Ftest.git diff --git a/csit/libraries/OVSDB.robot b/csit/libraries/OVSDB.robot index 71e407c4d3..5c24845d77 100644 --- a/csit/libraries/OVSDB.robot +++ b/csit/libraries/OVSDB.robot @@ -1,67 +1,591 @@ *** Settings *** -Library SSHLibrary -Resource Utils.robot -Library String -Library Collections -Variables ../variables/Variables.py -Library RequestsLibrary +Library Collections +Library ipaddress +Library OperatingSystem +Library RequestsLibrary +Library SSHLibrary +Library String +Resource ClusterManagement.robot +Resource Utils.robot +Resource ${CURDIR}/TemplatedRequests.robot +Resource ../variables/Variables.robot +Resource ../variables/ovsdb/Variables.robot + *** Variables *** -${OVSDB_CONFIG_DIR} ../variables/ovsdb -${SOUTHBOUND_CONFIG_API} ${CONFIG_TOPO_API}/topology/ovsdb:1/node/ovsdb:%2F%2F +${OVSDB_CONFIG_DIR} ${CURDIR}/../variables/ovsdb +${INTEGRATION_BRIDGE} br-int +${INTERNAL_TUNNEL_TABLE} 36 +${L3_TABLE} 21 +${DEFAULT_PING_COUNT} 3 + *** Keywords *** +Log Request + [Arguments] ${resp_content} + IF '''${resp_content}''' != '${EMPTY}' + ${resp_json} = RequestsLibrary.To Json ${resp_content} pretty_print=True + ELSE + ${resp_json} = BuiltIn.Set Variable ${EMPTY} + END + BuiltIn.Log ${resp_json} + RETURN ${resp_json} + +Create OVSDB Node + [Arguments] ${node_ip} ${port}=${OVSDB_NODE_PORT} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_node.json + ${body} = Replace String ${body} 127.0.0.1 ${node_ip} + ${body} = Replace String ${body} 61644 ${port} + ${uri} = Builtin.Set Variable ${RFC8040_TOPO_OVSDB1_API} + BuiltIn.Log URI is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Post Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} + Connect To Ovsdb Node - [Arguments] ${mininet_ip} [Documentation] This will Initiate the connection to OVSDB node from controller - ${sample} OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/connect.json - ${sample1} Replace String ${sample} 127.0.0.1 ${mininet_ip} - ${body} Replace String ${sample1} 61644 ${OVSDB_PORT} - Log URL is ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT} - ${resp} RequestsLibrary.Put session ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT} data=${body} - Log ${resp.content} - Should Be Equal As Strings ${resp.status_code} 200 + [Arguments] ${node_ip} ${port}=${OVSDB_NODE_PORT} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/connect.json + ${body} = String.Replace String ${body} 127.0.0.1 ${node_ip} + ${body} = String.Replace String ${body} 61644 ${port} + ${uri} = BuiltIn.Set Variable ${RFC8040_SOUTHBOUND_NODE_API}${node_ip}%3A${port} + BuiltIn.Log URI is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Put Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Disconnect From Ovsdb Node - [Arguments] ${mininet_ip} [Documentation] This request will disconnect the OVSDB node from the controller - ${resp} RequestsLibrary.Delete session ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT} - Should Be Equal As Strings ${resp.status_code} 200 + [Arguments] ${node_ip} ${port}=${OVSDB_NODE_PORT} + ${resp} = RequestsLibrary.Delete Request session ${RFC8040_SOUTHBOUND_NODE_API}${node_ip}%3A${port} + BuiltIn.Should Be Equal As Strings ${resp.status_code} 204 Add Bridge To Ovsdb Node - [Arguments] ${mininet_ip} ${bridge_num} ${datapath_id} [Documentation] This will create a bridge and add it to the OVSDB node. - ${sample} OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_bridge.json - ${sample1} Replace String ${sample} tcp:127.0.0.1:6633 tcp:${CONTROLLER}:6633 - ${sample2} Replace String ${sample1} 127.0.0.1 ${mininet_ip} - ${sample3} Replace String ${sample2} br01 ${bridge_num} - ${sample4} Replace String ${sample3} 61644 ${OVSDB_PORT} - ${body} Replace String ${sample4} 0000000000000001 ${datapath_id} - Log URL is ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT}%2Fbridge%2F${bridge_num} - ${resp} RequestsLibrary.Put session ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT}%2Fbridge%2F${bridge_num} data=${body} - Log ${resp.content} - Should Be Equal As Strings ${resp.status_code} 200 + [Arguments] ${node_id} ${node_ip} ${bridge} ${datapath_id} ${port}=${OVSDB_NODE_PORT} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_bridge.json + ${body} = String.Replace String ${body} ovsdb://127.0.0.1:61644 ovsdb://${node_id} + ${body} = String.Replace String ${body} tcp:127.0.0.1:6633 tcp:${ODL_SYSTEM_IP}:6633 + ${body} = String.Replace String ${body} 127.0.0.1 ${node_ip} + ${body} = String.Replace String ${body} br01 ${bridge} + ${body} = String.Replace String ${body} 61644 ${port} + ${body} = String.Replace String ${body} 0000000000000001 ${datapath_id} + ${node_id_} = BuiltIn.Evaluate """${node_id}""".replace("/","%2F").replace(":","%3A") + ${uri} = BuiltIn.Set Variable ${RFC8040_SOUTHBOUND_NODE_API}${node_id_}%2Fbridge%2F${bridge} + BuiltIn.Log URI is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Put Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Delete Bridge From Ovsdb Node - [Arguments] ${mininet_ip} ${bridge_num} [Documentation] This request will delete the bridge node from the OVSDB - ${resp} RequestsLibrary.Delete session ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT}%2Fbridge%2F${bridge_num} - Should Be Equal As Strings ${resp.status_code} 200 + [Arguments] ${node_id} ${bridge} + ${resp} = RequestsLibrary.Delete Request + ... session + ... ${RFC8040_SOUTHBOUND_NODE_API}${node_id}%2Fbridge%2F${bridge} + BuiltIn.Should Be Equal As Strings ${resp.status_code} 204 + +Add Termination Point + [Documentation] Using the json data body file as a template, a REST config request is made to + ... create a termination-point ${tp_name} on ${bridge} for the given ${node_id}. The ports + ... remote-ip defaults to ${TOOLS_SYSTEM_IP} + [Arguments] ${node_id} ${bridge} ${tp_name} ${remote_ip}=${TOOLS_SYSTEM_IP} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_port.json + ${body} = String.Replace String ${body} 192.168.0.21 ${remote_ip} + ${body} = String.Replace String ${body} vxlanport ${tp_name} + ${node_id_} = BuiltIn.Evaluate """${node_id}""".replace("/","%2F").replace(":","%3A") + ${uri} = BuiltIn.Set Variable ${RFC8040_SOUTHBOUND_NODE_API}${node_id_}%2Fbridge%2F${bridge} + ${resp} = RequestsLibrary.Put Request session ${uri}/termination-point=${tp_name} data=${body} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} Add Vxlan To Bridge - [Arguments] ${mininet_ip} ${bridge_num} ${vxlan_port} ${remote_ip} ${custom_port}=create_port.json [Documentation] This request will create vxlan port for vxlan tunnel and attach it to the specific bridge - ${sample} OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/${custom_port} - ${body} Replace String ${sample} 192.168.0.21 ${remote_ip} - Log URL is ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT}%2Fbridge%2F${bridge_num}/termination-point/${vxlan_port}/ - ${resp} RequestsLibrary.Put session ${SOUTHBOUND_CONFIG_API}${mininet_ip}:${OVSDB_PORT}%2Fbridge%2F${bridge_num}/termination-point/${vxlan_port}/ data=${body} - Log ${resp.content} - Should Be Equal As Strings ${resp.status_code} 200 + [Arguments] ${node_ip} ${bridge} ${vxlan_port} ${remote_ip} ${port}=${OVSDB_NODE_PORT} + OVSDB.Add Termination Point ${node_ip}:${port} ${bridge} ${vxlan_port} ${remote_ip} + +Verify OVS Reports Connected + [Documentation] Uses "vsctl show" to check for string "is_connected" + [Arguments] ${tools_system}=${TOOLS_SYSTEM_IP} + ${output} = Verify Ovs-vsctl Output show is_connected ${tools_system} + RETURN ${output} + +Verify Ovs-vsctl Output + [Documentation] A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy + ... way to check this output in a WUKS. The argument ${should_match} can control if the match should + ... exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default + [Arguments] ${vsctl_args} ${expected_output} ${ovs_system}=${TOOLS_SYSTEM_IP} ${should_match}=True + ${output} = Utils.Run Command On Mininet ${ovs_system} sudo ovs-vsctl ${vsctl_args} + BuiltIn.Log ${output} + IF "${should_match}" == "True" + BuiltIn.Should Contain ${output} ${expected_output} + END + IF "${should_match}" == "False" + BuiltIn.Should Not Contain ${output} ${expected_output} + END + RETURN ${output} + +Get OVSDB UUID + [Documentation] Queries the topology in the operational datastore and searches for the node that has + ... the ${ovs_system_ip} argument as the "remote-ip". If found, the value returned will be the value of + ... node-id stripped of "ovsdb://uuid/". If not found, ${EMPTY} will be returned. + [Arguments] ${ovs_system_ip}=${TOOLS_SYSTEM_IP} ${controller_http_session}=session + ${uuid} = Set Variable ${EMPTY} + ${resp} = RequestsLibrary.Get Request ${controller_http_session} ${RFC8040_OPERATIONAL_TOPO_OVSDB1_API} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Be Equal As Strings ${resp.status_code} 200 + ${resp_json} = RequestsLibrary.To Json ${resp.text} + ${topologies} = Collections.Get From Dictionary ${resp_json} network-topology:topology + ${topology} = Collections.Get From List ${topologies} 0 + ${node_list} = Collections.Get From Dictionary ${topology} node + BuiltIn.Log ${node_list} + # Since bridges are also listed as nodes, but will not have the extra "ovsdb:connection-info data, + # we need to use "Run Keyword And Ignore Error" below. + FOR ${node} IN @{node_list} + ${node_id} = Collections.Get From Dictionary ${node} node-id + ${node_uuid} = String.Replace String ${node_id} ovsdb://uuid/ ${EMPTY} + ${status} ${connection_info} = BuiltIn.Run Keyword And Ignore Error + ... Collections.Get From Dictionary + ... ${node} + ... ovsdb:connection-info + ${status} ${remote_ip} = BuiltIn.Run Keyword And Ignore Error + ... Collections.Get From Dictionary + ... ${connection_info} + ... remote-ip + ${uuid} = Set Variable If '${remote_ip}' == '${ovs_system_ip}' ${node_uuid} ${uuid} + END + RETURN ${uuid} Collect OVSDB Debugs - [Arguments] ${switch}=br-int [Documentation] Used to log useful test debugs for OVSDB related system tests. - ${output}= Run Command On Remote System ${TOOLS_SYSTEM_IP} sudo ovs-vsctl show - Log ${output} - ${output}= Run Command On Remote System ${TOOLS_SYSTEM_IP} sudo ovs-ofctl -O OpenFlow13 dump-flows ${switch} | cut -d',' -f3- - Log ${output} \ No newline at end of file + [Arguments] ${switch}=${INTEGRATION_BRIDGE} + ${output} = Utils.Run Command On Mininet ${TOOLS_SYSTEM_IP} sudo ovs-vsctl show + BuiltIn.Log ${output} + ${output} = Utils.Run Command On Mininet + ... ${TOOLS_SYSTEM_IP} + ... sudo ovs-ofctl -O OpenFlow13 dump-flows ${switch} | cut -d',' -f3- + BuiltIn.Log ${output} + +Clean OVSDB Test Environment + [Documentation] General Use Keyword attempting to sanitize test environment for OVSDB related + ... tests. Not every step will always be neccessary, but should not cause any problems for + ... any new ovsdb test suites. + [Arguments] ${tools_system}=${TOOLS_SYSTEM_IP} + Utils.Clean Mininet System ${tools_system} + Utils.Run Command On Mininet ${tools_system} sudo ovs-vsctl del-manager + Utils.Run Command On Mininet ${tools_system} sudo /usr/share/openvswitch/scripts/ovs-ctl stop + Utils.Run Command On Mininet ${tools_system} sudo rm -rf /etc/openvswitch/conf.db + Utils.Run Command On Mininet ${tools_system} sudo /usr/share/openvswitch/scripts/ovs-ctl start + +Restart OVSDB + [Documentation] Restart the OVS node without cleaning the current configuration. + [Arguments] ${ovs_ip} + ${output} = Utils.Run Command On Mininet ${ovs_ip} sudo systemctl restart openvswitch + BuiltIn.Log ${output} + +Set Controller In OVS Bridge + [Documentation] Sets controller for the OVS bridge ${bridge} using ${controller_opt} and OF version ${ofversion}. + [Arguments] ${tools_system} ${bridge} ${controller_opt} ${ofversion}=13 + Utils.Run Command On Mininet + ... ${tools_system} + ... sudo ovs-vsctl set bridge ${bridge} protocols=OpenFlow${ofversion} + Utils.Run Command On Mininet ${tools_system} sudo ovs-vsctl set-controller ${bridge} ${controller_opt} + +Check OVS OpenFlow Connections + [Documentation] Check OVS instance with IP ${tools_system} has ${of_connections} OpenFlow connections. + [Arguments] ${tools_system} ${of_connections} + ${output} = Utils.Run Command On Mininet ${tools_system} sudo ovs-vsctl show + BuiltIn.Log ${output} + BuiltIn.Should Contain X Times ${output} is_connected ${of_connections} + +Add Multiple Managers to OVS + [Documentation] Connect OVS to the list of controllers in the ${controller_index_list} or all if no list is provided. + [Arguments] ${tools_system}=${TOOLS_SYSTEM_IP} ${controller_index_list}=${EMPTY} ${ovs_mgr_port}=6640 + ${index_list} = ClusterManagement.List Indices Or All given_list=${controller_index_list} + Utils.Clean Mininet System ${tools_system} + ${ovs_opt} = BuiltIn.Set Variable + FOR ${index} IN @{index_list} + ${ovs_opt} = BuiltIn.Catenate ${ovs_opt} ${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port} + BuiltIn.Log ${ovs_opt} + END + Utils.Run Command On Mininet ${tools_system} sudo ovs-vsctl set-manager ${ovs_opt} + ${output} = BuiltIn.Wait Until Keyword Succeeds 5s 1s Verify OVS Reports Connected ${tools_system} + BuiltIn.Log ${output} + ${controller_index} = Collections.Get_From_List ${index_list} 0 + ${session} = ClusterManagement.Resolve_Http_Session_For_Member member_index=${controller_index} + ${ovsdb_uuid} = BuiltIn.Wait Until Keyword Succeeds + ... 30s + ... 2s + ... OVSDB.Get OVSDB UUID + ... controller_http_session=${session} + RETURN ${ovsdb_uuid} + +Get DPID + [Documentation] Returns the dpnid from the system at the given ip address using ovs-ofctl assuming br-int is present. + [Arguments] ${ip} + ${output} = Utils.Run Command On Remote System + ... ${ip} + ... sudo ovs-ofctl show -O Openflow13 ${INTEGRATION_BRIDGE} | head -1 | awk -F "dpid:" '{print $2}' + ${dpnid} = BuiltIn.Convert To Integer ${output} 16 + BuiltIn.Log ${dpnid} + RETURN ${dpnid} + +Get Subnet + [Documentation] Return the subnet from the system at the given ip address and interface + [Arguments] ${ip} + ${output} = Utils.Run Command On Remote System ${ip} /usr/sbin/ip addr show | grep ${ip} | cut -d' ' -f6 + ${interface} = ipaddress.ip_interface ${output} + ${network} = BuiltIn.Set Variable ${interface.network.__str__()} + RETURN ${network} + +Get Ethernet Adapter + [Documentation] Returns the ethernet adapter name from the system at the given ip address using ip addr show. + [Arguments] ${ip} + ${adapter} = Utils.Run Command On Remote System + ... ${ip} + ... /usr/sbin/ip addr show | grep ${ip} | cut -d " " -f 11 + BuiltIn.Log ${adapter} + RETURN ${adapter} + +Get Default Gateway + [Documentation] Returns the default gateway at the given ip address using route command. + [Arguments] ${ip} + ${gateway} = Utils.Run Command On Remote System + ... ${ip} + ... /usr/sbin/route -n | grep '^0.0.0.0' | cut -d " " -f 10 + BuiltIn.Log ${gateway} + RETURN ${gateway} + +Get Port Number + [Documentation] Get the port number for the given sub-port id + [Arguments] ${subportid} ${ip_addr} + ${command} = Set Variable + ... sudo ovs-ofctl -O OpenFlow13 show ${INTEGRATION_BRIDGE} | grep ${subportid} | awk '{print$1}' + BuiltIn.Log sudo ovs-ofctl -O OpenFlow13 show ${INTEGRATION_BRIDGE} | grep ${subportid} | awk '{print$1}' + ${output} = Utils.Run Command On Remote System ${ip_addr} ${command} + ${port_number} = BuiltIn.Should Match Regexp ${output} [0-9]+ + RETURN ${port_number} + +Get Port Metadata + [Documentation] Get the Metadata for a given port + [Arguments] ${ip_addr} ${port} + ${cmd} = Set Variable + ... sudo ovs-ofctl dump-flows -O Openflow13 ${INTEGRATION_BRIDGE} | grep table=0 | grep in_port=${port} + ${output} = Utils.Run Command On Remote System ${ip_addr} ${cmd} + @{list_any_matches} = String.Get_Regexp_Matches ${output} metadata:(\\w{12}) 1 + ${metadata} = Builtin.Convert To String @{list_any_matches} + ${output} = String.Get Substring ${metadata} 2 + RETURN ${output} + +Log Config And Operational Topology + [Documentation] For debugging purposes, this will log both config and operational topo data stores + ${resp} = RequestsLibrary.Get Request session ${RFC8040_CONFIG_TOPO_API} + OVSDB.Log Request ${resp.text} + ${resp} = RequestsLibrary.Get Request session ${RFC8040_OPERATIONAL_TOPO_API} + OVSDB.Log Request ${resp.text} + +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 ${RFC8040_CONFIG_TOPO_API} + ${operational_resp} = RequestsLibrary.Get Request session ${RFC8040_OPERATIONAL_TOPO_API} + BuiltIn.Should Contain ${config_resp.text} {"topology-id":"ovsdb:1"} + BuiltIn.Should Contain ${operational_resp.text} {"topology-id":"ovsdb:1"} + +Modify Multi Port Body + [Documentation] Updates two port names for the given ${bridge} in config store + [Arguments] ${ovs_1_port_name} ${ovs_2_port_name} ${bridge} + ${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} + ${uri} = Builtin.Set Variable ${RFC8040_TOPO_API} + BuiltIn.Log URI is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Put Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} + RETURN ${body} + +Create Qos + [Arguments] ${qos} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_qos.json + ${uri} = BuiltIn.Set Variable ${RFC8040_SOUTHBOUND_NODE_HOST1_API}/ovsdb:qos-entries=${qos} + ${body} = Replace String ${body} QOS-1 ${qos} + BuiltIn.Log URI is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Put Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} + +Create Queue + [Arguments] ${queue} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/create_qoslinkedqueue.json + ${body} = Replace String ${body} QUEUE-1 ${queue} + ${uri} = BuiltIn.Set Variable ${RFC8040_SOUTHBOUND_NODE_HOST1_API}/ovsdb:queues=${queue} + BuiltIn.Log URI is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Put Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} + +Update Qos + [Arguments] ${qos} + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/update_existingqos.json + ${uri} = BuiltIn.Set Variable ${RFC8040_SOUTHBOUND_NODE_HOST1_API}/ovsdb:qos-entries=${QOS} + BuiltIn.Log URL is ${uri} + BuiltIn.Log data: ${body} + ${resp} = RequestsLibrary.Put Request session ${uri} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} + +Create Qos Linked Queue + ${body} = OperatingSystem.Get File ${OVSDB_CONFIG_DIR}/bug_7160/create_qoslinkedqueue.json + ${resp} = RequestsLibrary.Put Request session ${RFC8040_SOUTHBOUND_NODE_HOST1_API} data=${body} + OVSDB.Log Request ${resp.text} + BuiltIn.Should Contain ${ALLOWED_STATUS_CODES} ${resp.status_code} + +Add OVS Logging + [Documentation] Add higher levels of OVS logging + [Arguments] ${conn_id} + SSHLibrary.Switch Connection ${conn_id} + @{modules} = BuiltIn.Create List + ... bridge:file:dbg + ... connmgr:file:dbg + ... inband:file:dbg + ... ofp_actions:file:dbg + ... ofp_errors:file:dbg + ... ofp_msgs:file:dbg + ... ovsdb_error:file:dbg + ... rconn:file:dbg + ... tunnel:file:dbg + ... vconn:file:dbg + FOR ${module} IN @{modules} + Utils.Write Commands Until Expected Prompt + ... sudo ovs-appctl --target ovs-vswitchd vlog/set ${module} + ... ${DEFAULT_LINUX_PROMPT_STRICT} + END + Utils.Write Commands Until Expected Prompt + ... sudo ovs-appctl --target ovs-vswitchd vlog/list + ... ${DEFAULT_LINUX_PROMPT_STRICT} + +Reset OVS Logging + [Documentation] Reset the OVS logging + [Arguments] ${conn_id} + SSHLibrary.Switch Connection ${conn_id} + ${output} = Utils.Write Commands Until Expected Prompt + ... sudo ovs-appctl --target ovs-vswitchd vlog/set :file:info + ... ${DEFAULT_LINUX_PROMPT_STRICT} + +Suite Setup + SetupUtils.Setup_Utils_For_Setup_And_Teardown + KarafKeywords.Open Controller Karaf Console On Background + RequestsLibrary.Create Session + ... session + ... http://${ODL_SYSTEM_IP}:${RESTCONFPORT} + ... auth=${AUTH} + ... headers=${HEADERS} + OVSDB.Log Config And Operational Topology + +Suite Teardown + [Documentation] Cleans up test environment, close existing sessions. + [Arguments] ${uris}=@{EMPTY} + OVSDB.Clean OVSDB Test Environment ${TOOLS_SYSTEM_IP} + FOR ${uri} IN @{uris} + RequestsLibrary.Delete Request session ${uri} + END + ${resp} = RequestsLibrary.Get Request session ${RFC8040_CONFIG_TOPO_API} + OVSDB.Log Config And Operational Topology + RequestsLibrary.Delete All Sessions + +Get DumpFlows And Ovsconfig + [Documentation] Get the OvsConfig and Flow entries from OVS + [Arguments] ${conn_id} ${bridge} + SSHLibrary.Switch Connection ${conn_id} + Write Commands Until Expected Prompt sudo ovs-vsctl show ${DEFAULT_LINUX_PROMPT_STRICT} + Write Commands Until Expected Prompt sudo ovs-vsctl list Open_vSwitch ${DEFAULT_LINUX_PROMPT_STRICT} + Write Commands Until Expected Prompt + ... sudo ovs-ofctl show ${bridge} -OOpenFlow13 + ... ${DEFAULT_LINUX_PROMPT_STRICT} + Write Commands Until Expected Prompt + ... sudo ovs-ofctl dump-flows ${bridge} -OOpenFlow13 + ... ${DEFAULT_LINUX_PROMPT_STRICT} + Write Commands Until Expected Prompt + ... sudo ovs-ofctl dump-groups ${bridge} -OOpenFlow13 + ... ${DEFAULT_LINUX_PROMPT_STRICT} + Write Commands Until Expected Prompt + ... sudo ovs-ofctl dump-group-stats ${bridge} -OOpenFlow13 + ... ${DEFAULT_LINUX_PROMPT_STRICT} + Write Commands Until Expected Prompt sudo ovs-vsctl list interface ${DEFAULT_LINUX_PROMPT_STRICT} + +Start OVS + [Documentation] start the OVS node. + [Arguments] ${ovs_ip} + ${output} = Utils.Run Command On Mininet ${ovs_ip} sudo /usr/share/openvswitch/scripts/ovs-ctl start + BuiltIn.Log ${output} + +Stop OVS + [Documentation] Stop the OVS node. + [Arguments] ${ovs_ip} + ${output} = Utils.Run Command On Mininet ${ovs_ip} sudo /usr/share/openvswitch/scripts/ovs-ctl stop + BuiltIn.Log ${output} + +Get Bridge Data + [Documentation] This keyword returns first bridge name and UUID from list of bridges. + ${result} = SSHLibrary.Execute Command sudo ovs-vsctl show + ${uuid} = String.Get Line ${result} 0 + ${line} ${bridge_name} = Builtin.Should Match Regexp ${result} Bridge ([\\w-]+) + RETURN ${uuid} ${bridge_name} + +Delete OVS Controller + [Documentation] Delete controller from OVS + [Arguments] ${ovs_ip} ${bridge}=${INTEGRATION_BRIDGE} + ${del_ctr} = Utils.Run Command On Remote System ${ovs_ip} sudo ovs-vsctl del-controller ${bridge} + BuiltIn.Log ${del_ctr} + +Delete OVS Manager + [Documentation] Delete manager from OVS + [Arguments] ${ovs_ip} + ${del_mgr} = Utils.Run Command On Remote System ${ovs_ip} sudo ovs-vsctl del-manager + BuiltIn.Log ${del_mgr} + +Delete Groups On Bridge + [Documentation] Delete OVS groups from ${br} + [Arguments] ${ovs_ip} ${br}=${INTEGRATION_BRIDGE} + ${del_grp} = Utils.Run Command On Remote System ${ovs_ip} sudo ovs-ofctl -O Openflow13 del-groups ${br} + BuiltIn.Log ${del_grp} + +Get Ports From Bridge By Type + [Documentation] Get ${type} ports for a bridge ${br} on node ${ovs_ip}. + [Arguments] ${ovs_ip} ${br} ${type} + ${ports} = Utils.Run Command On Remote System ${ovs_ip} sudo ovs-vsctl list-ports ${br} | grep "${type}" + ${ports_list} = String.Split to lines ${ports} + RETURN ${ports_list} + +Delete Ports On Bridge By Type + [Documentation] List all ports of ${br} and delete ${type} ports + [Arguments] ${ovs_ip} ${br} ${type} + ${ports_present} = Get Ports From Bridge By Type ${ovs_ip} ${br} ${type} + FOR ${port} IN @{ports_present} + ${del-ports} = Utils.Run Command On Remote System ${ovs_ip} sudo ovs-vsctl del-port ${br} ${port} + BuiltIn.Log ${del-ports} + END + ${ports_present_after_delete} = Get Ports From Bridge By Type ${ovs_ip} ${br} ${type} + BuiltIn.Log ${ports_present_after_delete} + +Get Tunnel Id And Packet Count + [Documentation] Get tunnel id and packet count from specified table id + ... Using regex get the n_packet and the tunnel_id from the table flow. + [Arguments] ${conn_id} ${table_id} ${tun_id} ${mac}="" + ${tun_id} = BuiltIn.Convert To Hex ${tun_id} prefix=0x lowercase=yes + IF "${table_id}" == "${INTERNAL_TUNNEL_TABLE}" + ${cmd} = BuiltIn.Set Variable + ... sudo ovs-ofctl dump-flows br-int -OOpenFlow13 | grep table=${table_id} | grep ${mac} | grep tun_id=${tun_id} | grep goto_table:${ELAN_DMACTABLE} + ELSE + ${cmd} = BuiltIn.Set Variable + ... sudo ovs-ofctl dump-flows br-int -OOpenFlow13 | grep table=${table_id} | grep ${mac} + END + SSHLibrary.Switch Connection ${conn_id} + ${output} = Utils.Write Commands Until Expected Prompt ${cmd} ${DEFAULT_LINUX_PROMPT_STRICT} + @{list} = Split to lines ${output} + ${output} = Set Variable ${list}[0] + ${output} = String.Get Regexp Matches + ... ${output} + ... n_packets=([0-9]+),.*set_field:(0x[0-9a-z]+)|n_packets=([0-9]+),.*tun_id=(0x[0-9a-z]+) + ... 1 + ... 2 + ... 3 + ... 4 + ${output} = BuiltIn.Set Variable ${output}[0] + ${output} = Convert To List ${output} + IF "${table_id}" == "${ELAN_DMACTABLE}" + ${packet_count} ${tunnel_id} = BuiltIn.Set Variable ${output}[0] ${output}[1] + ELSE IF "${table_id}" == "${INTERNAL_TUNNEL_TABLE}" + ${packet_count} ${tunnel_id} = BuiltIn.Set Variable ${output}[2] ${output}[3] + ELSE IF "${table_id}" == "${L3_TABLE}" + ${packet_count} ${tunnel_id} = BuiltIn.Set Variable ${output}[0] ${output}[1] + ELSE + ${packet_count} ${tunnel_id} = Set Variable ${None} ${None} + END + ${tunnel_id} = Convert To Integer ${tunnel_id} 16 + RETURN ${tunnel_id} ${packet_count} + +Verify Dump Flows For Specific Table + [Documentation] To Verify flows are present for the corresponding table Number + [Arguments] ${compute_ip} ${table_num} ${flag} ${additional_args}=${EMPTY} @{matching_paras} + ${flow_output} = Utils.Run Command On Remote System + ... ${compute_ip} + ... sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}|grep table=${table_num} ${additional_args} + Log ${flow_output} + FOR ${matching_str} IN @{matching_paras} + IF ${flag}==True + BuiltIn.Should Contain ${flow_output} ${matching_str} + ELSE + BuiltIn.Should Not Contain ${flow_output} ${matching_str} + END + END + +Verify Vni Packet Count After Traffic + [Documentation] Verify the packet count after the traffic sent + [Arguments] ${before_count_egress_port1} ${before_count_egress_port2} ${before_count_ingress_port1} ${before_count_ingress_port2} ${segmentation_id1} ${segmentation_id2} + ... ${port_mac1} ${port_mac2} + ${tun_id} ${after_count_egress_port2} = OVSDB.Get Tunnel Id And Packet Count + ... ${OS_CMP2_CONN_ID} + ... ${L3_TABLE} + ... tun_id=${segmentation_id1} + ... mac=${port_mac1} + ${tun_id} ${after_count_ingress_port2} = OVSDB.Get Tunnel Id And Packet Count + ... ${OS_CMP2_CONN_ID} + ... ${INTERNAL_TUNNEL_TABLE} + ... tun_id=${segmentation_id2} + ${tun_id} ${after_count_egress_port1} = OVSDB.Get Tunnel Id And Packet Count + ... ${OS_CMP1_CONN_ID} + ... ${L3_TABLE} + ... tun_id=${segmentation_id2} + ... mac=${port_mac2} + ${tun_id} ${after_count_ingress_port1} = OVSDB.Get Tunnel Id And Packet Count + ... ${OS_CMP1_CONN_ID} + ... ${INTERNAL_TUNNEL_TABLE} + ... tun_id=${segmentation_id1} + ${diff_count_egress_port1} = BuiltIn.Evaluate ${after_count_egress_port1} - ${before_count_egress_port1} + ${diff_count_ingress_port1} = BuiltIn.Evaluate ${after_count_ingress_port1} - ${before_count_ingress_port1} + ${diff_count_egress_port2} = BuiltIn.Evaluate ${after_count_egress_port2} - ${before_count_egress_port2} + ${diff_count_ingress_port2} = BuiltIn.Evaluate ${after_count_ingress_port2} - ${before_count_ingress_port2} + BuiltIn.Should Be True ${diff_count_egress_port1} >= ${DEFAULT_PING_COUNT} + BuiltIn.Should Be True ${diff_count_ingress_port1} >= ${DEFAULT_PING_COUNT} + BuiltIn.Should Be True ${diff_count_egress_port2} >= ${DEFAULT_PING_COUNT} + BuiltIn.Should Be True ${diff_count_ingress_port2} >= ${DEFAULT_PING_COUNT} + +Get Flow Entries On Node + [Documentation] Return flow entries on the given Node. + [Arguments] ${conn_id} ${switch}=${INTEGRATION_BRIDGE} + SSHLibrary.Switch Connection ${conn_id} + ${output} = Utils.Write Commands Until Expected Prompt + ... sudo ovs-ofctl -O OpenFlow13 dump-flows ${switch} + ... ${DEFAULT_LINUX_PROMPT_STRICT} + BuiltIn.Log ${output} + RETURN ${output} + +Verify Ovsdb State + [Documentation] Verify ovsdb state for the given DPN + [Arguments] ${dpn_ip} ${state}=ACTIVE + ${output} = Utils.Run Command On Remote System And Log + ... ${dpn_ip} + ... sudo ovsdb-client dump -f list Open_vSwitch Controller | grep state + BuiltIn.Log ${output} + BuiltIn.Should Contain ${output} state=${state} + +Verify Flows Are Present On Node + [Documentation] Verify Flows Are Present On The Given Node + [Arguments] ${conn_id} ${match} + ${output} = OVSDB.Get Flow Entries On Node ${conn_id} + BuiltIn.Should Contain ${output} ${match}