Eliminate CONTROLLER and MININET in BGPCEP suites
[integration/test.git] / csit / suites / bgpcep / bgpingest / bgp_app_peer_prefixcount.robot
1 *** Settings ***
2 Documentation     BGP performance of ingesting from 1 BGP application peer
3 ...
4 ...               Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
5 ...
6 ...               This program and the accompanying materials are made available under the
7 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
8 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
9 ...
10 ...               Test suite performs basic BGP performance test cases for
11 ...               BGP application peer. BGP application peer introduces routes -
12 ...               using restconf - in two steps:
13 ...               1. introduces the ${PREFILL} number of routes in one POST request
14 ...               2. POSTs the rest of routes (up to the ${COUNT} number) one by one
15 ...               Test suite checks that the prefixes are propagated to
16 ...               IPv4 topology and announced to BGP peer via updates. Test case
17 ...               where the BGP peer is disconnected and reconnected and all routes
18 ...               are deleted by BGP application peer are performed as well.
19 ...               Brief description how to configure BGP application peer and
20 ...               how to use restconf application peer interface:
21 ...               https://wiki.opendaylight.org/view/BGP_LS_PCEP:User_Guide#BGP_Application_Peer
22 ...               https://wiki.opendaylight.org/view/BGP_LS_PCEP:Programmer_Guide#BGP
23 ...               http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#bgp-peering
24 ...               http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#application-peer-configuration
25 ...
26 ...               The bgp peer configuration depends on the ${ODL_STREAM}. For "boron" and older streams it uses netconf connector and
27 ...               for carbon and further it configures peer via openconfig.
28 ...
29 ...               Reported bugs:
30 ...               Bug 4689 - Not a reasonable duration of 1M prefix introduction from BGP application peer via restconf
31 ...               Bug 4791 - BGPSessionImpl: Failed to send message Update logged even all UPDATE mesages received by iBGP peer
32 Suite Setup       Setup_Everything
33 Suite Teardown    Teardown_Everything
34 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
35 Test Teardown     SetupUtils.Teardown_Test_Show_Bugs_And_Start_Fast_Failing_If_Test_Failed
36 Force Tags        critical
37 Library           SSHLibrary    timeout=10s
38 Library           RequestsLibrary
39 Variables         ${CURDIR}/../../../variables/Variables.py
40 Resource          ${CURDIR}/../../../libraries/BGPcliKeywords.robot
41 Resource          ${CURDIR}/../../../libraries/BGPSpeaker.robot
42 Resource          ${CURDIR}/../../../libraries/FailFast.robot
43 Resource          ${CURDIR}/../../../libraries/KillPythonTool.robot
44 Resource          ${CURDIR}/../../../libraries/PrefixCounting.robot
45 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
46 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
47 Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
48
49 *** Variables ***
50 ${BGP_VARIABLES_FOLDER}    ${CURDIR}/../../../variables/bgpuser/
51 ${HOLDTIME}       180
52 ${HOLDTIME_APP_PEER_PREFIX_COUNT}    ${HOLDTIME}
53 ${COUNT}          200000
54 ${PREFILL}        100000
55 ${COUNT_APP_PEER_PREFIX_COUNT}    ${COUNT}
56 ${CHECK_PERIOD}    1
57 ${CHECK_PERIOD_APP_PEER_PREFIX_COUNT}    ${CHECK_PERIOD}
58 ${REPETITIONS_APP_PEER_PREFIX_COUNT}    1
59 ${BGP_PEER_LOG_LEVEL}    info
60 ${BGP_APP_PEER_LOG_LEVEL}    info
61 ${ODL_LOG_LEVEL}    INFO
62 ${ODL_BGP_LOG_LEVEL}    DEFAULT
63 ${BGP_PEER_COMMAND}    python play.py --amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --${BGP_PEER_LOG_LEVEL}
64 ${BGP_PEER_OPTIONS}    &>bgp_peer.log
65 ${BGP_APP_PEER_ID}    10.0.0.10
66 ${BGP_APP_PEER_INITIAL_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command post --count ${PREFILL} --prefix 8.0.0.0 --prefixlen 28 --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
67 ${BGP_APP_PEER_PUT_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command put --count ${PREFILL} --prefix 8.0.0.0 --prefixlen 28 --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
68 ${BGP_APP_PEER_DELETE_ALL_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command delete-all --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
69 ${BGP_APP_PEER_GET_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command get --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
70 ${BGP_APP_PEER_OPTIONS}    &>bgp_app_peer.log
71 ${TEST_DURATION_MULTIPLIER}    30
72 ${last_prefix_count}    -1
73 ${DEVICE_NAME}    controller-config
74 ${BGP_PEER_NAME}    example-bgp-peer
75 ${RIB_INSTANCE}    example-bgp-rib
76 ${PROTOCOL_OPENCONFIG}    ${RIB_INSTANCE}
77
78 *** Test Cases ***
79 Check_For_Empty_Ipv4_Topology_Before_Starting
80     [Documentation]    Wait for example-ipv4-topology to come up and empty. Give large timeout for case when BGP boots slower than restconf.
81     BuiltIn.Wait_Until_Keyword_Succeeds    120s    1s    PrefixCounting.Check_Ipv4_Topology_Is_Empty
82
83 Reconfigure_ODL_To_Accept_Connection
84     [Documentation]    Configure BGP peer module with initiate-connection set to false.
85     &{mapping}    Create Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    HOLDTIME=${HOLDTIME_APP_PEER_PREFIX_COUNT}    PEER_PORT=${BGP_TOOL_PORT}
86     ...    INITIATE=false    BGP_RIB=${RIB_INSTANCE}    PASSIVE_MODE=true    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}    RIB_INSTANCE_NAME=${RIB_INSTANCE}
87     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    mapping=${mapping}
88
89 Reconfigure_ODL_To_Accept_BGP_Application_Peer
90     [Documentation]    Configure BGP application peer module.
91     &{mapping}    Create Dictionary    DEVICE_NAME=${DEVICE_NAME}    NAME=example-bgp-peer-app    RIB_INSTANCE_NAME=${RIB_INSTANCE}    IP=${BGP_APP_PEER_ID}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
92     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_application_peer    mapping=${mapping}
93
94 Connect_BGP_Peer
95     [Documentation]    Start BGP peer tool
96     SSHLibrary.Switch Connection    bgp_peer_console
97     Start_Console_Tool    ${BGP_PEER_COMMAND}    ${BGP_PEER_OPTIONS}
98     Read_And_Fail_If_Prompt_Is_Seen
99
100 BGP_Application_Peer_Prefill_Routes
101     [Documentation]    Start BGP application peer tool and prefill routes.
102     SSHLibrary.Switch Connection    bgp_app_peer_console
103     Start_Console_Tool    ${BGP_APP_PEER_INITIAL_COMMAND} ${script_uri_opt}    ${BGP_APP_PEER_OPTIONS}
104     Wait_Until_Console_Tool_Finish    ${bgp_filling_timeout}
105     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_prefill.log
106
107 Wait_For_Ipv4_Topology_Is_Prefilled
108     [Documentation]    Wait until example-ipv4-topology reaches the target prfix count.
109     BuiltIn.Wait Until Keyword Succeeds    ${bgp_filling_timeout}    10s    PrefixCounting.Check_Ipv4_Topology_Count    ${PREFILL}
110
111 Check_Bgp_Peer_Updates_For_Prefilled_Routes
112     [Documentation]    Count the routes introduced by updates.
113     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Fast_Failing
114     BuiltIn.Wait Until Keyword Succeeds    ${bgp_filling_timeout}    1s    Check_File_For_Word_Count    bgp_peer.log    total_received_nlri_prefix_counter: ${PREFILL}    2
115
116 BGP_Application_Peer_Introduce_Single_Routes
117     [Documentation]    Start BGP application peer tool and introduce routes.
118     SSHLibrary.Switch Connection    bgp_app_peer_console
119     Start_Console_Tool    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command add --count ${remaining_prefixes} --prefix 12.0.0.0 --prefixlen 28 --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM} ${script_uri_opt}    ${BGP_APP_PEER_OPTIONS}
120     Wait_Until_Console_Tool_Finish    ${bgp_filling_timeout}
121     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_singles.log
122
123 Wait_For_Ipv4_Topology_Is_Filled
124     [Documentation]    Wait until example-ipv4-topology reaches the target prfix count.
125     BuiltIn.Wait Until Keyword Succeeds    ${bgp_filling_timeout}    10s    PrefixCounting.Check_Ipv4_Topology_Count    ${COUNT_APP_PEER_PREFIX_COUNT}
126
127 Check_Bgp_Peer_Updates_For_All_Routes
128     [Documentation]    Count the routes introduced by updates.
129     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Fast_Failing
130     BuiltIn.Wait Until Keyword Succeeds    ${bgp_filling_timeout}    1s    Check_File_For_Word_Count    bgp_peer.log    total_received_nlri_prefix_counter: ${COUNT_APP_PEER_PREFIX_COUNT}    2
131
132 Disconnect_BGP_Peer
133     [Documentation]    Stop BGP peer tool
134     SSHLibrary.Switch Connection    bgp_peer_console
135     Stop_Console_Tool
136     Store_File_To_Workspace    bgp_peer.log    bgp_peer_reconnect.log
137
138 Reconnect_BGP_Peer
139     [Documentation]    Start BGP peer tool
140     SSHLibrary.Switch Connection    bgp_peer_console
141     Start_Console_Tool    ${BGP_PEER_COMMAND}    ${BGP_PEER_OPTIONS}
142     Read_And_Fail_If_Prompt_Is_Seen
143
144 Check_Bgp_Peer_Updates_For_Reintroduced_Routes
145     [Documentation]    Count the routes introduced by updates.
146     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Fast_Failing
147     BuiltIn.Wait Until Keyword Succeeds    ${bgp_filling_timeout}    1s    Check_File_For_Word_Count    bgp_peer.log    total_received_nlri_prefix_counter: ${COUNT_APP_PEER_PREFIX_COUNT}    2
148
149 BGP_Application_Peer_Delete_All_Routes
150     [Documentation]    Start BGP application peer tool and delete all routes.
151     SSHLibrary.Switch Connection    bgp_app_peer_console
152     Start_Console_Tool    ${BGP_APP_PEER_DELETE_ALL_COMMAND} ${script_uri_opt}    ${BGP_APP_PEER_OPTIONS}
153     Wait_Until_Console_Tool_Finish    ${bgp_emptying_timeout}
154     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_delete_all.log
155
156 Wait_For_Stable_Topology_After_Deletion
157     [Documentation]    Wait until example-ipv4-topology becomes stable again.
158     PrefixCounting.Wait_For_Ipv4_Topology_Prefixes_To_Become_Stable    timeout=${bgp_emptying_timeout}    period=${CHECK_PERIOD_APP_PEER_PREFIX_COUNT}    repetitions=${REPETITIONS_APP_PEER_PREFIX_COUNT}    excluded_count=${COUNT_APP_PEER_PREFIX_COUNT}
159
160 Check_For_Empty_Ipv4_Topology_After_Deleting
161     [Documentation]    Example-ipv4-topology should be empty now.
162     PrefixCounting.Check_Ipv4_Topology_Is_Empty
163
164 Check_Bgp_Peer_Updates_For_Prefix_Withdrawals
165     [Documentation]    Count the routes withdrawn by updates.
166     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Fast_Failing
167     BuiltIn.Wait Until Keyword Succeeds    ${bgp_emptying_timeout}    1s    Check_File_For_Word_Count    bgp_peer.log    total_received_withdrawn_prefix_counter: ${COUNT_APP_PEER_PREFIX_COUNT}    2
168
169 Stop_BGP_Peer
170     [Documentation]    Stop BGP peer tool
171     SSHLibrary.Switch Connection    bgp_peer_console
172     Stop_Console_Tool
173     Store_File_To_Workspace    bgp_peer.log    bgp_peer_reconnect.log
174
175 Delete_Bgp_Peer_Configuration
176     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
177     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
178     TemplatedRequests.Delete_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    mapping=${mapping}
179
180 Delete_Bgp_Application_Peer_Configuration
181     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
182     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    NAME=example-bgp-peer-app    IP=${BGP_APP_PEER_ID}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
183     TemplatedRequests.Delete_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_application_peer    mapping=${mapping}
184
185 Check_Bug_4791
186     [Documentation]    Check controller's log for errors
187     Check Karaf Log File Does Not Have Messages    ${ODL_SYSTEM_IP}    Failed to send message Update
188
189 *** Keywords ***
190 Setup_Everything
191     [Documentation]    Setup imported resources, SSH-login to tools system,
192     ...    create HTTP session, put Python tool to tools system.
193     SetupUtils.Setup_Utils_For_Setup_And_Teardown
194     TemplatedRequests.Create_Default_Session
195     PrefixCounting.PC_Setup
196     SSHLibrary.Set_Default_Configuration    prompt=${TOOLS_SYSTEM_PROMPT}
197     RequestsLibrary.Create_Session    operational    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${OPERATIONAL_API}    auth=${AUTH}
198     # TODO: Do not include slash in ${OPERATIONAL_TOPO_API}, having it typed here is more readable.
199     # TODO: Alternatively, create variable in Variables which starts with http.
200     # Both TODOs would probably need to update every suite relying on current Variables.
201     Open_BGP_Peer_Console
202     Open_BGP_Aplicationp_Peer_Console
203     SSHKeywords.Require_Python
204     SSHKeywords.Assure_Library_Ipaddr    target_dir=.
205     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/play.py
206     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/bgp_app_peer.py
207     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/ipv4-routes-template.xml*
208     # Calculate the timeout value based on how many routes are going to be pushed.
209     # The offset (20) is set for keeping reasonable timeout for low COUNT values.
210     ${timeout} =    BuiltIn.Evaluate    ${TEST_DURATION_MULTIPLIER} * ${COUNT_APP_PEER_PREFIX_COUNT} * 3.0 / 10000 + 20
211     Builtin.Set_Suite_Variable    ${bgp_filling_timeout}    ${timeout}
212     Builtin.Set_Suite_Variable    ${bgp_emptying_timeout}    ${bgp_filling_timeout*3.0/4}
213     ${result} =    BuiltIn.Evaluate    str(int(${COUNT_APP_PEER_PREFIX_COUNT}) - int(${PREFILL}))
214     Builtin.Set_Suite_Variable    ${remaining_prefixes}    ${result}
215     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${ODL_LOG_LEVEL}
216     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.bgpcep
217     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.protocol
218     ${script_uri_opt}=    CompareStream.Set_Variable_If_At_Most_Boron    ${Empty}    --uri config/bgp-rib:application-rib/${BGP_APP_PEER_ID}/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/
219     BuiltIn.Set_Suite_Variable    ${script_uri_opt}
220
221 Teardown_Everything
222     [Documentation]    Make sure Python tool was killed and tear down imported Resources.
223     SSHLibrary.Switch Connection    bgp_peer_console
224     KillPythonTool.Search_And_Kill_Remote_Python    'play\.py'
225     KillPythonTool.Search_And_Kill_Remote_Python    'bgp_app_peer\.py'
226     RequestsLibrary.Delete_All_Sessions
227     SSHLibrary.Close_All_Connections
228
229 Open_BGP_Peer_Console
230     [Documentation]    Create a session for BGP peer.
231     SSHLibrary.Open_Connection    ${TOOLS_SYSTEM_IP}    alias=bgp_peer_console
232     Utils.Flexible_Mininet_Login
233
234 Open_BGP_Aplicationp_Peer_Console
235     [Documentation]    Create a session for BGP peer.
236     SSHLibrary.Open_Connection    ${TOOLS_SYSTEM_IP}    alias=bgp_app_peer_console
237     Utils.Flexible_Mininet_Login