Refactor OpenFlow sw/link scalability and longevity tests
[integration/test.git] / csit / libraries / MininetKeywords.robot
1 *** Settings ***
2 Documentation     Mininet library. This library is useful for tests using mininet tool to simulate devices.
3 Library           SSHLibrary
4 Resource          Utils.robot
5 Resource          OVSDB.robot
6 Resource          ClusterManagement.robot
7 Variables         ../variables/Variables.py
8
9 *** Keywords ***
10 Start Mininet Single Controller
11     [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}
12     [Documentation]    Start Mininet with custom topology and connect to controller.
13     Log    Clear any existing mininet
14     Utils.Clean Mininet System    ${mininet}
15     ${mininet_conn_id}=    SSHLibrary.Open Connection    ${mininet}    prompt=${TOOLS_SYSTEM_PROMPT}    timeout=${timeout}
16     Set Suite Variable    ${mininet_conn_id}
17     Utils.Flexible Mininet Login
18     Run Keyword If    '${custom}' != '${EMPTY}'    Put File    ${custom}
19     Log    Start mininet ${options} to ${controller}
20     SSHLibrary.Write    sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options}
21     SSHLibrary.Read Until    mininet>
22     Log    Check OVS configuratiom
23     SSHLibrary.Write    sh ovs-vsctl show
24     SSHLibrary.Read Until    mininet>
25     [Return]    ${mininet_conn_id}
26
27 Start Mininet Multiple Controllers
28     [Arguments]    ${mininet}    ${controller_index_list}=${EMPTY}    ${options}=--topo tree,1 --switch ovsk,protocols=OpenFlow13    ${custom}=${EMPTY}    ${ofport}=${ODL_OF_PORT}    ${timeout}=${DEFAULT_TIMEOUT}
29     [Documentation]    Start Mininet with custom topology and connect to list of controllers in ${controller_index_list} or all if no list is provided.
30     ${index_list} =    ClusterManagement__Given_Or_Internal_Index_List    given_list=${controller_index_list}
31     Log    Clear any existing mininet
32     Utils.Clean Mininet System    ${mininet}
33     ${mininet_conn_id}=    SSHLibrary.Open Connection    ${mininet}    prompt=${TOOLS_SYSTEM_PROMPT}    timeout=${timeout}
34     Set Suite Variable    ${mininet_conn_id}
35     Utils.Flexible Mininet Login
36     Run Keyword If    '${custom}' != '${EMPTY}'    Put File    ${custom}
37     Log    Start mininet ${options}
38     SSHLibrary.Write    sudo mn ${options}
39     SSHLibrary.Read Until    mininet>
40     Log    Create controller configuration
41     ${controller_opt}=    Set Variable
42     : FOR    ${index}    IN    @{index_list}
43     \    ${controller_opt}=    Catenate    ${controller_opt}    ${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ofport}
44     \    Log    ${controller_opt}
45     Log    Find Number of OVS bridges
46     ${num_bridges}    Utils.Run Command On Mininet    ${mininet}    sudo ovs-vsctl show | grep Bridge | wc -l
47     ${num_bridges}=    Convert To Integer    ${num_bridges}
48     Log    Configure OVS controllers ${controller_opt} in all bridges
49     : FOR    ${i}    IN RANGE    1    ${num_bridges+1}
50     \    ${bridge}=    Utils.Run Command On Mininet    ${mininet}    sudo ovs-vsctl show | grep Bridge | cut -c 12- | sort | head -${i} | tail -1
51     \    OVSDB.Set Controller In OVS Bridge    ${mininet}    ${bridge}    ${controller_opt}
52     Log    Check OVS configuratiom
53     SSHLibrary.Write    sh ovs-vsctl show
54     SSHLibrary.Read Until    mininet>
55     [Return]    ${mininet_conn_id}
56
57 Send Mininet Command
58     [Arguments]    ${mininet_conn}=${EMPTY}    ${cmd}=help
59     [Documentation]    Sends Command ${cmd} to Mininet session ${mininet_conn} and returns read buffer response.
60     Run Keyword If    """${mininet_conn}""" != ""    SSHLibrary.Switch Connection    ${mininet_conn}
61     SSHLibrary.Write    ${cmd}
62     ${output}=    SSHLibrary.Read Until    mininet>
63     [Return]    ${output}
64
65 Send Mininet Command Multiple Sessions
66     [Arguments]    ${mininet_conn_list}    ${cmd}=help
67     [Documentation]    Sends Command ${cmd} to Mininet sessions in ${mininet_conn_list} and returns list of read buffer responses.
68     ${output_list}=    Create List
69     : FOR    ${mininet_conn}    IN    @{mininet_conn_list}
70     \    ${output}=    Utils.Send Mininet Command    ${mininet_conn}    ${cmd}
71     \    Append To List    ${output_list}    ${output}
72     [Return]    ${output_list}
73
74 Stop Mininet And Exit
75     [Arguments]    ${mininet_conn}=${EMPTY}
76     [Documentation]    Stops Mininet and exits session ${mininet_conn}
77     Run Keyword If    """${mininet_conn}""" != ""    SSHLibrary.Switch Connection    ${mininet_conn}
78     SSHLibrary.Write    exit
79     SSHLibrary.Read Until    ${TOOLS_SYSTEM_PROMPT}
80     SSHLibrary.Close Connection
81
82 Stop Mininet And Exit Multiple Sessions
83     [Arguments]    ${mininet_conn_list}
84     [Documentation]    Stops Mininet and exits sessions in ${mininet_conn_list}.
85     : FOR    ${mininet_conn}    IN    @{mininet_conn_list}
86     \    MininetKeywords.Stop Mininet And Exit    ${mininet_conn}
87
88 Verify Aggregate Flow From Mininet Session
89     [Arguments]    ${mininet_conn}=${EMPTY}    ${flow_count}=0    ${time_out}=0s
90     [Documentation]    Verify flow count per switch
91     Wait Until Keyword Succeeds    ${time_out}    2s    MininetKeywords.Mininet Sync Status    ${mininet_conn}    ${flow_count}
92
93 Mininet Sync Status
94     [Arguments]    ${mininet_conn}=${EMPTY}    ${flow_count}=0
95     [Documentation]    Sync with mininet to match exact number of flows
96     ${cmd} =    Set Variable    dpctl dump-aggregate -O OpenFlow13
97     ${output}=    MininetKeywords.Send Mininet Command    ${mininet_conn}    ${cmd}
98     ${flows}=    String.Get RegExp Matches    ${output}    (?<=flow_count\=).*?(?=\r)
99     ${total_flows}=    BuiltIn.Evaluate    sum(map(int, ${flows}))
100     Should Be Equal As Numbers    ${total_flows}    ${flow_count}