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