Update Robot Framework format - step 3
[integration/test.git] / csit / suites / bgpcep / bgpfunct / 040_bgp_functional_route_ref.robot
index 15bfaf33011f81f7e8cebed91bf80d63c920930b..87adc23ba67ad6cce985abdf14ed7c3fdc5653f4 100644 (file)
 *** Settings ***
-Documentation     Functional test for bgp - route refresh
+Documentation       Functional test for bgp - route refresh
 ...
-...               Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+...                 Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
 ...
-...               This program and the accompanying materials are made available under the
-...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
-...               and is available at http://www.eclipse.org/legal/epl-v10.html
+...                 This program and the accompanying materials are made available under the
+...                 terms of the Eclipse Public License v1.0 which accompanies this distribution,
+...                 and is available at http://www.eclipse.org/legal/epl-v10.html
 ...
-...               This suite tests sending and receiveing route request message.
-...               It uses odl and exabgp as bgp peers.
-...               Sending route refresh message from odl is initiated via restconf.
-...               If route refresh received by odl also correct advertising of routes
-...               is verified. Receiving of route refresh by odl is verified by
-...               checking appropriate message counter via ${JOLOKURL}. Feature
-...               odl-jolokia is required by this test suite.
-Suite Setup       Start_Suite
-Suite Teardown    Stop_Suite
-Library           RequestsLibrary
-Library           SSHLibrary
-Variables         ${CURDIR}/../../../variables/Variables.py
-Resource          ${CURDIR}/../../../libraries/Utils.robot
-Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
-Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
-Resource          ${CURDIR}/../../../libraries/KarafKeywords.robot
-Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
-Library           ${CURDIR}/../../../libraries/norm_json.py
-Library           ${CURDIR}/../../../libraries/BgpRpcClient.py    ${TOOLS_SYSTEM_IP}
+...                 This suite tests sending and receiveing route refresh message.
+...                 It uses odl and exabgp as bgp peers.
+...                 Sending route refresh message from odl is initiated via restconf.
+...                 If route refresh is received by odl, correct advertising of routes
+...                 is verified. Receiving of route refresh by odl is verified by
+...                 checking appropriate message counter via odl-bgpcep-bgp-cli and
+...                 restconf using BGP neighbor operational state
+
+Library             RequestsLibrary
+Library             SSHLibrary
+Library             String
+Library             ../../../libraries/BgpRpcClient.py    ${TOOLS_SYSTEM_IP}
+Resource            ../../../libraries/CompareStream.robot
+Resource            ../../../libraries/ExaBgpLib.robot
+Resource            ../../../libraries/KarafKeywords.robot
+Resource            ../../../libraries/SetupUtils.robot
+Resource            ../../../libraries/SSHKeywords.robot
+Resource            ../../../libraries/TemplatedRequests.robot
+Resource            ../../../variables/Variables.robot
+
+Suite Setup         Start_Suite
+Suite Teardown      Stop_Suite
+Test Setup          SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+
 
 *** Variables ***
-${HOLDTIME}       180
-${DEVICE_NAME}    controller-config
-${BGP_PEER_NAME}    example-bgp-peer
-${RIB_INSTANCE}    example-bgp-rib
-${APP_PEER_NAME}    example-bgp-peer-app
-${CMD}            env exabgp.tcp.port=1790 exabgp --debug
-${BGP_VAR_FOLDER}    ${CURDIR}/../../../variables/bgpfunctional
-${BGP_RR_VAR_FOLDER}    ${BGP_VAR_FOLDER}/route_refresh
-${BGP_CFG_NAME}    exa.cfg
-${CONFIG_SESSION}    config-session
-${EXARPCSCRIPT}    ${CURDIR}/../../../../tools/exabgp_files/exarpc.py
-${JOLOKURL}       /jolokia/read/org.opendaylight.controller:instanceName=${BGP_PEER_NAME},type=RuntimeBean,moduleFactoryName=bgp-peer
-${PEER_CHECK_URL}    /restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/peer/bgp:%2F%2F
+${APP_PEER_NAME}            example-bgp-peer-app
+${BGP_CFG_NAME}             exa.cfg
+${BGP_PEER_NAME}            example-bgp-peer
+${BGP_RR_VAR_FOLDER}        ${BGP_VAR_FOLDER}/route_refresh
+${BGP_VAR_FOLDER}           ${CURDIR}/../../../variables/bgpfunctional
+${CONFIG_SESSION}           config-session
+${DEVICE_NAME}              controller-config
+${EXARPCSCRIPT}             ${CURDIR}/../../../../tools/exabgp_files/exarpc.py
+${HOLDTIME}                 180
+${PROTOCOL_OPENCONFIG}      ${RIB_INSTANCE}
+${RIB_INSTANCE}             example-bgp-rib
+${MSG_STATE_OFFSET}         24
+
 
 *** Test Cases ***
 Configure_App_Peer
-    [Documentation]    Configure bgp application peer
-    KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
-    &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    APP_PEER_NAME=${APP_PEER_NAME}    RIB_INSTANCE_NAME=${RIB_INSTANCE}    APP_PEER_ID=${ODL_SYSTEM_IP}
-    TemplatedRequests.Put_As_Xml_Templated    ${BGP_VAR_FOLDER}/app_peer    mapping=${mapping}    session=${CONFIG_SESSION}
+    [Documentation]    Configures bgp application peer. Openconfig is used for carbon and above.
+    &{mapping}    BuiltIn.Create_Dictionary
+    ...    DEVICE_NAME=${DEVICE_NAME}
+    ...    APP_PEER_NAME=${APP_PEER_NAME}
+    ...    RIB_INSTANCE_NAME=${RIB_INSTANCE}
+    ...    APP_PEER_ID=${ODL_SYSTEM_IP}
+    ...    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
+    ...    IP=${ODL_SYSTEM_IP}
+    TemplatedRequests.Put_As_Xml_Templated
+    ...    ${BGP_VAR_FOLDER}/app_peer
+    ...    mapping=${mapping}
+    ...    session=${CONFIG_SESSION}
 
 Reconfigure_ODL_To_Accept_Connection
-    [Documentation]    Configure BGP peer module with initiate-connection set to false.
-    KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
-    &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    HOLDTIME=${HOLDTIME}    PEER_PORT=${BGP_TOOL_PORT}
-    ...    INITIATE=false    RIB_INSTANCE_NAME=${RIB_INSTANCE}
-    TemplatedRequests.Put_As_Xml_Templated    ${BGP_VAR_FOLDER}/bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
+    [Documentation]    Configures BGP peer module with initiate-connection set to false.
+    &{mapping}    BuiltIn.Create_Dictionary
+    ...    DEVICE_NAME=${DEVICE_NAME}
+    ...    BGP_NAME=${BGP_PEER_NAME}
+    ...    IP=${TOOLS_SYSTEM_IP}
+    ...    HOLDTIME=${HOLDTIME}
+    ...    PEER_PORT=${BGP_TOOL_PORT}
+    ...    INITIATE=false
+    ...    RIB_INSTANCE_NAME=${RIB_INSTANCE}
+    ...    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
+    ...    PASSIVE_MODE=true
+    TemplatedRequests.Put_As_Xml_Templated
+    ...    ${BGP_VAR_FOLDER}/bgp_peer
+    ...    mapping=${mapping}
+    ...    session=${CONFIG_SESSION}
 
-Exa_To_Send_Route_Request
+Exa_To_Send_Route_Refresh
     [Documentation]    Exabgp sends route refresh and count received updates
-    [Setup]    Configure_Routes_And_Start_Tool    ${BGP_CFG_NAME}
-    Verify_Odl_Received_Route_Request    0
+    [Tags]    critical
+    [Setup]    Configure_Routes_And_Start_ExaBgp    ${BGP_CFG_NAME}
     BgpRpcClient.exa_clean_received_update_count
     BgpRpcClient.exa_announce    announce route-refresh ipv4 unicast
-    BuiltIn.Wait_Until_Keyword_Succeeds    5x    2s    Verify_Odl_Received_Route_Request    1
-    BuiltIn.Wait_Until_Keyword_Succeeds    5x    2s    Verify_Tool_Received_Updates    ${nr_configured_routes}
-    [Teardown]    Deconfigure_Routes_And_Stop_Tool
+    Comment    From neon onwards there are extra BGP End-Of-RIB message
+    ${update_count}    CompareStream.Set_Variable_If_At_Most_Fluorine    2    3
+    BuiltIn.Wait_Until_Keyword_Succeeds    5x    2s    Verify_ExaBgp_Received_Updates    ${update_count}
+    Comment    From neon onwards there are extra BGP End-Of-RIB message per address family
+    ${update_count}    CompareStream.Set_Variable_If_At_Most_Fluorine    4    7
+    BuiltIn.Wait_Until_Keyword_Succeeds
+    ...    3x
+    ...    5s
+    ...    Verify_Odl_Operational_State_Count
+    ...    notification_count=0
+    ...    update_count=${update_count}
+    ...    receive_count=2
+    [Teardown]    Deconfigure_Routes_And_Stop_ExaBgp
 
-Odl_To_Send_Route_Request
-    [Documentation]    Sends route requests and checks if exabgp receives it
-    [Setup]    Start_Tool_And_Verify_Connected    ${BGP_CFG_NAME}
+Odl_To_Send_Route_Refresh
+    [Documentation]    Sends route refresh request and checks if exabgp receives it
+    [Tags]    critical
+    [Setup]    ExaBgpLib.Start_ExaBgp_And_Verify_Connected    ${BGP_CFG_NAME}    ${CONFIG_SESSION}    ${TOOLS_SYSTEM_IP}
     BgpRpcClient.exa_clean_received_route_refresh_count
     &{mapping}    BuiltIn.Create_Dictionary    BGP_PEER_IP=${TOOLS_SYSTEM_IP}
-    TemplatedRequests.Post_As_Xml_Templated    ${BGP_VAR_FOLDER}/route_refresh    mapping=${mapping}    session=${CONFIG_SESSION}
-    BuiltIn.Wait_Until_Keyword_Succeeds    5x    2s    Verify_Odl_Sent_Route_Request    1
-    [Teardown]    Stop_Tool
+    TemplatedRequests.Post_As_Xml_Templated
+    ...    ${BGP_VAR_FOLDER}/route_refresh
+    ...    mapping=${mapping}
+    ...    session=${CONFIG_SESSION}
+    BuiltIn.Wait_Until_Keyword_Succeeds    5x    2s    Verify_ExaBgp_Received_Route_Refresh    1
+    Comment    From neon onwards there are extra BGP End-Of-RIB message per address family
+    ${update_count}    CompareStream.Set_Variable_If_At_Most_Fluorine    4    9
+    BuiltIn.Wait_Until_Keyword_Succeeds
+    ...    3x
+    ...    5s
+    ...    Verify_Odl_Operational_State_Count
+    ...    notification_count=1
+    ...    update_count=${update_count}
+    ...    receive_count=4
+    [Teardown]    ExaBgpLib.Stop_ExaBgp
 
 Delete_Bgp_Peer_Configuration
     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
-    KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
-    &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}
+    &{mapping}    BuiltIn.Create_Dictionary
+    ...    DEVICE_NAME=${DEVICE_NAME}
+    ...    BGP_NAME=${BGP_PEER_NAME}
+    ...    IP=${TOOLS_SYSTEM_IP}
+    ...    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
     TemplatedRequests.Delete_Templated    ${BGP_VAR_FOLDER}/bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
 
 Deconfigure_App_Peer
     [Documentation]    Revert the BGP configuration to the original state: without application peer
-    KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
-    &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    APP_PEER_NAME=${APP_PEER_NAME}
+    &{mapping}    BuiltIn.Create_Dictionary
+    ...    DEVICE_NAME=${DEVICE_NAME}
+    ...    APP_PEER_NAME=${APP_PEER_NAME}
+    ...    IP=${ODL_SYSTEM_IP}
+    ...    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
     TemplatedRequests.Delete_Templated    ${BGP_VAR_FOLDER}/app_peer    mapping=${mapping}    session=${CONFIG_SESSION}
 
+
 *** Keywords ***
 Start_Suite
-    [Documentation]    Suite setup keyword
+    [Documentation]    Suite setup keyword.
     SetupUtils.Setup_Utils_For_Setup_And_Teardown
-    ${mininet_conn_id}=    SSHLibrary.Open Connection    ${TOOLS_SYSTEM_IP}    prompt=${DEFAULT_LINUX_PROMPT}    timeout=6s
+    ${mininet_conn_id}    SSHLibrary.Open Connection
+    ...    ${TOOLS_SYSTEM_IP}
+    ...    prompt=${DEFAULT_LINUX_PROMPT}
+    ...    timeout=6s
     Builtin.Set_Suite_Variable    ${mininet_conn_id}
-    Utils.Flexible_Mininet_Login    ${TOOLS_SYSTEM_USER}
+    SSHKeywords.Flexible_Mininet_Login    ${TOOLS_SYSTEM_USER}
     SSHKeywords.Virtual_Env_Create
+    SSHKeywords.Virtual_Env_Install_Package    setuptools==44.0.0
     SSHKeywords.Virtual_Env_Install_Package    exabgp==3.4.16
     RequestsLibrary.Create_Session    ${CONFIG_SESSION}    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}
     Upload_Config_Files
@@ -109,81 +166,101 @@ Upload_Config_Files
     [Documentation]    Uploads exabgp config files
     SSHLibrary.Put_File    ${BGP_VAR_FOLDER}/${BGP_CFG_NAME}    .
     SSHLibrary.Put_File    ${EXARPCSCRIPT}    .
-    @{cfgfiles}=    SSHLibrary.List_Files_In_Directory    .    *.cfg
-    : FOR    ${cfgfile}    IN    @{cfgfiles}
-    \    SSHLibrary.Execute_Command    sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}
-    \    SSHLibrary.Execute_Command    sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}
-    \    SSHLibrary.Execute_Command    sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}
-    \    SSHLibrary.Execute_Command    sed -i -e 's/ADDPATH/disable/g' ${cfgfile}
-    \    ${stdout}=    SSHLibrary.Execute_Command    cat ${cfgfile}
-    \    Log    ${stdout}
-
-Start_Tool
-    [Arguments]    ${cfg_file}    ${mapping}={}
-    [Documentation]    Start the tool ${cmd} ${cfg_file}
-    ${start_cmd}    BuiltIn.Set_Variable    ${cmd} ${cfg_file}
-    BuiltIn.Log    ${start_cmd}
-    SSHKeywords.Virtual_Env_Activate_On_Current_Session    log_output=${True}
-    ${output}=    SSHLibrary.Write    ${start_cmd}
-    BuiltIn.Log    ${output}
-
-Verify_Tools_Connection
-    [Arguments]    ${connected}=${True}
-    [Documentation]    Checks peer presence in operational datastore
-    ${exp_status_code}=    BuiltIn.Set_Variable_If    ${connected}    ${200}    ${404}
-    ${rsp}=    RequestsLibrary.Get Request    ${CONFIG_SESSION}    ${PEER_CHECK_URL}${TOOLS_SYSTEM_IP}
-    BuiltIn.Log    ${rsp.content}
-    BuiltIn.Should_Be_Equal_As_Numbers    ${exp_status_code}    ${rsp.status_code}
+    @{cfgfiles}    SSHLibrary.List_Files_In_Directory    .    *.cfg
+    FOR    ${cfgfile}    IN    @{cfgfiles}
+        SSHLibrary.Execute_Command    sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}
+        SSHLibrary.Execute_Command    sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}
+        SSHLibrary.Execute_Command    sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}
+        SSHLibrary.Execute_Command    sed -i -e 's/ADDPATH/disable/g' ${cfgfile}
+        ${stdout}    SSHLibrary.Execute_Command    cat ${cfgfile}
+        Log    ${stdout}
+    END
 
-Start_Tool_And_Verify_Connected
+Configure_Routes_And_Start_ExaBgp
+    [Documentation]    Setup keyword for exa to odl test case
     [Arguments]    ${cfg_file}
-    [Documentation]    Start the tool and verify its connection
-    KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
-    Start_Tool    ${cfg_file}
-    BuiltIn.Wait_Until_Keyword_Succeeds    3x    3s    Verify_Tools_Connection    connected=${True}
-
-Stop_Tool
-    [Documentation]    Stop the tool by sending ctrl+c
-    ${output}=    SSHLibrary.Read
-    BuiltIn.Log    ${output}
-    Utils.Write_Bare_Ctrl_C
-    ${output}=    SSHLibrary.Read_Until_Prompt
-    BuiltIn.Log    ${output}
-    SSHKeywords.Virtual_Env_Deactivate_On_Current_Session    log_output=${True}
+    ${app_rib}    Set Variable    ${ODL_SYSTEM_IP}
+    FOR    ${prefix}    IN    1.1.1.1/32    2.2.2.2/32
+        &{mapping}    BuiltIn.Create_Dictionary    PREFIX=${prefix}    APP_RIB=${app_rib}
+        TemplatedRequests.Post_As_Xml_Templated
+        ...    ${BGP_RR_VAR_FOLDER}/route
+        ...    mapping=${mapping}
+        ...    session=${CONFIG_SESSION}
+    END
+    ExaBgpLib.Start_ExaBgp_And_Verify_Connected    ${cfg_file}    ${CONFIG_SESSION}    ${TOOLS_SYSTEM_IP}
+    Comment    From neon onwards there are extra BGP End-Of-RIB message per address family
+    ${update_count}    CompareStream.Set_Variable_If_At_Most_Fluorine    2    4
+    BuiltIn.Wait_Until_Keyword_Succeeds    3x    3s    Verify_ExaBgp_Received_Updates    ${update_count}
 
-Configure_Routes_And_Start_Tool
-    [Arguments]    ${cfg_file}
-    [Documentation]    Setup keyword for exa to odl test case
-    : FOR    ${prefix}    IN    1.1.1.1/32    2.2.2.2/32
-    \    &{mapping}    BuiltIn.Create_Dictionary    PREFIX=${prefix}
-    \    TemplatedRequests.Post_As_Xml_Templated    ${BGP_RR_VAR_FOLDER}/route    mapping=${mapping}    session=${CONFIG_SESSION}
-    BuiltIn.Set_Suite_Variable    ${nr_configured_routes}    2
-    Start_Tool_And_Verify_Connected    ${cfg_file}
-    BuiltIn.Wait_Until_Keyword_Succeeds    3x    3s    Verify_Tool_Received_Updates    ${nr_configured_routes}
-
-Deconfigure_Routes_And_Stop_Tool
+Deconfigure_Routes_And_Stop_ExaBgp
     [Documentation]    Teardown keyword for exa to odl test case
-    Stop_Tool
-    &{mapping}    BuiltIn.Create_Dictionary    PREFIX=${prefix}
+    ExaBgpLib.Stop_ExaBgp
+    ${app_rib}    Set Variable    ${ODL_SYSTEM_IP}
+    &{mapping}    BuiltIn.Create_Dictionary    PREFIX=${prefix}    APP_RIB=${app_rib}
     TemplatedRequests.Delete_Templated    ${BGP_RR_VAR_FOLDER}/route    mapping=${mapping}    session=${CONFIG_SESSION}
 
-Verify_Odl_Sent_Route_Request
+Verify_ExaBgp_Received_Updates
+    [Documentation]    Gets number of received update requests and compares with given expected count
     [Arguments]    ${expcount}
+    ${count_recv}    BgpRpcClient.exa_get_received_update_count
+    BuiltIn.Should Be Equal As Numbers    ${count_recv}    ${expcount}
+
+Verify_ExaBgp_Received_Route_Refresh
     [Documentation]    Compares expected count of route request messages on exabgp side
-    ${count}=    BgpRpcClient.exa_get_received_route_refresh_count
+    [Arguments]    ${expcount}
+    ${count}    BgpRpcClient.exa_get_received_route_refresh_count
     BuiltIn.Should Be Equal As Numbers    ${count}    ${expcount}
 
-Verify_Odl_Received_Route_Request
-    [Arguments]    ${expcount}
-    [Documentation]    Gets numebr of received route requests and compares with given expected count
-    ${rsp}=    RequestsLibrary.Get_Request    ${CONFIG_SESSION}    ${JOLOKURL}
-    BuiltIn.Log    ${rsp.content}
-    BuiltIn.Should_Be_Equal_As_Numbers    ${rsp.status_code}    200
-    BuiltIn.Should_Be_Equal_As_Numbers    ${rsp.json()['status']}    200
-    BuiltIn.Should_Be_Equal_As_Numbers    ${rsp.json()['value']['BgpSessionState']['messagesStats']['routeRefreshMsgs']['received']['count']['value']}    ${expcount}
-
-Verify_Tool_Received_Updates
-    [Arguments]    ${expcount}
-    [Documentation]    Gets numebr of received update requests and compares with given expected count
-    ${count_recv}=    BgpRpcClient.exa_get_received_update_count
-    BuiltIn.Should Be Equal As Numbers    ${count_recv}    ${expcount}
+Verify_Odl_Operational_State_Count
+    [Documentation]    Check notification and update count gained from operatial neighbor state
+    ...    On versions oxygen and above, it verifies these counts also against cli output.
+    [Arguments]    ${notification_count}    ${update_count}    ${receive_count}
+    &{mapping}    BuiltIn.Create_Dictionary
+    ...    IP=${TOOLS_SYSTEM_IP}
+    ...    RIB_INSTANCE_NAME=${RIB_INSTANCE}
+    ...    NOT_COUNT=${notification_count}
+    ...    SEND_COUNT=${update_count}
+    ...    RECV_COUNT=${receive_count}
+    ${ret}    BuiltIn.Wait_Until_Keyword_Succeeds
+    ...    3x
+    ...    5s
+    ...    TemplatedRequests.Get_As_Json_Templated
+    ...    folder=${BGP_RR_VAR_FOLDER}/operational_state
+    ...    mapping=${mapping}
+    ...    session=${CONFIG_SESSION}
+    ...    verify=True
+    BuiltIn.Log    ${ret}
+    BuiltIn.Wait_Until_Keyword_Succeeds
+    ...    3x
+    ...    5s
+    ...    Verify_Cli_Output_Count
+    ...    ${notification_count}
+    ...    ${update_count}
+    ...    ${receive_count}
+
+Verify_Cli_Output_Count
+    [Documentation]    Checks notification and update count from odl-bgpcep-bgp-cli.
+    ...    odl-bgpcep-bgp-cli is only avaiable on versions oxygen and above.
+    [Arguments]    ${notification_count}    ${update_count}    ${receive_count}
+    ${output}    KarafKeywords.Safe_Issue_Command_On_Karaf_Console
+    ...    bgp:operational-state -rib example-bgp-rib -neighbor ${TOOLS_SYSTEM_IP}
+    BuiltIn.Log    ${output}
+    &{mapping}    BuiltIn.Create_Dictionary
+    ...    IP=${TOOLS_SYSTEM_IP}
+    ...    NOT_COUNT=${notification_count}
+    ...    SEND_COUNT=${update_count}
+    ...    DIVIDER=│
+    ...    RECV_COUNT=${receive_count}
+    ${expstate}    TemplatedRequests.Resolve_Text_From_Template_File
+    ...    folder=${BGP_RR_VAR_FOLDER}/operational_cli
+    ...    file_name=update.txt
+    ...    mapping=${mapping}
+    String.Get Line Count    ${output}
+    BuiltIn.Log    ${expstate}
+    ${expected_line_count}    String.Get Line Count    ${expstate}
+    FOR    ${expected_line_pos}    IN RANGE    0    ${expected_line_count-1}
+        ${expected_line_offset}    BuiltIn.Evaluate    ${MSG_STATE_OFFSET} + ${expected_line_pos}
+        ${output_line}    String.Get Line    ${output}    ${expected_line_offset}
+        ${expected_line}    String.Get Line    ${expstate}    ${expected_line_pos}
+        BuiltIn.Should Match    ${output_line}    ${expected_line}
+    END