*** Keywords ***
Start Mininet Single Controller
- [Arguments] ${mininet}=${TOOLS_SYSTEM_IP} ${controller}=${ODL_SYSTEM_IP} ${options}=--topo tree,1 --switch ovsk,protocols=OpenFlow13 ${custom}=${EMPTY} ${ofport}=${ODL_OF_PORT}
+ [Arguments] ${mininet}=${TOOLS_SYSTEM_IP} ${controller}=${ODL_SYSTEM_IP} ${options}=--topo tree,1 --switch ovsk,protocols=OpenFlow13 ${custom}=${EMPTY} ${ofport}=${ODL_OF_PORT} ${timeout}=${DEFAULT_TIMEOUT}
[Documentation] Start Mininet with custom topology and connect to controller.
Log Clear any existing mininet
Utils.Clean Mininet System ${mininet}
- ${mininet_conn_id}= SSHLibrary.Open Connection ${mininet} prompt=${TOOLS_SYSTEM_PROMPT} timeout=${DEFAULT_TIMEOUT}
+ ${mininet_conn_id}= SSHLibrary.Open Connection ${mininet} prompt=${TOOLS_SYSTEM_PROMPT} timeout=${timeout}
Set Suite Variable ${mininet_conn_id}
Utils.Flexible Mininet Login
Run Keyword If '${custom}' != '${EMPTY}' Put File ${custom}
Log Start mininet ${options} to ${controller}
SSHLibrary.Write sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options}
SSHLibrary.Read Until mininet>
- ${output}= Utils.Run Command On Mininet ${mininet} sudo ovs-vsctl show
- Log ${output}
+ Log Check OVS configuratiom
+ SSHLibrary.Write sh ovs-vsctl show
+ SSHLibrary.Read Until mininet>
[Return] ${mininet_conn_id}
Start Mininet Multiple Controllers
- [Arguments] ${mininet}=${TOOLS_SYSTEM_IP} ${controller_index_list}=${EMPTY} ${options}=--topo tree,1 --switch ovsk,protocols=OpenFlow13 ${custom}=${EMPTY} ${ofport}=${ODL_OF_PORT}
+ [Arguments] ${mininet} ${controller_index_list}=${EMPTY} ${options}=--topo tree,1 --switch ovsk,protocols=OpenFlow13 ${custom}=${EMPTY} ${ofport}=${ODL_OF_PORT} ${timeout}=${DEFAULT_TIMEOUT}
[Documentation] Start Mininet with custom topology and connect to list of controllers in ${controller_index_list} or all if no list is provided.
${index_list} = ClusterManagement__Given_Or_Internal_Index_List given_list=${controller_index_list}
Log Clear any existing mininet
Utils.Clean Mininet System ${mininet}
- ${mininet_conn_id}= SSHLibrary.Open Connection ${mininet} prompt=${TOOLS_SYSTEM_PROMPT} timeout=${DEFAULT_TIMEOUT}
+ ${mininet_conn_id}= SSHLibrary.Open Connection ${mininet} prompt=${TOOLS_SYSTEM_PROMPT} timeout=${timeout}
Set Suite Variable ${mininet_conn_id}
Utils.Flexible Mininet Login
Run Keyword If '${custom}' != '${EMPTY}' Put File ${custom}
\ ${bridge}= Utils.Run Command On Mininet ${mininet} sudo ovs-vsctl show | grep Bridge | cut -c 12- | sort | head -${i} | tail -1
\ OVSDB.Set Controller In OVS Bridge ${mininet} ${bridge} ${controller_opt}
Log Check OVS configuratiom
- ${output}= Utils.Run Command On Mininet ${mininet} sudo ovs-vsctl show
- Log ${output}
+ SSHLibrary.Write sh ovs-vsctl show
+ SSHLibrary.Read Until mininet>
[Return] ${mininet_conn_id}
Send Mininet Command
Run Keyword If """${mininet_conn}""" != "" SSHLibrary.Switch Connection ${mininet_conn}
SSHLibrary.Write exit
SSHLibrary.Read Until ${TOOLS_SYSTEM_PROMPT}
- Close Connection
+ SSHLibrary.Close Connection
Stop Mininet And Exit Multiple Sessions
[Arguments] ${mininet_conn_list}
Library json
Library RequestsLibrary
Variables ../variables/Variables.py
-Resource ./Utils.robot
-Resource Scalability.robot
+Resource Utils.robot
+Resource WorkflowsOpenFlow.robot
*** Variables ***
${switches} 2
+++ /dev/null
-*** Settings ***
-Library SSHLibrary
-Resource Utils.robot
-Library String
-Library Collections
-Variables ../variables/Variables.py
-Library RequestsLibrary
-Library SwitchClasses/BaseSwitch.py
-
-*** Keywords ***
-Find Max Switches
- [Arguments] ${start} ${stop} ${step} ${sustain_time}=0
- [Documentation] Will find out max switches starting from ${start} till reaching ${stop} and in steps defined by ${step}.
- ... The network is hold for ${sustain_time} seconds after everything is checked successful.
- ${max-switches} Set Variable ${0}
- Set Suite Variable ${max-switches}
- ${start} Convert to Integer ${start}
- ${stop} Convert to Integer ${stop}
- ${step} Convert to Integer ${step}
- : FOR ${switches} IN RANGE ${start} ${stop+1} ${step}
- \ ${status} ${result} Run Keyword And Ignore Error Start Mininet Linear ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*2} 10s
- \ ... Check Every Switch ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*2} 10s
- \ ... Check Linear Topology ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ Sleep ${sustain_time}
- \ ${status} ${result} Run Keyword And Ignore Error Stop Mininet Simulation
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*2} 10s
- \ ... Check No Switches ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*2} 10s
- \ ... Check No Topology ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${max-switches} Convert To String ${switches}
- \ Sleep ${sustain_time}
- [Return] ${max-switches}
-
-Find Max Links
- [Arguments] ${begin} ${stop} ${step} ${sustain_time}=5
- [Documentation] Will find out max switches in fully mesh topology starting from ${start} till reaching ${stop} and in steps defined by ${step}.
- ... The network is hold for ${sustain_time} seconds after everything is checked successful.
- ${max_switches} Set Variable ${0}
- ${stop} Convert to Integer ${stop}
- ${step} Convert to Integer ${step}
- : FOR ${switches} IN RANGE ${begin} ${stop+1} ${step}
- \ ${status} ${result} Run Keyword And Ignore Error Start Mininet With Custom Topology ${CREATE_FULLYMESH_TOPOLOGY_FILE} ${switches}
- \ ... ${BASE_MAC_1} ${BASE_IP_1} ${0} ${switches*20}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Verify Controller Has No Null Pointer Exceptions ${ODL_SYSTEM_IP}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120 10s
- \ ... Check Every Switch ${switches} ${BASE_MAC_1}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${max-links}= Evaluate ${switches}*${switches-1}
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120 10s
- \ ... Check Number Of Links ${max-links}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ Sleep ${sustain_time}
- \ ${status} ${result} Run Keyword And Ignore Error Stop Mininet Simulation
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120 10s
- \ ... Check No Switches ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120 10s
- \ ... Check No Topology ${switches}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${max_switches} Set Variable ${switches}
- \ Sleep ${sustain_time}
- ${max-links}= Evaluate ${max_switches}*${max_switches-1}
- [Return] ${max-links}
-
-Find Max Hosts
- [Arguments] ${begin} ${stop} ${step} ${sustain_time}=5
- [Documentation] Will find out max hosts starting from ${begin} till reaching ${stop} and in steps defined by ${step}.
- ... The network is hold for ${sustain_time} seconds after everything is checked successful.
- ${max-hosts} Set Variable ${0}
- ${stop} Convert to Integer ${stop}
- ${step} Convert to Integer ${step}
- : FOR ${hosts} IN RANGE ${begin} ${stop+1} ${step}
- \ ${status} ${result} Run Keyword And Ignore Error Start Mininet With One Switch And ${hosts} hosts
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120s 30s
- \ ... Check Every Switch ${1}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ @{host_list}= Get Mininet Hosts
- \ ${status}= Ping All Hosts @{host_list}
- \ Exit For Loop If ${status} != ${0}
- \ ${status} ${result} Run Keyword And Ignore Error Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120s 30s
- \ ... Check Number Of Hosts ${hosts}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ Sleep ${sustain_time}
- \ ${status} ${result} Run Keyword And Ignore Error Stop Mininet Simulation
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Check No Switches ${1}
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${status} ${result} Run Keyword And Ignore Error Check No Hosts
- \ Exit For Loop If '${status}' == 'FAIL'
- \ ${max-hosts} Convert To String ${hosts}
- \ Sleep ${sustain_time}
- [Return] ${max-hosts}
-
-Get Mininet Hosts
- [Documentation] Get all the hosts from mininet
- ${host_list}= Create List
- Write nodes
- ${out}= Read Until mininet>
- @{words}= Split String ${out} ${SPACE}
- : FOR ${item} IN @{words}
- \ ${h}= Get Lines Matching Regexp ${item.rstrip()} .*h[0-9]*s.
- \ Run Keyword If '${h}' != '${EMPTY}' Append To List ${host_list} ${h}
- [Return] ${host_list}
-
-Ping All Hosts
- [Arguments] @{host_list}
- [Documentation] Do one round of ping from one host to all other hosts in mininet
- ${source}= Get From List ${host_list} ${0}
- : FOR ${h} IN @{host_list}
- \ ${status}= Ping Two Hosts ${source} ${h} 1
- \ Exit For Loop If ${status}!=${0}
- [Return] ${status}
-
-Start Mininet With One Switch And ${hosts} hosts
- [Documentation] Start mininet with one switch and ${hosts} hosts
- Log Starting mininet with one switch and ${hosts} hosts
- Log To Console Starting mininet with one switch and ${hosts} hosts
- ${mininet_conn_id}= Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT} timeout=${hosts*3}
- Set Suite Variable ${mininet_conn_id}
- Login With Public Key ${TOOLS_SYSTEM_USER} ${USER_HOME}/.ssh/${SSH_KEY} any
- Write sudo mn --controller=remote,ip=${ODL_SYSTEM_IP} --topo linear,1,${hosts} --switch ovsk,protocols=OpenFlow13
- Read Until mininet>
-
-Check Number Of Hosts
- [Arguments] ${hosts}
- [Documentation] Check number of hosts in inventory
- ${resp}= RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
- Log Check number of hosts in inventory
- Log To Console Check number of hosts in inventory
- Should Be Equal As Strings ${resp.status_code} 200
- ${count}= Get Count ${resp.content} "node-id":"host:
- Should Be Equal As Integers ${count} ${hosts}
-
-Check Number Of Links
- [Arguments] ${links}
- [Documentation] Check number of links in inventory is ${links}
- ${resp}= RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
- Log Check number of links in inventory is ${links}
- Log To Console Check number of links in inventory is ${links}
- Should Be Equal As Strings ${resp.status_code} 200
- ${count}= Get Count ${resp.content} "link-id":"openflow:
- Should Be Equal As Integers ${count} ${links}
-
-Ping Two Hosts
- [Arguments] ${host1} ${host2} ${pingcount}=2 ${connection_index}=${EMPTY} ${connection_alias}=${EMPTY}
- [Documentation] Ping between mininet hosts. Must be used only after a mininet session is in place.Returns non zero value if there is 100% packet loss.
- Run Keyword If '${connection_index}' != '${EMPTY}' Switch Connection ${connection_index}
- Run Keyword If '${connection_alias}' != '${EMPTY}' Switch Connection ${connection_alias}
- Write ${host1} ping -c ${pingcount} ${host2}
- ${out}= Read Until mininet>
- ${ret}= Get Lines Matching Regexp ${out} .*100% packet loss.*
- ${len}= Get Length ${ret}
- [Return] ${len}
-
-Check No Hosts
- [Documentation] Check if all hosts are deleted from inventory
- ${resp}= RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
- Log To Console Checking no hosts are present in operational database
- Log Checking no hosts are present in operational database
- Should Be Equal As Strings ${resp.status_code} 200
- Should Not Contain ${resp.content} "node-id":"host:
-
-Start Mininet Linear
- [Arguments] ${switches}
- [Documentation] Start mininet linear topology with ${switches} nodes
- Log To Console Starting mininet linear ${switches}
- ${mininet_conn_id}= Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT} timeout=${switches*3}
- Set Suite Variable ${mininet_conn_id}
- Login With Public Key ${TOOLS_SYSTEM_USER} ${USER_HOME}/.ssh/${SSH_KEY} any
- Write sudo mn --controller=remote,ip=${ODL_SYSTEM_IP} --topo linear,${switches} --switch ovsk,protocols=OpenFlow13
- Read Until mininet>
-
-Start Mininet With Custom Topology
- [Arguments] ${topology_file} ${switches} ${base_mac}=00:00:00:00:00:00 ${base_ip}=1.1.1.1 ${hosts}=0 ${mininet_start_time}=100
- [Documentation] Start a custom mininet topology.
- Log To Console Start a custom mininet topology with ${switches} nodes
- ${mininet_conn_id}= Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT} timeout=${mininet_start_time}
- Set Suite Variable ${mininet_conn_id}
- Login With Public Key ${TOOLS_SYSTEM_USER} ${USER_HOME}/.ssh/${SSH_KEY} any
- Write python ${topology_file} ${switches} ${hosts} ${base_mac} ${base_ip}
- Read Until ${DEFAULT_LINUX_PROMPT}
- Write sudo mn --controller=remote,ip=${ODL_SYSTEM_IP} --custom switch.py --topo demotopo --switch ovsk,protocols=OpenFlow13
- Read Until mininet>
- Write sh ovs-vsctl show
- ${output}= Read Until mininet>
- # Ovsdb connection is sometimes lost after mininet is started. Checking if the connection is alive before proceeding.
- Should Not Contain ${output} database connection failed
- Log To Console Mininet Started with ${switches} nodes
-
-Check Every Switch
- [Arguments] ${switches} ${base_mac}=00:00:00:00:00:00
- [Documentation] Check all switches and stats in operational inventory
- ${mac}= Replace String Using Regexp ${base_mac} : ${EMPTY}
- ${mac}= Convert Hex To Decimal As String ${mac}
- ${mac}= Convert To Integer ${mac}
- : FOR ${switch} IN RANGE 1 ${switches+1}
- \ ${dpid_decimal}= Evaluate ${mac}+${switch}
- \ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_NODES_API}/node/openflow:${dpid_decimal}
- \ Should Be Equal As Strings ${resp.status_code} 200
- \ Log To Console Checking Switch ${switch}
- \ Should Contain ${resp.content} flow-capable-node-connector-statistics
- \ Should Contain ${resp.content} flow-table-statistics
-
-Check Linear Topology
- [Arguments] ${switches}
- [Documentation] Check Linear topology given ${switches}
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
- Log To Console Checking Topology
- Should Be Equal As Strings ${resp.status_code} 200
- : FOR ${switch} IN RANGE 1 ${switches+1}
- \ Should Contain ${resp.content} "node-id":"openflow:${switch}"
- \ Should Contain ${resp.content} "tp-id":"openflow:${switch}:1"
- \ Should Contain ${resp.content} "tp-id":"openflow:${switch}:2"
- \ Should Contain ${resp.content} "source-tp":"openflow:${switch}:2"
- \ Should Contain ${resp.content} "dest-tp":"openflow:${switch}:2"
- \ ${edge} Evaluate ${switch}==1 or ${switch}==${switches}
- \ Run Keyword Unless ${edge} Should Contain ${resp.content} "tp-id":"openflow:${switch}:3"
- \ Run Keyword Unless ${edge} Should Contain ${resp.content} "source-tp":"openflow:${switch}:3"
- \ Run Keyword Unless ${edge} Should Contain ${resp.content} "dest-tp":"openflow:${switch}:3"
-
-Check No Switches
- [Arguments] ${switches}
- [Documentation] Check no switch is in inventory
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_NODES_API}
- Log To Console Checking No Switches
- Should Be Equal As Strings ${resp.status_code} 200
- : FOR ${switch} IN RANGE 1 ${switches+1}
- \ Should Not Contain ${resp.content} "openflow:${switch}"
-
-Check No Topology
- [Arguments] ${switches}
- [Documentation] Check no switch is in topology
- ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
- Log To Console Checking No Topology
- Should Be Equal As Strings ${resp.status_code} 200
- : FOR ${switch} IN RANGE 1 ${switches+1}
- \ Should Not Contain ${resp.content} openflow:${switch}
-
-Stop Mininet Simulation
- [Documentation] Stop mininet
- Log To Console Stopping Mininet
- Switch Connection ${mininet_conn_id}
- Read
- Write exit
- Read Until ${DEFAULT_LINUX_PROMPT}
- Close Connection
-
-Scalability Suite Teardown
- Delete All Sessions
- Clean Mininet System
--- /dev/null
+*** Settings ***
+Documentation Resource for L2switch workflows. TODO: Refactor KWs once this test works in public.
+Library SSHLibrary
+Library RequestsLibrary
+Library String
+Library Collections
+Library SwitchClasses/BaseSwitch.py
+Resource Utils.robot
+Variables ../variables/Variables.py
+
+*** Keywords ***
+Find Max Hosts
+ [Arguments] ${begin} ${stop} ${step} ${sustain_time}=0
+ [Documentation] Will find out max hosts starting from ${begin} till reaching ${stop} and in steps defined by ${step}.
+ ... The network is hold for ${sustain_time} seconds after everything is checked successful.
+ ${max-hosts} Set Variable ${0}
+ ${stop} Convert to Integer ${stop}
+ ${step} Convert to Integer ${step}
+ : FOR ${hosts} IN RANGE ${begin} ${stop+1} ${step}
+ \ Log To Console Starting mininet with one switch and ${hosts} hosts
+ \ ${status} ${result} Run Keyword And Ignore Error Start Mininet With One Switch And ${hosts} hosts
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Log To Console Checking ${switches} switches
+ \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120s 30s
+ \ ... Check Every Switch ${1}
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Log To Console Ping all hosts
+ \ @{host_list}= Get Mininet Hosts
+ \ ${status}= Ping All Hosts @{host_list}
+ \ Exit For Loop If ${status} != ${0}
+ \ Log To Console Verify controller is OK
+ \ ${status} ${result} Run Keyword And Ignore Error Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ ${status} ${result} Run Keyword And Ignore Error Verify Controller Has No Null Pointer Exceptions ${ODL_SYSTEM_IP}
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Log To Console Check number of hosts in inventory is ${hosts}
+ \ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 120s 30s
+ \ ... Check Number Of Hosts ${hosts}
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Log To Console Sleep for ${sustain_time} seconds
+ \ Sleep ${sustain_time}
+ \ Log To Console Stopping Mininet
+ \ ${status} ${result} Run Keyword And Ignore Error Stop Mininet Simulation
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Log To Console Checking No Switches
+ \ ${status} ${result} Run Keyword And Ignore Error Check No Switches
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Log To Console Checking no hosts are present in operational database
+ \ ${status} ${result} Run Keyword And Ignore Error Check No Hosts
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ ${max-hosts} Convert To String ${hosts}
+ [Return] ${max-hosts}
+
+Get Mininet Hosts
+ [Documentation] Get all the hosts from mininet
+ ${host_list}= Create List
+ Write nodes
+ ${out}= Read Until mininet>
+ @{words}= Split String ${out} ${SPACE}
+ : FOR ${item} IN @{words}
+ \ ${h}= Get Lines Matching Regexp ${item.rstrip()} .*h[0-9]*s.
+ \ Run Keyword If '${h}' != '${EMPTY}' Append To List ${host_list} ${h}
+ [Return] ${host_list}
+
+Ping All Hosts
+ [Arguments] @{host_list}
+ [Documentation] Do one round of ping from one host to all other hosts in mininet
+ ${source}= Get From List ${host_list} ${0}
+ : FOR ${h} IN @{host_list}
+ \ ${status}= Ping Two Hosts ${source} ${h} 1
+ \ Exit For Loop If ${status}!=${0}
+ [Return] ${status}
+
+Start Mininet With One Switch And ${hosts} hosts
+ [Documentation] Start mininet with one switch and ${hosts} hosts
+ Log Starting mininet with one switch and ${hosts} hosts
+ ${mininet_conn_id}= Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT} timeout=${hosts*3}
+ Set Suite Variable ${mininet_conn_id}
+ Login With Public Key ${TOOLS_SYSTEM_USER} ${USER_HOME}/.ssh/${SSH_KEY} any
+ Write sudo mn --controller=remote,ip=${ODL_SYSTEM_IP} --topo linear,1,${hosts} --switch ovsk,protocols=OpenFlow13
+ Read Until mininet>
+
+Check Number Of Hosts
+ [Arguments] ${hosts}
+ [Documentation] Check number of hosts in inventory
+ ${resp}= RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
+ Log Check number of hosts in inventory is ${hosts}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${count}= Get Count ${resp.content} "node-id":"host:
+ Should Be Equal As Integers ${count} ${hosts}
+
+Ping Two Hosts
+ [Arguments] ${host1} ${host2} ${pingcount}=2 ${connection_index}=${EMPTY} ${connection_alias}=${EMPTY}
+ [Documentation] Ping between mininet hosts. Must be used only after a mininet session is in place.Returns non zero value if there is 100% packet loss.
+ Run Keyword If '${connection_index}' != '${EMPTY}' Switch Connection ${connection_index}
+ Run Keyword If '${connection_alias}' != '${EMPTY}' Switch Connection ${connection_alias}
+ Write ${host1} ping -c ${pingcount} ${host2}
+ ${out}= Read Until mininet>
+ ${ret}= Get Lines Matching Regexp ${out} .*100% packet loss.*
+ ${len}= Get Length ${ret}
+ [Return] ${len}
+
+Check No Hosts
+ [Documentation] Check if all hosts are deleted from inventory
+ ${resp}= RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
+ Log Checking no hosts are present in operational database
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Not Contain ${resp.content} "node-id":"host:
+
+Check No Switches
+ [Arguments] ${switches}
+ [Documentation] Check no switch is in inventory
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_NODES_API}
+ Should Be Equal As Strings ${resp.status_code} 200
+ : FOR ${switch} IN RANGE 1 ${switches+1}
+ \ Should Not Contain ${resp.content} "openflow:${switch}"
+
+Stop Mininet Simulation
+ [Documentation] Stop mininet
+ Switch Connection ${mininet_conn_id}
+ Read
+ Write exit
+ Read Until ${DEFAULT_LINUX_PROMPT}
+ Close Connection
+
+Scalability Suite Teardown
+ Run Keyword And Ignore Error RequestsLibrary.Delete Request session ${CONFIG_NODES_API}
+ Delete All Sessions
+ Clean Mininet System
--- /dev/null
+*** Settings ***
+Documentation Resource for OpenFlow workflows. This library can be used for scalability and longevity tests.
+Library SSHLibrary
+Library DateTime
+Library RequestsLibrary
+Library ScaleClient.py
+Library SwitchClasses/BaseSwitch.py
+Resource Utils.robot
+Resource CompareStream.robot
+Resource MininetKeywords.robot
+Resource KarafKeywords.robot
+Resource ../variables/Variables.robot
+
+*** Variables ***
+${topology_file} create_fullymesh.py
+${topology_file_path} MininetTopo/${topology_file}
+${flow_count} 10000
+${swspread} linear
+${tables} 10
+${tabspread} linear
+${nrthreads} 1
+
+*** Keywords ***
+Workflow Linear Topology
+ [Arguments] ${switches} ${sustain_time}=0
+ [Documentation] Workflow to bring a Linear topology of ${switches} switches, push flows, hold for ${sustain_time} seconds, delete flows and stop topology.
+ ... This KW returns workflow state (PASS/FAIL), error message and topology discover time.
+ # Define required variables
+ ${error_message}= Set Variable Test has completed
+ ${topology_discover_time}= Set Variable ${0}
+ ${controller_list}= Create List ${ODL_SYSTEM_IP}
+ ${flow_count}= Convert to Integer ${flow_count}
+ ${flows_ovs_25}= Evaluate ${flow_count} + ${switches}
+ ${flows_before}= CompareStream.Set_Variable_If_At_Least_Boron ${switches} ${0}
+ ${flows_after}= CompareStream.Set_Variable_If_At_Least_Boron ${flows_ovs_25} ${flow_count}
+ ${flows} ${notes} ScaleClient.Generate New Flow Details flows=${flow_count} switches=${switches} swspread=${swspread} tables=${tables}
+ ... tabspread=${tabspread}
+ # Workflow starts
+ Log to console ${\n}
+ Log To Console Starting mininet linear ${switches} switches
+ ${status} ${result} Run Keyword And Ignore Error Start Mininet Linear ${switches} mininet_timeout=${switches*4}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail starting mininet ${topology_discover_time}
+ ${start_time}= DateTime.Get Current Date result_format=timestamp
+ Log To Console Verify controller is OK
+ ${status} ${result} Run Keyword And Ignore Error Utils.Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Controller is dead ${topology_discover_time}
+ ${status} ${result} Run Keyword And Ignore Error Utils.Verify Controller Has No Null Pointer Exceptions ${ODL_SYSTEM_IP}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Controller has NPE ${topology_discover_time}
+ Log To Console Checking ${switches} switches
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*2} 2s Check Every Switch
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking switch ${topology_discover_time}
+ Log To Console Checking Linear Topology
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches} 2s Check Linear Topology
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking topology ${topology_discover_time}
+ ${end_time}= DateTime.Get Current Date result_format=timestamp
+ ${topology_discover_time}= DateTime.Subtract Date From Date ${end_time} ${start_time}
+ Log To Console Topology Discovery Time = ${topology_discover_time} seconds
+ Log To Console Adding ${flow_count} flows
+ ${status} ${result} Run Keyword And Ignore Error ScaleClient.Configure Flows flow_details=${flows} controllers=${controller_list} nrthreads=${nrthreads}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail configuring flows ${topology_discover_time}
+ Log To Console Checking ${flow_count} flows in Mininet
+ ${status} ${result} Run Keyword And Ignore Error MininetKeywords.Verify Aggregate Flow From Mininet Session ${mininet_conn_id} ${flows_after} ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking flows in mininet ${topology_discover_time}
+ Log To Console Checking ${flow_count} flows in Operational DS
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*4} 2s Check Flows Operational Datastore
+ ... ${flows_after}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking flows in operational DS ${topology_discover_time}
+ Log To Console Sleep for ${sustain_time} seconds
+ Sleep ${sustain_time}
+ Log To Console Deleting ${flow_count} flows
+ ${status} ${result} Run Keyword And Ignore Error ScaleClient.Deconfigure Flows flow_details=${flows} controllers=${controller_list} nrthreads=${nrthreads}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail deconfiguring flows ${topology_discover_time}
+ Log To Console Checking no flows in Mininet
+ ${status} ${result} Run Keyword And Ignore Error MininetKeywords.Verify Aggregate Flow From Mininet Session ${mininet_conn_id} ${flows_before} ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no flows in mininet ${topology_discover_time}
+ Log To Console Checking no flows in Operational DS
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*4} 2s Check Flows Operational Datastore
+ ... ${flows_before}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no flows in operational DS ${topology_discover_time}
+ Log To Console Stopping Mininet
+ ${status} ${result} Run Keyword And Ignore Error MininetKeywords.Stop Mininet And Exit
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail stopping mininet ${topology_discover_time}
+ Log To Console Checking No Switches
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 10s 2s Check No Switches
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no switch ${topology_discover_time}
+ Log To Console Checking No Topology
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 10s 2s Check No Topology
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no topology ${topology_discover_time}
+ [Return] PASS ${error_message} ${topology_discover_time}
+
+Workflow Full Mesh Topology
+ [Arguments] ${switches} ${sustain_time}=0
+ [Documentation] Workflow to bring a Full mesh topology of ${switches} switches, push some flows, delete flows and stop topology.
+ ... This KW returns workflow state (PASS/FAIL), error message and topology discover time.
+ # Define required variables
+ ${error_message}= Set Variable Test has completed
+ ${topology_discover_time}= Set Variable ${0}
+ ${mininet_timeout}= Evaluate ${switches} * ${switches}
+ ${links}= Evaluate ${switches} * ${switches-1}
+ ${controller_list}= Create List ${ODL_SYSTEM_IP}
+ ${flow_count}= Convert to Integer ${flow_count}
+ ${flows_ovs_25}= Evaluate ${flow_count} + ${switches}
+ ${flows_before}= CompareStream.Set_Variable_If_At_Least_Boron ${switches} ${0}
+ ${flows_after}= CompareStream.Set_Variable_If_At_Least_Boron ${flows_ovs_25} ${flow_count}
+ ${flows} ${notes} ScaleClient.Generate New Flow Details flows=${flow_count} switches=${switches} swspread=${swspread} tables=${tables}
+ ... tabspread=${tabspread}
+ # Workflow starts
+ Log to console ${\n}
+ Log To Console Start a mininet full mesh ${switches} switches
+ ${status} ${result} Run Keyword And Ignore Error Start Mininet Full Mesh ${switches} mininet_timeout=${mininet_timeout}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail starting mininet ${topology_discover_time}
+ ${start_time}= DateTime.Get Current Date result_format=timestamp
+ Log To Console Verify controller is OK
+ ${status} ${result} Run Keyword And Ignore Error Utils.Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Controller is dead ${topology_discover_time}
+ ${status} ${result} Run Keyword And Ignore Error Utils.Verify Controller Has No Null Pointer Exceptions ${ODL_SYSTEM_IP}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Controller has NPE ${topology_discover_time}
+ Log To Console Checking ${switches} switches
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 10s 2s Check Every Switch
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking switch ${topology_discover_time}
+ Log To Console Check number of links in inventory is ${links}
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 10s 2s Check Number Of Links
+ ... ${links}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking topology ${topology_discover_time}
+ ${end_time}= DateTime.Get Current Date result_format=timestamp
+ ${topology_discover_time}= DateTime.Subtract Date From Date ${end_time} ${start_time}
+ Log To Console Topology Discovery Time = ${topology_discover_time} seconds
+ Log To Console Adding ${flow_count} flows
+ ${status} ${result} Run Keyword And Ignore Error ScaleClient.Configure Flows flow_details=${flows} controllers=${controller_list} nrthreads=${nrthreads}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail configuring flows ${topology_discover_time}
+ Log To Console Checking ${flow_count} flows in Mininet
+ ${status} ${result} Run Keyword And Ignore Error MininetKeywords.Verify Aggregate Flow From Mininet Session ${mininet_conn_id} ${flows_after} ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking flows in mininet ${topology_discover_time}
+ Log To Console Checking ${flow_count} flows in Operational DS
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*4} 2s Check Flows Operational Datastore
+ ... ${flows_after}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking flows in operational DS ${topology_discover_time}
+ Log To Console Sleep for ${sustain_time} seconds
+ Sleep ${sustain_time}
+ Log To Console Deleting ${flow_count} flows
+ ${status} ${result} Run Keyword And Ignore Error ScaleClient.Deconfigure Flows flow_details=${flows} controllers=${controller_list} nrthreads=${nrthreads}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail deconfiguring flows ${topology_discover_time}
+ Log To Console Checking no flows in Mininet
+ ${status} ${result} Run Keyword And Ignore Error MininetKeywords.Verify Aggregate Flow From Mininet Session ${mininet_conn_id} ${flows_before} ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no flows in mininet ${topology_discover_time}
+ Log To Console Checking no flows in Operational DS
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds ${switches*4} 2s Check Flows Operational Datastore
+ ... ${flows_before}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no flows in operational DS ${topology_discover_time}
+ Log To Console Stopping Mininet
+ ${status} ${result} Run Keyword And Ignore Error MininetKeywords.Stop Mininet And Exit
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail stopping mininet ${topology_discover_time}
+ Log To Console Checking No Switches
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 10s 2s Check No Switches
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no switch ${topology_discover_time}
+ Log To Console Checking No Topology
+ ${status} ${result} Run Keyword And Ignore Error Wait Until Keyword Succeeds 10s 2s Check No Topology
+ ... ${switches}
+ Return From Keyword If '${status}' == 'FAIL' ${status} Fail checking no topology ${topology_discover_time}
+ [Return] PASS ${error_message} ${topology_discover_time}
+
+Start Mininet Linear
+ [Arguments] ${switches} ${mininet_timeout}=${DEFAULT_TIMEOUT}
+ [Documentation] Start mininet linear topology with ${switches} nodes
+ Log Start Mininet Linear
+ MininetKeywords.StartMininet Single Controller options=--topo linear,${switches} --switch ovsk,protocols=OpenFlow13 timeout=${mininet_timeout}
+
+Start Mininet Full Mesh
+ [Arguments] ${switches} ${base_mac}=00:00:00:00:00:00 ${base_ip}=10.0.0.0 ${hosts}=0 ${mininet_timeout}=${DEFAULT_TIMEOUT}
+ [Documentation] Start a custom mininet topology.
+ ${mininet_conn_id}= SSHLibrary.Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT} timeout=${mininet_timeout}
+ Set Suite Variable ${mininet_conn_id}
+ Utils.Flexible_Mininet_Login
+ Log Copying ${topology_file_path} file to Mininet VM and Creating Full Mesh topology
+ SSHLibrary.Put File ${CURDIR}/${topology_file_path}
+ SSHLibrary.Write python ${topology_file} ${switches} ${hosts} ${base_mac} ${base_ip}
+ SSHLibrary.Read Until ${DEFAULT_LINUX_PROMPT}
+ Log Start Mininet Full Mesh
+ SSHLibrary.Write sudo mn --controller=remote,ip=${ODL_SYSTEM_IP} --custom switch.py --topo demotopo --switch ovsk,protocols=OpenFlow13
+ Read Until mininet>
+ Log Check OVS configuratiom
+ Write sh ovs-vsctl show
+ ${output}= Read Until mininet>
+ # Ovsdb connection is sometimes lost after mininet is started. Checking if the connection is alive before proceeding.
+ Should Not Contain ${output} database connection failed
+
+Check Every Switch
+ [Arguments] ${switches} ${base_mac}=00:00:00:00:00:00
+ [Documentation] Check all switches and stats in operational inventory
+ ${mac}= String.Replace String Using Regexp ${base_mac} : ${EMPTY}
+ ${mac}= BaseSwitch.Convert Hex To Decimal As String ${mac}
+ ${mac}= Convert To Integer ${mac}
+ : FOR ${switch} IN RANGE 1 ${switches+1}
+ \ ${dpid_decimal}= Evaluate ${mac} + ${switch}
+ \ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_NODES_API}/node/openflow:${dpid_decimal}
+ \ Should Be Equal As Strings ${resp.status_code} 200
+ \ Should Contain ${resp.content} flow-capable-node-connector-statistics
+ \ Should Contain ${resp.content} flow-table-statistics
+
+Check Linear Topology
+ [Arguments] ${switches}
+ [Documentation] Check Linear topology given ${switches}
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
+ Should Be Equal As Strings ${resp.status_code} 200
+ : FOR ${switch} IN RANGE 1 ${switches+1}
+ \ Should Contain ${resp.content} "node-id":"openflow:${switch}"
+ \ Should Contain ${resp.content} "tp-id":"openflow:${switch}:1"
+ \ Should Contain ${resp.content} "tp-id":"openflow:${switch}:2"
+ \ Should Contain ${resp.content} "source-tp":"openflow:${switch}:2"
+ \ Should Contain ${resp.content} "dest-tp":"openflow:${switch}:2"
+ \ ${edge} Evaluate ${switch}==1 or ${switch}==${switches}
+ \ Run Keyword Unless ${edge} Should Contain ${resp.content} "tp-id":"openflow:${switch}:3"
+ \ Run Keyword Unless ${edge} Should Contain ${resp.content} "source-tp":"openflow:${switch}:3"
+ \ Run Keyword Unless ${edge} Should Contain ${resp.content} "dest-tp":"openflow:${switch}:3"
+
+Check Number Of Links
+ [Arguments] ${links}
+ [Documentation] Check number of links in inventory is ${links}
+ ${resp}= RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
+ Log Check number of links in inventory is ${links}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${count}= Get Count ${resp.content} "link-id":"openflow:
+ Should Be Equal As Integers ${count} ${links}
+
+Check Flows Operational Datastore
+ [Arguments] ${flow_count} ${controller_ip}=${ODL_SYSTEM_IP}
+ [Documentation] Check if number of Operational Flows on member of given index is equal to ${flow_count}.
+ ${sw} ${reported_flow} ${found_flow}= ScaleClient.Flow Stats Collected controller=${controller_ip}
+ Should_Be_Equal_As_Numbers ${flow_count} ${found_flow}
+
+Check No Switches
+ [Arguments] ${switches}
+ [Documentation] Check no switch is in inventory
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_NODES_API}
+ Should Be Equal As Strings ${resp.status_code} 200
+ : FOR ${switch} IN RANGE 1 ${switches+1}
+ \ Should Not Contain ${resp.content} "openflow:${switch}"
+
+Check No Topology
+ [Arguments] ${switches}
+ [Documentation] Check no switch is in topology
+ ${resp} RequestsLibrary.Get Request session ${OPERATIONAL_TOPO_API}
+ Should Be Equal As Strings ${resp.status_code} 200
+ : FOR ${switch} IN RANGE 1 ${switches+1}
+ \ Should Not Contain ${resp.content} openflow:${switch}
+
+Workflow Setup
+ RequestsLibrary.Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML}
+ Wait Until Keyword Succeeds 3x 1s KarafKeywords.Issue Command On Karaf Console log:set ERROR
+
+Workflow Teardown
+ [Documentation] Cleanup when workflow is interrupt
+ Run Keyword And Ignore Error RequestsLibrary.Delete Request session ${CONFIG_NODES_API}
+ Clean Mininet System
+ RequestsLibrary.Delete All Sessions
--- /dev/null
+# Place the scripts in run order:
+integration/test/csit/scripts/set_elasticsearch_attribute_short.sh
+integration/test/csit/scripts/set_jvm_common_attribute.sh
--- /dev/null
+# Place the scripts in run order:
+integration/test/csit/scripts/set_elasticsearch_attribute_short.sh
+integration/test/csit/scripts/set_jvm_common_attribute.sh
Library OperatingSystem
Library RequestsLibrary
Variables ../../../variables/Variables.py
-Resource ../../../libraries/Scalability.robot
+Resource ../../../libraries/WorkflowsL2switch.robot
*** Variables ***
${MIN_HOSTS} 100
Library Collections
Library ../../../libraries/Common.py
Resource ../../../libraries/NicKeywords.robot
-Resource ../../../libraries/Scalability.robot
+Resource ../../../libraries/WorkflowsOpenFlow.robot
*** Variables ***
${switches} 8
+++ /dev/null
-*** Settings ***
-Documentation Beta Version of the Longevity Test. Currently it does a single test:
-... 1. runs one iteration of the switch scale test based on ${NUM_SWITCHES}
-... Step 1 runs in a psuedo infinite loop and before each loop is
-... run, a time check is made against the ${TEST_LENGTH}. If the test duration
-... has expired, the loop is exited and the test is marked PASS
-...
-... If step 1 fails to reach their configured value of ${NUM_SWITCHES}
-... the test will exit immediately and not continue.
-Suite Setup Longevity Suite Setup
-Suite Teardown Longevity Suite Teardown
-Library RequestsLibrary
-Library DateTime
-Variables ../../../variables/Variables.py
-Resource ../../../libraries/Scalability.robot
-Resource ../../../libraries/KarafKeywords.robot
-
-*** Variables ***
-${NUM_SWITCHES} 200
-${SUSTAIN_TIME} 60
-${TEST_LENGTH} 2 hours
-${KARAF_LOG_LEVEL} ERROR
-
-*** Test Cases ***
-Longevity Test
- [Documentation] Uses switch scalability test functionality in a loop for given period of time
- # This loop is not infinite, so going "sufficiently large" for now.
- : FOR ${i} IN RANGE 1 65536
- \ ${expiration_flag}= Check If There Is A Reason To Exit Test Or If Duration Has Expired
- \ Exit For Loop If "${expiration_flag}" == "True"
- \ ${switch_count}= Find Max Switches ${NUM_SWITCHES} ${NUM_SWITCHES} ${NUM_SWITCHES} ${SUSTAIN_TIME}
- \ Check If There Is A Reason To Exit Test Or If Duration Has Expired ${switch_count} ${NUM_SWITCHES} Switch count not correct
-
-*** Keywords ***
-Check If There Is A Reason To Exit Test Or If Duration Has Expired
- [Arguments] ${comparator1}=1 ${comparator2}=1 ${comparator_failure_message}=null
- [Documentation] In order to simplify the main test case, this keyword will make all the neccessary checks
- ... to determine if the test should FAIL and quit because of some problem. It will also return a bool to
- ... indicate if the requested duration of the longevity test has elapsed. The caller does not have to use
- ... that return value.
- Should Be Equal ${comparator1} ${comparator2} ${comparator_failure_message}
- Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
- Verify Controller Has No Null Pointer Exceptions ${ODL_SYSTEM_IP}
- ${is_expired}= Check If Test Duration Is Expired
- [Return] ${is_expired}
-
-Check If Test Duration Is Expired
- [Documentation] Compares the current time with that of the suite variable ${end_time} to determine if the
- ... test duration has expired.
- ${test_is_expired}= Set Variable False
- ${current_time}= Get Current Date
- ${current_time}= Convert Date ${current_time} epoch
- ${test_is_expired}= Set Variable If "${current_time}" > "${end_time}" True
- [Return] ${test_is_expired}
-
-Longevity Suite Setup
- [Documentation] In addtion to opening the REST session to the controller, the ${end_time} that this
- ... test should not exceed is calculated and made in to a suite wide variable.
- Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML}
- Wait Until Keyword Succeeds 3x 1s KarafKeywords.Issue Command On Karaf Console log:set ${KARAF_LOG_LEVEL}
- ${start_time}= Get Current Date
- ${end_time}= Add Time To Date ${start_time} ${TEST_LENGTH}
- ${end_time}= Convert Date ${end_time} epoch
- Set Suite Variable ${end_time}
-
-Longevity Suite Teardown
- [Documentation] Any cleanup neccessary to allow this test to be run in a static environment should go here
- ... Currently, the same steps needed for the scalability suites should suffice.
- Scalability Suite Teardown
--- /dev/null
+*** Settings ***
+Documentation Beta Version of the Longevity Test. Currently it does a single test:
+... 1. runs one iteration of the link scale test based on ${NUM_SWITCHES}
+... Step 1 runs in a psuedo infinite loop and before each loop is
+... run, a time check is made against the ${TEST_LENGTH}. If the test duration
+... has expired, the loop is exited and the test is marked PASS
+Suite Setup Workflow Setup
+Suite Teardown Workflow Teardown
+Library DateTime
+Resource ../../../variables/Variables.robot
+Resource ../../../libraries/WorkflowsOpenFlow.robot
+Resource ../../../libraries/KarafKeywords.robot
+
+*** Variables ***
+${NUM_SWITCHES} 36
+${SUSTAIN_TIME} 60s
+${TEST_LENGTH} 2h
+
+*** Test Cases ***
+Longevity Test
+ [Documentation] Uses OpenFlow Full Mesh Topology workflow in a loop for given period of time ${TEST_LENGTH}
+ ${error_message}= Set Variable Fail initializing suite
+ ${switches}= Convert to Integer ${NUM_SWITCHES}
+ ${max_duration}= DateTime.Convert Time ${TEST_LENGTH} number
+ ${start_time}= DateTime.Get Current Date
+ # This loop is not infinite, so going "sufficiently large" for now.
+ : FOR ${i} IN RANGE 1 65536
+ \ ${status} ${error_message} ${topology_discover_time} WorkflowsOpenFlow.Workflow Full Mesh Topology ${switches} ${SUSTAIN_TIME}
+ \ ${current_time}= DateTime.Get Current Date
+ \ ${duration}= DateTime.Subtract Date From Date ${current_time} ${start_time} number
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ Exit For Loop If ${duration} > ${max_duration}
+ ${duration_compact}= DateTime.Convert Time ${duration} compact
+ Log to console ${\n}
+ Log To Console Execution stopped because: ${error_message}
+ Log To Console Test executed for ${duration_compact} seconds
+ Run Keyword If '${status}' == 'FAIL' Fail ${error_message}
+++ /dev/null
-*** Settings ***
-Documentation Beta Version of the Longevity Test. Currently:
-... 1. runs one iteration of the switch scale test based on ${NUM_SWITCHES}
-... 2. runs one iteration of the link scale test based on ${NUM_LINKS}
-... Steps 1 and 2 are run in a psuedo infinite loop and before each loop is
-... run, a time check is made against the ${TEST_LENGTH}. If the test duration
-... has expired, the loop is exited and the test is marked PASS
-...
-... If either of steps 1 or 2 fail to reach their configured value of ${NUM_SWITCHES}
-... or ${NUM_LINKS} the test will exit immediately and not continue.
-Suite Setup Longevity Suite Setup
-Suite Teardown Longevity Suite Teardown
-Library RequestsLibrary
-Library DateTime
-Variables ../../../variables/Variables.py
-Resource ../../../libraries/Scalability.robot
-
-*** Variables ***
-${NUM_SWITCHES} 200
-${NUM_LINKS} 20
-${TEST_LENGTH} 2 hours
-
-*** Test Cases ***
-Longevity Test
- [Documentation] Uses switch and link scale test functionality in a loop for given period of time
- # This loop is not infinite, so going "sufficiently large" for now.
- : FOR ${i} IN RANGE 1 65536
- \ ${expiration_flag}= Check If There Is A Reason To Exit Test Or If Duration Has Expired
- \ Exit For Loop If "${expiration_flag}" == "True"
- \ ${switch_count}= Find Max Switches ${NUM_SWITCHES} ${NUM_SWITCHES} ${NUM_SWITCHES}
- \ Check If There Is A Reason To Exit Test Or If Duration Has Expired ${switch_count} ${NUM_SWITCHES} Switch count not correct
- \ ${link_count}= Find Max Links ${NUM_LINKS} ${NUM_LINKS} ${NUM_LINKS}
- \ Check If There Is A Reason To Exit Test Or If Duration Has Expired ${link_count} ${NUM_LINKS} Link count not correct
-
-*** Keywords ***
-Check If There Is A Reason To Exit Test Or If Duration Has Expired
- [Arguments] ${comparator1}=1 ${comparator2}=1 ${comparator_failure_message}=null
- [Documentation] In order to simplify the main test case, this keyword will make all the neccessary checks
- ... to determine if the test should FAIL and quit because of some problem. It will also return a bool to
- ... indicate if the requested duration of the longevity test has elapsed. The caller does not have to use
- ... that return value.
- Should Be Equal ${comparator1} ${comparator2} ${comparator_failure_message}
- Verify Controller Is Not Dead ${ODL_SYSTEM_IP}
- ${is_expired}= Check If Test Duration Is Expired
- [Return] ${is_expired}
-
-Check If Test Duration Is Expired
- [Documentation] Compares the current time with that of the suite variable ${end_time} to determine if the
- ... test duration has expired.
- ${test_is_expired}= Set Variable False
- ${current_time}= Get Current Date
- ${current_time}= Convert Date ${current_time} epoch
- ${test_is_expired}= Set Variable If "${current_time}" > "${end_time}" True
- [Return] ${test_is_expired}
-
-Longevity Suite Setup
- [Documentation] In addtion to opening the REST session to the controller, the ${end_time} that this
- ... test should not exceed is calculated and made in to a suite wide variable.
- Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML}
- ${mininet_conn_id}= Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT}
- Login With Public Key ${TOOLS_SYSTEM_USER} ${USER_HOME}/.ssh/${SSH_KEY} any
- Log Copying ${CREATE_FULLYMESH_TOPOLOGY_FILE_PATH} file to Mininet VM
- Put File ${CURDIR}/../../../${CREATE_FULLYMESH_TOPOLOGY_FILE_PATH}
- Close Connection
- ${start_time}= Get Current Date
- ${end_time}= Add Time To Date ${start_time} ${TEST_LENGTH}
- ${end_time}= Convert Date ${end_time} epoch
- Set Suite Variable ${end_time}
-
-Longevity Suite Teardown
- [Documentation] Any cleanup neccessary to allow this test to be run in a static environment should go here
- ... Currently, the same steps needed for the scalability suites should suffice.
- Scalability Suite Teardown
*** Settings ***
Documentation Test suite for finding out max number of Links
-Suite Setup Link Scale Suite Setup
-Suite Teardown Scalability Suite Teardown
+Suite Setup Workflow Setup
+Suite Teardown Workflow Teardown
Library OperatingSystem
-Library RequestsLibrary
-Variables ../../../variables/Variables.py
-Resource ../../../libraries/Scalability.robot
+Resource ../../../variables/Variables.robot
+Resource ../../../libraries/WorkflowsOpenFlow.robot
+Resource ../../../libraries/KarafKeywords.robot
*** Variables ***
-${MIN_SWITCHES} 10
-${MAX_SWITCHES} 200
-${STEP_SWITCHES} 5
+@{SWITCH_LIST} ${16} ${32} ${40} ${48} ${52} ${56} ${60}
${LINKS_RESULT_FILE} links.csv
+${TIME_RESULT_FILE} time.csv
*** Test Cases ***
-Find Max Switch Links
+Find Max Links
[Documentation] Find max number of Links supported. Fully mesh topology starting from
... ${MIN_SWITCHES} switches till ${MAX_SWITCHES} switches will be attempted in steps of ${STEP_SWITCHES}
- Append To File ${LINKS_RESULT_FILE} Max Links \n
- ${max-links} Find Max Links ${MIN_SWITCHES} ${MAX_SWITCHES} ${STEP_SWITCHES}
- Log ${max-links}
- Append To File ${LINKS_RESULT_FILE} ${max-links}\n
-
-*** Keywords ***
-Link Scale Suite Setup
- [Documentation] Do initial steps for link scale tests
- Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML}
- ${mininet_conn_id}= Open Connection ${TOOLS_SYSTEM_IP} prompt=${DEFAULT_LINUX_PROMPT}
- Login With Public Key ${TOOLS_SYSTEM_USER} ${USER_HOME}/.ssh/${SSH_KEY} any
- Log Copying ${CREATE_FULLYMESH_TOPOLOGY_FILE_PATH} file to Mininet VM
- Put File ${CURDIR}/../../../${CREATE_FULLYMESH_TOPOLOGY_FILE_PATH}
- Close Connection
+ ${error_message}= Set Variable Fail initializing suite
+ ${maximum_links}= Set Variable ${0}
+ ${discover_time}= Set Variable 0
+ : FOR ${switches} IN @{SWITCH_LIST}
+ \ ${status} ${error_message} ${topology_discover_time} WorkflowsOpenFlow.Workflow Full Mesh Topology ${switches}
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ ${maximum_links}= Evaluate ${switches} * ${switches-1}
+ \ ${discover_time}= Set Variable ${topology_discover_time}
+ Log to console ${\n}
+ Log To Console Execution stopped because: ${error_message}
+ Log To Console Max Links: ${maximum_links}
+ OperatingSystem.Append To File ${LINKS_RESULT_FILE} Max Links\n
+ OperatingSystem.Append To File ${LINKS_RESULT_FILE} ${maximum_links}\n
+ OperatingSystem.Append To File ${TIME_RESULT_FILE} Discover Time\n
+ OperatingSystem.Append To File ${TIME_RESULT_FILE} ${discover_time}\n
*** Settings ***
Documentation Test suite for finding out max number of switches
-Suite Setup Create Session session http://${ODL_SYSTEM_IP}:${RESTCONFPORT} auth=${AUTH} headers=${HEADERS_XML}
-Suite Teardown Scalability Suite Teardown
+Suite Setup Workflow Setup
+Suite Teardown Workflow Teardown
Library OperatingSystem
-Library RequestsLibrary
-Variables ../../../variables/Variables.py
-Resource ../../../libraries/Scalability.robot
+Resource ../../../variables/Variables.robot
+Resource ../../../libraries/WorkflowsOpenFlow.robot
Resource ../../../libraries/KarafKeywords.robot
*** Variables ***
${MIN_SWITCHES} 100
-${MAX_SWITCHES} 500
+${MAX_SWITCHES} 800
${STEP_SWITCHES} 100
${SWITCHES_RESULT_FILE} switches.csv
+${TIME_RESULT_FILE} time.csv
*** Test Cases ***
Find Max Switches
[Documentation] Find max number of switches starting from ${MIN_SWITCHES} till reaching ${MAX_SWITCHES} in steps of ${STEP_SWITCHES}
- Wait Until Keyword Succeeds 3x 1s KarafKeywords.Issue Command On Karaf Console log:set ERROR
- Append To File ${SWITCHES_RESULT_FILE} Max Switches Linear Topo\n
- ${max-switches} Find Max Switches ${MIN_SWITCHES} ${MAX_SWITCHES} ${STEP_SWITCHES}
- Log ${max-switches}
- Append To File ${SWITCHES_RESULT_FILE} ${max-switches}\n
+ ${error_message}= Set Variable Fail initializing suite
+ ${maximum_switches}= Set Variable ${0}
+ ${discover_time}= Set Variable 0
+ ${start}= Convert to Integer ${MIN_SWITCHES}
+ ${stop}= Convert to Integer ${MAX_SWITCHES}
+ ${step}= Convert to Integer ${STEP_SWITCHES}
+ : FOR ${switches} IN RANGE ${start} ${stop+1} ${step}
+ \ ${status} ${error_message} ${topology_discover_time} WorkflowsOpenFlow.Workflow Linear Topology ${switches}
+ \ Exit For Loop If '${status}' == 'FAIL'
+ \ ${maximum_switches}= Set variable ${switches}
+ \ ${discover_time}= Set Variable ${topology_discover_time}
+ Log to console ${\n}
+ Log To Console Execution stopped because: ${error_message}
+ Log To Console Max Switches: ${maximum_switches}
+ OperatingSystem.Append To File ${SWITCHES_RESULT_FILE} Max Switches\n
+ OperatingSystem.Append To File ${SWITCHES_RESULT_FILE} ${maximum_switches}\n
+ OperatingSystem.Append To File ${TIME_RESULT_FILE} Discover Time\n
+ OperatingSystem.Append To File ${TIME_RESULT_FILE} ${discover_time}\n
# Place the suites in run order:
integration/test/csit/suites/openflowplugin/Maximum_Links
+integration/test/csit/suites/integration/Create_JVM_Plots.robot
# Place the suites in run order:
-integration/test/csit/suites/openflowplugin/Longevity/010__longevity_switches.robot
+integration/test/csit/suites/openflowplugin/Longevity/010__longevity_test.robot
integration/test/csit/suites/integration/Create_JVM_Plots.robot
+++ /dev/null
-# Place the suites in run order:
-integration/test/csit/suites/openflowplugin/Maximum_Switches/010__finding_max_switches.robot
# Place the suites in run order:
-integration/test/csit/suites/openflowplugin/Maximum_Switches/020__find_max_switches.robot
+integration/test/csit/suites/openflowplugin/Maximum_Switches/010__finding_max_switches.robot
+integration/test/csit/suites/integration/Create_JVM_Plots.robot
AUTH_TOKEN_API = '/oauth2/token'
REVOKE_TOKEN_API = '/oauth2/revoke'
-# Base Mininet Mac address. DPID of mininet switches will be derived from this.
-BASE_MAC_1 = '00:4b:00:00:00:00'
-# Base IP of mininet hosts
-BASE_IP_1 = '75.75.0.0'
-
# Vlan Custom Topology Path and File
CREATE_VLAN_TOPOLOGY_FILE = "vlan_vtn_test.py"
CREATE_VLAN_TOPOLOGY_FILE_PATH = "MininetTopo/" +\
CREATE_VLAN_TOPOLOGY_FILE
-# Mininet Custom Topology Path and File
-CREATE_FULLYMESH_TOPOLOGY_FILE = "create_fullymesh.py"
-CREATE_FULLYMESH_TOPOLOGY_FILE_PATH = "libraries/MininetTopo/" +\
- CREATE_FULLYMESH_TOPOLOGY_FILE
-
# Mininet Custom Topology Path and File for Path Policy
CREATE_PATHPOLICY_TOPOLOGY_FILE = "topo-3sw-2host_multipath.py"
CREATE_PATHPOLICY_TOPOLOGY_FILE_PATH = "MininetTopo/" +\
${ALERTMESSAGECOUNTRULERECORD} /restconf/config/alertrule:alertMessageCountRuleRecord/ # FIXME: Move to a separate Centinel-related Resource and add description.
@{AUTH} admin admin # Authentication tuple for accessing ODL RESTCONF server. TODO: Migrate most suites to TemplatedRequests, then chose a more descriptive name.
${AUTH_TOKEN_API} /oauth2/token # FIXME: Move to a separate AAA-related Resource and add description.
-${BASE_IP_1} 75.75.0.0 # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
-${BASE_MAC_1} 00:4b:00:00:00:00 # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
${BGP_TOOL_PORT} 17900 # Tool side of BGP communication listens on this port.
${BGPCEP_LOG_LEVEL} ${DEFAULT_BGPCEP_LOG_LEVEL} # Some suites temporarily override org.opendaylight.bgpcep Karaf log level to this value.
${CTRLS} controllers # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
${CONTAINER} default # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
${CONTROLLER} ${ODL_SYSTEM_IP} # Deprecated. FIXME: Eradicate.
${CONTROLLER_PASSWORD} ${ODL_SYSTEM_PASSWORD} # Deprecated. FIXME: Eradicate.
-${CONTROLLER_PROMPT} ${ODL_SYSTEM_PROMPT} # Deprecated. FIXME: Eradicate.
+${CONTROLLER_PROMPT} ${DEFAULT_LINUX_PROMPT} # Deprecated. FIXME: Eradicate.
${CONTROLLERS} ${ODL_SYSTEM_IP_LIST} # Deprecated. FIXME: Eradicate.
${CONTROLLER_CONFIG_MOUNT} /restconf/config/network-topology:network-topology/topology/topology-netconf/node/controller-config/yang-ext:mount # FIXME: Move to a separate Resource and add description.
${CONTROLLER_STOP_TIMEOUT} 120 # Max number of seconds test will wait for a controller to stop. FIXME: Hiden into a Resource and rename.
-${CREATE_FULLYMESH_TOPOLOGY_FILE} create_fullymesh.py # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
-${CREATE_FULLYMESH_TOPOLOGY_FILE_PATH} libraries/MininetTopo/${CREATE_FULLYMESH_TOPOLOGY_FILE} # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
${CREATE_PATHPOLICY_TOPOLOGY_FILE} topo-3sw-2host_multipath.py # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
${CREATE_PATHPOLICY_TOPOLOGY_FILE_PATH} MininetTopo/${CREATE_PATHPOLICY_TOPOLOGY_FILE} # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
${CREATE_VLAN_TOPOLOGY_FILE} vlan_vtn_test.py # A shorthand. FIXME: Find who uses this and eliminate, or at least add a good description.
@{ODL_SYSTEM_IP_LIST} ${ODL_SYSTEM_1_IP} ${ODL_SYSTEM_2_IP} ${ODL_SYSTEM_3_IP} # Deprecated. List of ODL cluster member IP addresses. See ClusterManagement.robot for alternatives.
${ODL_SYSTEM_USER} ${DEFAULT_USER} # Linux username specific for ODL systems.
${ODL_SYSTEM_PASSWORD} ${DEFAULT_PASSWORD} # Linux password (or empty to use public key) specific for ODL systems.
-${ODL_SYSTEM_PROMPT} ${DEFAULT_PROMPT} # Bash prompt substring specific for ODL systems.
+${ODL_SYSTEM_PROMPT} ${DEFAULT_LINUX_PROMPT} # Bash prompt substring specific for ODL systems.
${OPERATIONAL_API} /restconf/operational # FIXME: Move to a separate Resource and add description.
${OPERATIONS_API} /restconf/operations # FIXME: Move to a separate Resource and add description.
${OPERATIONAL_GBP_TENANTS_API} /restconf/operational/policy:tenants # FIXME: Move to a separate GroupBasedPolicy-related Resource and add description.
${PREDEFINE_ROLE_URI} /restconf/config/nemo-user:user-roles # FIXME: Move to a separate Nemo-related Resource and add description.
${PREFIX} http://${ODL_SYSTEM_IP}:${PORT} # Deprecated. FIXME: Name is to generic. Eradicate.
${PROTOCOL_LOG_LEVEL} ${DEFAULT_PROTOCOL_LOG_LEVEL} # Some suites temporarily override org.opendaylight.protocol Karaf log level to this value.
-${PWD} ${ODL_RESTCONF_PESSWORD} # Deprecated. FIXME: Eradicate.
+${PWD} ${ODL_RESTCONF_PASSWORD} # Deprecated. FIXME: Eradicate.
${REGISTER_TENANT_URI} /restconf/operations/nemo-intent:register-user # FIXME: Move to a separate Nemo-related Resource and add description.
${RESTCONFPORT} 8181 # Primary port for ODL RESTCONF, although 8080 should also work.
${RESTPORT} 8282 # Deprecated. Restconf port used by AD-SAL services. FIXME: Eradicate.