Add Clustered Reconciliation tests openflowplugin
[integration/test.git] / csit / suites / openflowplugin / Clustered_Reconciliation / 010_Group_Flows.robot
1 *** Settings ***
2 Documentation     Switch connections and cluster are restarted.
3 Suite Setup       Initialization Phase
4 Suite Teardown    Final Phase
5 Library           RequestsLibrary
6 Resource          ../../../libraries/ClusterManagement.robot
7 Resource          ../../../libraries/ClusterOpenFlow.robot
8 Resource          ../../../libraries/TemplatedRequests.robot
9 Resource          ../../../libraries/MininetKeywords.robot
10 Resource          ../../../libraries/FlowLib.robot
11 Resource          ../../../libraries/Utils.robot
12 Resource          ../../../variables/Variables.robot
13
14 *** Variables ***
15 ${SWITCHES}       3
16 ${ITER}           100
17 ${VAR_DIR}        ${CURDIR}/../../../variables/openflowplugin
18
19 *** Test Cases ***
20 Enable Stale Flow Entry
21     [Documentation]    Enable stale flow entry feature.
22     # Stale flows/groups feature is only available in Boron onwards.
23     CompareStream.Run Keyword If At Least Boron    TemplatedRequests.Put As Json Templated    folder=${VAR_DIR}/frm-config    mapping={"STALE":"true"}    session=session
24
25 Add Group 1 In Every Switch
26     [Documentation]    Add ${ITER} groups of type 1 in every switch.
27     : FOR    ${switch}    IN RANGE    1    ${switches+1}
28     \    TemplatedRequests.Post As Json Templated    folder=${VAR_DIR}/add-group-1    mapping={"SWITCH":"${switch}"}    session=session    iterations=${iter}
29
30 Add Group 2 In Every Switch
31     [Documentation]    Add ${ITER} groups of type 2 in every switch.
32     : FOR    ${switch}    IN RANGE    1    ${switches+1}
33     \    TemplatedRequests.Post As Json Templated    folder=${VAR_DIR}/add-group-2    mapping={"SWITCH":"${switch}"}    session=session    iterations=${iter}
34
35 Add Flow to Group 2 In Every Switch
36     [Documentation]    Add ${ITER} flows to group type 2 in every switch.
37     : FOR    ${switch}    IN RANGE    1    ${switches+1}
38     \    TemplatedRequests.Post As Json Templated    folder=${VAR_DIR}/add-flow    mapping={"SWITCH":"${switch}"}    session=session    iterations=${ITER}
39
40 Start Mininet Multiple Connections
41     [Documentation]    Start mininet linear with connection to all cluster instances.
42     ${mininet_conn_id}=    MininetKeywords.Start Mininet Multiple Controllers    ${TOOLS_SYSTEM_IP}    ${ClusterManagement__member_index_list}    --topo linear,${SWITCHES} --switch ovsk,protocols=OpenFlow13
43     BuiltIn.Set Suite Variable    ${mininet_conn_id}
44     BuiltIn.Wait Until Keyword Succeeds    10s    1s    OVSDB.Check OVS OpenFlow Connections    ${TOOLS_SYSTEM_IP}    ${SWITCHES*3}
45
46 Check Linear Topology
47     [Documentation]    Check Linear Topology.
48     BuiltIn.Wait Until Keyword Succeeds    30s    1s    FlowLib.Check Linear Topology    ${SWITCHES}
49
50 Check Flows In Operational DS
51     [Documentation]    Check Groups after mininet starts.
52     BuiltIn.Wait Until Keyword Succeeds    30s    1s    FlowLib.Check Number Of Flows    ${all_flows}
53
54 Check Groups In Operational DS
55     [Documentation]    Check Flows after mininet starts.
56     FlowLib.Check Number Of Groups    ${all_groups}
57
58 Check Flows In Switch
59     [Documentation]    Check Flows after mininet starts.
60     MininetKeywords.Check Flows In Mininet    ${mininet_conn_id}    ${all_flows}
61
62 Disconnect Mininet From Cluster
63     [Documentation]    Disconnect Mininet from Cluster.
64     Disconnect Cluster Mininet
65
66 Check No Switches After Disconnect
67     [Documentation]    Check no switches in topology.
68     BuiltIn.Wait Until Keyword Succeeds    30s    1s    FlowLib.Check No Switches In Topology    ${SWITCHES}
69
70 Remove Flows And Groups While Mininet Is Disconnected
71     [Documentation]    Remove some groups and flows while network is down.
72     : FOR    ${switch}    IN RANGE    1    ${switches+1}
73     \    RequestsLibrary.Delete Request    session    ${CONFIG_NODES_API}/node/openflow:${switch}/table/0/flow/1
74     \    RequestsLibrary.Delete Request    session    ${CONFIG_NODES_API}/node/openflow:${switch}/group/1
75     \    RequestsLibrary.Delete Request    session    ${CONFIG_NODES_API}/node/openflow:${switch}/group/1000
76
77 Reconnect Mininet To Cluster
78     [Documentation]    Reconnect mininet to cluster by removing Iptables drop rules that were used to disconnect
79     Disconnect Cluster Mininet    restore
80
81 Check Linear Topology After Mininet Reconnects
82     [Documentation]    Check Linear Topology.
83     BuiltIn.Wait Until Keyword Succeeds    30s    1s    FlowLib.Check Linear Topology    ${SWITCHES}
84
85 Check Flows In Operational DS After Mininet Reconnects
86     [Documentation]    Check Flows after mininet starts.
87     BuiltIn.Wait Until Keyword Succeeds    30s    1s    FlowLib.Check Number Of Flows    ${less_flows}
88
89 Check Groups In Operational DS After Mininet Reconnects
90     [Documentation]    Check Flows after mininet starts.
91     FlowLib.Check Number Of Groups    ${less_groups}
92
93 Check Flows In Switch After Mininet Reconnects
94     [Documentation]    Check Flows after mininet starts.
95     MininetKeywords.Check Flows In Mininet    ${mininet_conn_id}    ${less_flows}
96
97 Restart Cluster
98     [Documentation]    Stop and Start cluster.
99     # Try to stop contoller, if stop does not work or takes too long, kill controller.
100     ${status}    ${result}=    BuiltIn.Run Keyword And Ignore Error    ClusterManagement.Stop_Members_From_List_Or_All
101     BuiltIn.Run Keyword If    '${status}' != 'PASS'    ClusterManagement.Kill_Members_From_List_Or_All
102     ClusterManagement.Start_Members_From_List_Or_All    wait_for_sync=False
103
104 Check Linear Topology After Controller Restarts
105     [Documentation]    Check Linear Topology.
106     BuiltIn.Wait Until Keyword Succeeds    300s    2s    FlowLib.Check Linear Topology    ${SWITCHES}
107
108 Check Flows In Operational DS After Controller Restarts
109     [Documentation]    Check Flows after mininet starts.
110     BuiltIn.Wait Until Keyword Succeeds    300s    2s    FlowLib.Check Number Of Flows    ${less_flows}
111
112 Check Groups In Operational DS After Controller Restarts
113     [Documentation]    Check Flows after mininet starts.
114     FlowLib.Check Number Of Groups    ${less_groups}
115
116 Check Flows In Switch After Controller Restarts
117     [Documentation]    Check Flows after mininet starts.
118     MininetKeywords.Check Flows In Mininet    ${mininet_conn_id}    ${less_flows}
119
120 Stop Mininet
121     [Documentation]    Stop Mininet.
122     MininetKeywords.Stop Mininet And Exit
123
124 Check No Switches
125     [Documentation]    Check no switches in topology.
126     BuiltIn.Wait Until Keyword Succeeds    5s    1s    FlowLib.Check No Switches In Topology    ${SWITCHES}
127
128 *** Keywords ***
129 Initialization Phase
130     [Documentation]    Create controller session and set variables.
131     ClusterManagement.ClusterManagement_Setup
132     # Still need to open controller HTTP session with name session because of old FlowLib.robot library dependency.
133     RequestsLibrary.Create Session    session    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}
134     ${switches}    Convert To Integer    ${SWITCHES}
135     ${iter}    Convert To Integer    ${ITER}
136     ${all_groups}=    BuiltIn.Evaluate    ${switches} * ${iter} * 2
137     ${less_groups}=    BuiltIn.Evaluate    ${all_groups} - ${switches} * 2
138     # Stale flows/groups feature enabled in Boron onwards.
139     ${less_groups}=    CompareStream.Set Variable If At Least Boron    ${less_groups}    ${all_groups}
140     ${all_flows}=    BuiltIn.Evaluate    ${switches} * ${iter+1}
141     ${less_flows}=    BuiltIn.Evaluate    ${all_flows} - ${switches}
142     # Stale flows/groups feature enabled in Boron onwards.
143     ${less_flows}=    CompareStream.Set Variable If At Least Boron    ${less_flows}    ${all_flows}
144     BuiltIn.Set Suite Variable    ${switches}
145     BuiltIn.Set Suite Variable    ${iter}
146     BuiltIn.Set Suite Variable    ${all_groups}
147     BuiltIn.Set Suite Variable    ${less_groups}
148     BuiltIn.Set Suite Variable    ${all_flows}
149     BuiltIn.Set Suite Variable    ${less_flows}
150     BuiltIn.Set Suite Variable    ${no_flows}    ${SWITCHES}
151
152 Final Phase
153     [Documentation]    Delete all sessions.
154     ${command} =    BuiltIn.Set Variable    sudo iptables -v -F
155     Utils.Run Command On Controller    cmd=${command}
156     CompareStream.Run Keyword If At Least Boron    TemplatedRequests.Put As Json Templated    folder=${VAR_DIR}/frm-config    mapping={"STALE":"false"}    session=session
157     BuiltIn.Run Keyword And Ignore Error    RequestsLibrary.Delete Request    session    ${CONFIG_NODES_API}
158     RequestsLibrary.Delete All Sessions
159
160 Disconnect Cluster Mininet
161     [Arguments]    ${action}=break    ${member_index_list}=${EMPTY}
162     [Documentation]    Break and restore controller to mininet connection via iptables.
163     ${index_list} =    ClusterManagement.List_Indices_Or_All    given_list=${member_index_list}
164     : FOR    ${index}    IN    @{index_list}
165     \    ${rule} =    BuiltIn.Set Variable    OUTPUT -p all --source ${ODL_SYSTEM_${index}_IP} --destination ${TOOLS_SYSTEM_IP} -j DROP
166     \    ${command} =    BuiltIn.Set Variable If    '${action}'=='restore'    sudo /sbin/iptables -D ${rule}    sudo /sbin/iptables -I ${rule}
167     \    Log To Console    ${ODL_SYSTEM_${index}_IP}
168     \    Utils.Run Command On Controller    ${ODL_SYSTEM_${index}_IP}    cmd=${command}
169     \    ${command} =    BuiltIn.Set Variable    sudo /sbin/iptables -L -n
170     \    ${output} =    Utils.Run Command On Controller    cmd=${command}
171     \    BuiltIn.Log    ${output}