L3vpn test update
[integration/test.git] / csit / libraries / BgpOperations.robot
1 *** Settings ***
2 Documentation     This library contains keywords related to the BGP functionality.
3 Library           SSHLibrary
4 Library           String
5 Library           BgpRpcClient.py    ${TOOLS_SYSTEM_IP}
6 Resource          ../variables/Variables.robot
7 Resource          Utils.robot
8 Resource          KillPythonTool.robot
9 Resource          TemplatedRequests.robot
10
11 *** Variables ***
12 ${BGP_BMP_DIR}    ${CURDIR}/../variables/bgpfunctional/bmp_basic/filled_structure
13 ${BGP_BMP_FEAT_DIR}    ${CURDIR}/../variables/bgpfunctional/bmp_basic/empty_structure
14 ${BGP_RIB_URI}    ${OPERATIONAL_API}/bgp-rib:bgp-rib/rib/example-bgp-rib
15 ${BGP_TOPOLOGY_URI}    ${OPERATIONAL_TOPO_API}/topology/example-ipv4-topology
16 ${VAR_BASE_BGP}    ${CURDIR}/../variables/bgpfunctional
17 ${RIB_NAME}       example-bgp-rib
18 &{ADJ_RIB_IN}     PATH=peer/bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in    BGP_RIB=${RIB_NAME}
19 &{APP_PEER}       IP=${ODL_SYSTEM_IP}    BGP_RIB=${RIB_NAME}
20 &{EFFECTIVE_RIB_IN}    PATH=peer/bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in    BGP_RIB=${RIB_NAME}
21 &{LOC_RIB}        PATH=loc-rib    BGP_RIB=${RIB_NAME}
22
23 *** Keywords ***
24 Start Quagga Processes On ODL
25     [Arguments]    ${odl_ip}
26     [Documentation]    To start the zrpcd processes on ODL VM
27     ${conn_id}=    Open_Connection_To_ODL_System    ip_address=${odl_ip}
28     Switch Connection    ${conn_id}
29     Write Commands Until Expected Prompt    cd /opt/quagga/etc/    ${DEFAULT_LINUX_PROMPT_STRICT}
30     Write Commands Until Expected Prompt    sudo cp zebra.conf.sample zebra.conf    ${DEFAULT_LINUX_PROMPT_STRICT}
31     Write Commands Until Expected Prompt    sudo /opt/quagga/etc/init.d/zrpcd start    ${DEFAULT_LINUX_PROMPT_STRICT}
32     Write Commands Until Expected Prompt    ps -ef | grep zrpcd    ${DEFAULT_LINUX_PROMPT_STRICT}
33     Write Commands Until Expected Prompt    netstat -nap | grep 7644    ${DEFAULT_LINUX_PROMPT_STRICT}
34     Close Connection
35
36 Restart BGP Processes On ODL
37     [Arguments]    ${odl_ip}
38     [Documentation]    To restart the bgpd , qthriftd processes on ODL VM
39     ${conn_id} =    Open_Connection_To_ODL_System    ip_address=${odl_ip}
40     Switch Connection    ${conn_id}
41     Write Commands Until Expected Prompt    sudo pkill -f bgpd    ${DEFAULT_LINUX_PROMPT_STRICT}
42     Start Quagga Processes On ODL    ${odl_ip}
43
44 Start Quagga Processes On DCGW
45     [Arguments]    ${dcgw_ip}
46     [Documentation]    To start the zrpcd, bgpd,and zebra processes on DCGW
47     ${dcgw_conn_id} =    Open_Connection_To_Tools_System    ip_address=${dcgw_ip}
48     Switch Connection    ${dcgw_conn_id}
49     Write Commands Until Expected Prompt    cd /opt/quagga/etc/    ${DEFAULT_LINUX_PROMPT_STRICT}
50     Write Commands Until Expected Prompt    sudo cp zebra.conf.sample zebra.conf    ${DEFAULT_LINUX_PROMPT_STRICT}
51     Write Commands Until Expected Prompt    sudo /opt/quagga/etc/init.d/zrpcd start    ${DEFAULT_LINUX_PROMPT_STRICT}
52     Write Commands Until Expected Prompt    ps -ef | grep zrpcd    ${DEFAULT_LINUX_PROMPT_STRICT}
53     Write Commands Until Expected Prompt    cd /opt/quagga/sbin/    ${DEFAULT_LINUX_PROMPT_STRICT}
54     ${output} =    Write    sudo ./bgpd &
55     ${output} =    Read Until    pid
56     Log    ${output}
57     ${output} =    Write    sudo ./zebra &
58     ${output} =    Read
59     Log    ${output}
60     Write Commands Until Expected Prompt    ps -ef | grep bgpd    ${DEFAULT_LINUX_PROMPT_STRICT}
61     Write Commands Until Expected Prompt    ps -ef | grep zebra    ${DEFAULT_LINUX_PROMPT_STRICT}
62     Write Commands Until Expected Prompt    netstat -nap | grep 7644    ${DEFAULT_LINUX_PROMPT_STRICT}
63
64 Restart BGP Processes On DCGW
65     [Arguments]    ${dcgw_ip}
66     [Documentation]    To Restart the zrpcd, bgpd,and zebra processes on DCGW
67     ${dcgw_conn_id} =    Open_Connection_To_Tools_System    ip_address=${dcgw_ip}
68     Switch Connection    ${dcgw_conn_id}
69     Write Commands Until Expected Prompt    sudo pkill -f bgpd    ${DEFAULT_LINUX_PROMPT_STRICT}
70     Start Quagga Processes On DCGW    ${dcgw_ip}
71
72 Show Quagga Configuration On ODL
73     [Arguments]    ${odl_ip}    ${rd}
74     [Documentation]    Show quagga config from ODL
75     Create Quagga Telnet Session    ${odl_ip}    bgpd    sdncbgpc
76     Execute Command On Quagga Telnet Session    show running-config
77     Execute Command On Quagga Telnet Session    show bgp neighbors
78     Execute Command On Quagga Telnet Session    show ip bgp vrf ${rd}
79     Execute Command On Quagga Telnet Session    exit
80     Close Connection
81
82 Create Quagga Telnet Session
83     [Arguments]    ${ip}    ${user}    ${password}
84     [Documentation]    Create telnet session for Quagga
85     ${conn_id}=    Open_Connection_To_Tools_System    ip_address=${ip}
86     Switch Connection    ${conn_id}
87     ${output} =    Write    telnet localhost ${user}
88     ${output} =    Read Until    Password:
89     ${output} =    Write    ${password}
90     ${output} =    Read
91     ${output} =    Write    terminal length 512
92     ${output} =    Read
93
94 Execute Command On Quagga Telnet Session
95     [Arguments]    ${command}
96     [Documentation]    Execute command on Quagga telnet session(session should exist) and returns the output.
97     SSHLibrary.Write    ${command}
98     ${output} =    SSHLibrary.Read
99     Log    ${output}
100     [Return]    ${output}
101
102 Configure BGP And Add Neighbor On DCGW
103     [Arguments]    ${dcgw_ip}    ${as_id}    ${router_id}    ${neighbor_ip}    ${vrf_name}    ${rd}
104     ...    ${loopback_ip}
105     [Documentation]    Configure BGP and add neighbor on the dcgw
106     Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
107     Execute Command On Quagga Telnet Session    configure terminal
108     Execute Command On Quagga Telnet Session    router bgp ${as_id}
109     Execute Command On Quagga Telnet Session    bgp router-id ${router_id}
110     Execute Command On Quagga Telnet Session    redistribute static
111     Execute Command On Quagga Telnet Session    redistribute connected
112     Execute Command On Quagga Telnet Session    neighbor ${neighbor_ip} send-remote-as ${as_id}
113     Execute Command On Quagga Telnet Session    vrf ${vrf_name}
114     Execute Command On Quagga Telnet Session    rd ${rd}
115     Execute Command On Quagga Telnet Session    rt import ${rd}
116     Execute Command On Quagga Telnet Session    rt export ${rd}
117     Execute Command On Quagga Telnet Session    exit
118     Execute Command On Quagga Telnet Session    address-family vpnv4 unicast
119     Execute Command On Quagga Telnet Session    network ${loopback_ip}/32 rd ${rd} tag ${as_id}
120     Execute Command On Quagga Telnet Session    neighbor ${neighbor_ip} activate
121     Execute Command On Quagga Telnet Session    end
122     Execute Command On Quagga Telnet Session    show running-config
123     Execute Command On Quagga Telnet Session    exit
124
125 Add Loopback Interface On DCGW
126     [Arguments]    ${dcgw_ip}    ${loopback_name}    ${loopback_ip}    ${user}=zebra    ${password}=zebra
127     [Documentation]    Add loopback interface on DCGW
128     Create Quagga Telnet Session    ${dcgw_ip}    ${user}    ${password}
129     Execute Command On Quagga Telnet Session    enable
130     Execute Command On Quagga Telnet Session    ${password}
131     Execute Command On Quagga Telnet Session    configure terminal
132     Execute Command On Quagga Telnet Session    interface ${loopback_name}
133     Execute Command On Quagga Telnet Session    ip address ${loopback_ip}/32
134     Execute Command On Quagga Telnet Session    exit
135     Execute Command On Quagga Telnet Session    end
136     Execute Command On Quagga Telnet Session    show running-config
137     Execute Command On Quagga Telnet Session    exit
138
139 Execute Show Command On Quagga
140     [Arguments]    ${dcgw_ip}    ${cmd}    ${user}=bgpd    ${password}=sdncbgpc
141     [Documentation]    Execute command on quagga and returns the ouput.
142     Create Quagga Telnet Session    ${dcgw_ip}    ${user}    ${password}
143     ${output} =    Execute Command On Quagga Telnet Session    ${cmd}
144     Log    ${output}
145     Execute Command On quagga Telnet Session    exit
146     [Return]    ${output}
147
148 Verify BGP Neighbor Status On Quagga
149     [Arguments]    ${dcgw_ip}    ${neighbor_ip}
150     [Documentation]    Verify bgp neighbor status on quagga
151     ${output} =    Execute Show Command On quagga    ${dcgw_ip}    show bgp neighbors ${neighbor_ip}
152     Log    ${output}
153     Should Contain    ${output}    BGP state = Established
154
155 Verify Routes On Quagga
156     [Arguments]    ${dcgw_ip}    ${rd}    ${ip_list}
157     [Documentation]    Verify routes on quagga
158     ${output} =    Execute Show Command On quagga    ${dcgw_ip}    show ip bgp vrf ${rd}
159     Log    ${output}
160     : FOR    ${ip}    IN    @{ip_list}
161     \    Should Contain    ${output}    ${ip}
162
163 Delete BGP Config On Quagga
164     [Arguments]    ${dcgw_ip}    ${bgp_id}    ${user}=bgpd    ${password}=sdncbgpc
165     [Documentation]    Delete BGP Config on Quagga
166     Create Quagga Telnet Session    ${dcgw_ip}    ${user}    ${password}
167     Execute Command On Quagga Telnet Session    configure terminal
168     Execute Command On Quagga Telnet Session    no router bgp ${bgp_id}
169     Execute Command On Quagga Telnet Session    end
170     ${output} =    Execute Command On Quagga Telnet Session    show running-config
171     Execute Command On Quagga Telnet Session    exit
172     [Return]    ${output}
173
174 Create L3VPN on DCGW
175     [Arguments]    ${dcgw_ip}    ${as_id}    ${vpn_name}    ${rd}
176     [Documentation]    Creating L3VPN on DCGW
177     BgpOperations.Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
178     BgpOperations.Execute Command On Quagga Telnet Session    configure terminal
179     BgpOperations.Execute Command On Quagga Telnet Session    router bgp ${as_id}
180     BgpOperations.Execute Command On Quagga Telnet Session    vrf ${vpn_name}
181     BgpOperations.Execute Command On Quagga Telnet Session    rd ${rd}
182     BgpOperations.Execute Command On Quagga Telnet Session    rt export ${rd}
183     BgpOperations.Execute Command On Quagga Telnet Session    rt import ${rd}
184     BgpOperations.Execute Command On Quagga Telnet Session    end
185
186 Delete L3VPN on DCGW
187     [Arguments]    ${dcgw_ip}    ${as_id}    @{vpns}
188     [Documentation]    Deleting L3VPN on DCGW
189     BgpOperations.Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
190     BgpOperations.Execute Command On Quagga Telnet Session    configure terminal
191     BgpOperations.Execute Command On Quagga Telnet Session    router bgp ${as_id}
192     : FOR    ${vpn}    IN    @{vpns}
193     \    BgpOperations.Execute Command On Quagga Telnet Session    no vrf ${vpn}
194     BgpOperations.Execute Command On Quagga Telnet Session    end
195
196 Verify L3VPN On DCGW
197     [Arguments]    ${dcgw_ip}    ${vpn_name}    ${rd}
198     [Documentation]    Verify L3VPN vrf name and rd value on DCGW
199     ${output} =    BgpOperations.Execute Show Command On Quagga    ${dcgw_ip}    show running-config
200     BuiltIn.Should Contain    ${output}    vrf ${vpn_name}
201     BuiltIn.Should Contain    ${output}    rd ${rd}
202
203 Add Routes On DCGW
204     [Arguments]    ${dcgw_ip}    ${rd}    ${network_ip}    ${label}
205     [Documentation]    Add routes on DCGW
206     BgpOperations.Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
207     BgpOperations.Execute Command On Quagga Telnet Session    configure terminal
208     BgpOperations.Execute Command On Quagga Telnet Session    router bgp ${AS_ID}
209     BgpOperations.Execute Command On Quagga Telnet Session    address-family vpnv4 unicast
210     BgpOperations.Execute Command On Quagga Telnet Session    network ${network_ip}/32 rd ${rd} tag ${label}
211     BgpOperations.Execute Command On Quagga Telnet Session    end
212
213 Create BGP Configuration On ODL
214     [Arguments]    &{Kwargs}
215     [Documentation]    Associate the created L3VPN to a network-id received as dictionary argument
216     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/create_bgp    mapping=${Kwargs}    session=session
217
218 AddNeighbor To BGP Configuration On ODL
219     [Arguments]    &{Kwargs}
220     [Documentation]    Associate the created L3VPN to a network-id received as dictionary argument
221     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/addNeighbor_bgp    mapping=${Kwargs}    session=session
222
223 Get BGP Configuration On ODL
224     [Arguments]    ${odl_session}
225     [Documentation]    Get bgp configuration
226     ${resp} =    RequestsLibrary.Get Request    ${odl_session}    ${CONFIG_API}/ebgp:bgp/
227     Log    ${resp.content}
228     [Return]    ${resp.content}
229
230 Delete BGP Configuration On ODL
231     [Arguments]    ${odl_session}
232     [Documentation]    Delete BGP
233     ${resp} =    RequestsLibrary.Delete Request    ${odl_session}    ${CONFIG_API}/ebgp:bgp/
234     Log    ${resp.content}
235     Should Be Equal As Strings    ${resp.status_code}    200
236     [Return]    ${resp.content}
237
238 Create External Tunnel Endpoint Configuration
239     [Arguments]    &{Kwargs}
240     [Documentation]    Create Tunnel End point
241     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/create_etep    mapping=${Kwargs}    session=session
242
243 Delete External Tunnel Endpoint Configuration
244     [Arguments]    &{Kwargs}
245     [Documentation]    Delete Tunnel End point
246     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/delete_etep    mapping=${Kwargs}    session=session
247
248 Get External Tunnel Endpoint Configuration
249     [Arguments]    ${ip}
250     [Documentation]    Get bgp configuration
251     ${resp} =    RequestsLibrary.Get Request    session    ${CONFIG_API}/itm:dc-gateway-ip-list/dc-gateway-ip/${ip}/
252     Log    ${resp.content}
253     [Return]    ${resp.content}
254
255 Teardown_Everything
256     [Documentation]    Create and Log the diff between expected and actual responses, make sure Python tool was killed.
257     ...    Tear down imported Resources.
258     KillPythonTool.Search_And_Kill_Remote_Python    'play\.py'
259     RequestsLibrary.Delete_All_Sessions
260     SSHLibrary.Close_All_Connections
261
262 Check_Example_Bgp_Rib_Content
263     [Arguments]    ${session}    ${substr}    ${error_message}=${JSONKEYSTR} not found, but expected.
264     [Documentation]    Check the example-bgp-rib content for string
265     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_RIB_URI}
266     BuiltIn.Log    ${response.status_code}
267     BuiltIn.Log    ${response.text}
268     BuiltIn.Should_Contain    ${response.text}    ${substr}    ${error_message}    values=False
269
270 Check_Example_Bgp_Rib_Does_Not_Contain
271     [Arguments]    ${session}    ${substr}    ${error_message}=${JSONKEYSTR} found, but not expected.
272     [Documentation]    Check the example-bgp-rib does not contain the string
273     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_RIB_URI}
274     BuiltIn.Log    ${response.status_code}
275     BuiltIn.Log    ${response.text}
276     BuiltIn.Should_Not_Contain    ${response.text}    ${substr}    ${error_message}    values=False
277
278 Check_Example_IPv4_Topology_Content
279     [Arguments]    ${session}    ${string_to_check}=${EMPTY}
280     [Documentation]    Check the example-ipv4-topology content for string
281     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_TOPOLOGY_URI}
282     BuiltIn.Log    ${response.status_code}
283     BuiltIn.Log    ${response.text}
284     BuiltIn.Should_Contain    ${response.text}    ${string_to_check}
285
286 Check_Example_IPv4_Topology_Does_Not_Contain
287     [Arguments]    ${session}    ${string_to_check}
288     [Documentation]    Check the example-ipv4-topology does not contain the string
289     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_TOPOLOGY_URI}
290     BuiltIn.Log    ${response.status_code}
291     BuiltIn.Log    ${response.text}
292     BuiltIn.Should_Not_Contain    ${response.text}    ${string_to_check}
293
294 Bmp_Monitor_Precondition
295     [Arguments]    ${session}
296     [Documentation]    Verify example-bmp-monitor presence in bmp-monitors
297     &{mapping}    BuiltIn.Create_Dictionary    TOOL_IP=${TOOLS_SYSTEM_IP}
298     BuiltIn.Wait_Until_Keyword_Succeeds    6x    10s    TemplatedRequests.Get_As_Json_Templated    folder=${BGP_BMP_FEAT_DIR}    mapping=${mapping}    verify=True
299     ...    session=${session}
300
301 Bmp_Monitor_Postcondition
302     [Arguments]    ${session}
303     [Documentation]    Verifies if example-bmp-monitor data contains one peer.
304     &{mapping}    BuiltIn.Create_Dictionary    TOOL_IP=${TOOLS_SYSTEM_IP}
305     ${output}    BuiltIn.Wait_Until_Keyword_Succeeds    10x    5s    TemplatedRequests.Get_As_Json_Templated    folder=${BGP_BMP_DIR}    mapping=${mapping}
306     ...    session=${session}    verify=True
307     BuiltIn.Log    ${output}
308
309 Odl_To_Play_Template
310     [Arguments]    ${totest}    ${dir}    ${remove}=True
311     ${announce_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/announce_${totest}.hex
312     ${announce_hex} =    String.Remove_String    ${announce_hex}    \n
313     ${withdraw_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/withdraw_${totest}.hex
314     ${withdraw_hex} =    String.Remove_String    ${withdraw_hex}    \n
315     BuiltIn.Run_Keyword_If    '${remove}' == 'True'    BgpRpcClient.play_clean
316     TemplatedRequests.Post_As_Xml_Templated    ${dir}/${totest}/app    mapping=${APP_PEER}    session=${CONFIG_SESSION}
317     ${update}    BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    Get_Update_Message
318     BuiltIn.Should_Be_Equal_As_Strings    ${update}    ${announce_hex}
319     BgpRpcClient.play_clean
320     Remove_Configured_Routes    ${totest}    ${dir}
321     ${update}    BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    Get_Update_Message
322     BuiltIn.Should_Be_Equal_As_Strings    ${update}    ${withdraw_hex}
323     [Teardown]    Remove_Configured_Routes    ${totest}    ${dir}
324
325 Play_To_Odl_Template
326     [Arguments]    ${totest}    ${dir}    ${ipv}=ipv4
327     ${announce_hex}=    OperatingSystem.Get_File    ${dir}/${totest}/announce_${totest}.hex
328     ${withdraw_hex}=    OperatingSystem.Get_File    ${dir}/${totest}/withdraw_${totest}.hex
329     BgpRpcClient.play_clean
330     BgpRpcClient.play_send    ${announce_hex}
331     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${ADJ_RIB_IN}    session=${CONFIG_SESSION}
332     ...    verify=True
333     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${EFFECTIVE_RIB_IN}    session=${CONFIG_SESSION}
334     ...    verify=True
335     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${LOC_RIB}    session=${CONFIG_SESSION}
336     ...    verify=True
337     BgpRpcClient.play_send    ${withdraw_hex}
338     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/empty_routes/${ipv}    mapping=${LOC_RIB}    session=${CONFIG_SESSION}
339     ...    verify=True
340     [Teardown]    BgpRpcClient.play_send    ${withdraw_hex}
341
342 Play_To_Odl_Non_Removal_Template
343     [Arguments]    ${totest}    ${dir}    ${ipv}=ipv4
344     ${announce_hex}=    OperatingSystem.Get_File    ${dir}/${totest}/announce_${totest}.hex
345     BgpRpcClient.play_clean
346     BgpRpcClient.play_send    ${announce_hex}
347     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${LOC_RIB}    session=${CONFIG_SESSION}
348     ...    verify=True
349
350 Get_Update_Message
351     [Documentation]    Returns hex update message.
352     ${update} =    BgpRpcClient.play_get
353     BuiltIn.Should_Not_Be_Equal    ${update}    ${Empty}
354     [Return]    ${update}
355
356 Remove_Configured_Routes
357     [Arguments]    ${totest}    ${dir}
358     [Documentation]    Removes the route if present.
359     BuiltIn.Run_Keyword_And_Ignore_Error    TemplatedRequests.Delete_Templated    ${dir}/${totest}/app    mapping=${APP_PEER}    session=${CONFIG_SESSION}