RobotFramework is an open source, Python-based test automation framework that is commonly used for acceptance test automation using English-like keyword-driven tests. pyATS and RobotFramework can be easily integrated to gain the following features:
pyats[full] package install.
Verify the RobotFramework package and associated pyATS packages are installed in your virtualenv.
pip freeze | grep robot
genie.libs.robot==25.11
pyats.robot==25.11
robotframework==7.4.1
You can verify the specific RobotFramework version also by using the command line for Robot, robot:
robot --version
Robot Framework 7.4.1 (Python 3.11.14 on linux)
In VSCode, using the code keyword in the Terminal window, open a new file to create a Robot file:
touch /home/pod06/workspace/nxapilab/tests/pyats.robot
code-server -r /home/pod06/workspace/nxapilab/tests/pyats.robot
There is a huge community of contributors around the tool which users can leverage to extend its use cases for various needs. External libraries can be installed based on the user's needs or new custom libraries can be created with ease.
Test libraries are normally imported using the Library keyword in the Setting section and having the library name in the
subsequent column. To use pyATS and pyATS Genie keywords in your Robot testcase script, you import ats.robot.pyATSRobot,
genie.libs.robot.GenieRobot, and genie.libs.robot.GenieRobotApis.
Respective keywords that are available from each pyATS library can be located here:
A Suite Setup is executed before running any of the suite's test cases or child test suites, and a Suite Teardown is executed
after them. The Suite Setup you will implement uses the testbed yaml file you created and used in your Python-based pyATS script by using the use testbed pyATS keyword.
It connects to all devices using the pyATS connect to all devices keyword, and then finally calls a user custom keyword, Set Fabric Env that you will add to the Robot file in the next step.
*** Settings ***
Library ats.robot.pyATSRobot
Library genie.libs.robot.GenieRobot
Library genie.libs.robot.GenieRobotApis
Library OperatingSystem
Library String
Library Collections
# Load topology/testbed yaml file
Suite Setup Run Keywords
... use testbed "%{TESTBED}" AND
... connect to all devices AND
... Set Fabric Env AND
... Load Group Vars
# Disconnect sessions from all devices
Suite Teardown Run Keywords
... disconnect from all devices
*** Variables ***
# Update this path to point to your ansible-nxos/group_vars directory
${GROUP_VARS_DIR} ${CURDIR}/../ansible-nxos/group_vars
The Keywords section is used to create new keywords by combining existing keywords together.
These keywords are called user keywords to differentiate them from existing library keywords that are
implemented in test libraries, again, such as the pyATS library keywords you imported in the previous step.
In the Keywords section, you will add the following keywords for use in Suite Setup and the Testcases section covered in the next step:
Set Fabric Env: This keyword is leveraged in the Suite Setup to select the correct testbed yaml file. To this point in the lab you have created the testbed yaml for your staging (development) fabric, but later in the lab, you will create the testbed yaml for your prod fabric.Get BGP L2VPN Summary From Device: This keyword simply is a "getter" keyword that gets the data from the device and is to be used in other keywords, such as the subsequent verify keywords.Verify BGP ASN For All Devices: This keyword calls the Get BGP L2VPN Summary From Device user keyword and verifies the expected BGP ASN based on user input.Verify BGP Neighbor Count: This keyword calls the Get BGP L2VPN Summary From Device user keyword and verifies the expected number of BGP neighbors based on user input.
Within each of these user keywords, keywords from Robot's core library are used to perform the validation checks. These include setting variables with Set Variable,
FOR loops, Run Keyword If...Else, and comparison checks with keywords such as Should Be Equal As Numbers.
*** Keywords ***
Set Fabric Env
${is_prod}= Evaluate "prod" in """%{TESTBED}"""
${is_staging}= Evaluate "staging" in """%{TESTBED}"""
@{DEVICE_LIST}= Run Keyword If ${is_prod} Create list prod-spine1 prod-spine2 prod-leaf1 prod-leaf2 prod-leaf3
... ELSE Create list staging-spine1 staging-spine2 staging-leaf1 staging-leaf2 staging-leaf3
Set Suite Variable ${DEVICE_LIST}
Load Group Vars
${spines_yaml}= OperatingSystem.Get File ${GROUP_VARS_DIR}/spines.yml
${leafs_yaml}= OperatingSystem.Get File ${GROUP_VARS_DIR}/leafs.yml
${spines_data}= Evaluate __import__('yaml').safe_load('''${spines_yaml}''') modules=yaml
${leafs_data}= Evaluate __import__('yaml').safe_load('''${leafs_yaml}''') modules=yaml
Set Suite Variable ${SPINES_DATA} ${spines_data}
Set Suite Variable ${LEAFS_DATA} ${leafs_data}
Get Expected BGP ASN
[Arguments] ${device}
${device_lower}= Convert To Lowercase ${device}
${is_spine}= Evaluate "spine" in "${device_lower}"
${bgp_asn}= Run Keyword If ${is_spine} Set Variable ${SPINES_DATA}[bgp][asn]
... ELSE Set Variable ${LEAFS_DATA}[bgp][asn]
RETURN ${bgp_asn}
Get Expected BGP Neighbor Count
[Arguments] ${device}
${device_lower}= Convert To Lowercase ${device}
${is_spine}= Evaluate "spine" in "${device_lower}"
${bgp_neighbors}= Run Keyword If ${is_spine} Set Variable ${SPINES_DATA}[bgp][neighbors]
... ELSE Set Variable ${LEAFS_DATA}[bgp][neighbors]
${neighbor_count}= Get Length ${bgp_neighbors}
RETURN ${neighbor_count}
Get BGP L2VPN Summary From Device
[Arguments] ${device}
${output}= nxapi method nxapi cli device=${device} action=send commands=show bgp l2vpn evpn summary message_format=json_rpc command_type=cli alias=rest
# Log ${output.json()}
RETURN ${output.json()}
Verify BGP ASN For All Devices
[Arguments] ${device_list}
FOR ${device} IN @{device_list}
${expected_bgp_asn}= Get Expected BGP ASN ${device}
${output}= Get BGP L2VPN Summary From Device device=${device}
${bgp_asn}= Set Variable ${output}[result][body][TABLE_vrf][ROW_vrf][vrf-local-as]
Should Be Equal As Numbers ${bgp_asn} ${expected_bgp_asn}
END
Verify BGP Neighbor Count
[Arguments] ${device_list}
# [Arguments] ${device_list} ${expected_bgp_nbr_count}
FOR ${device} IN @{device_list}
${expected_bgp_nbr_count}= Get Expected BGP Neighbor Count ${device}
${output}= Get BGP L2VPN Summary From Device device=${device}
${bgp_nbrs}= Set Variable ${output}[result][body][TABLE_vrf][ROW_vrf][TABLE_af][ROW_af][TABLE_saf][ROW_saf][TABLE_neighbor][ROW_neighbor]
${type string}= Evaluate type($bgp_nbrs).__name__
${bgp_nbr_count}= Run Keyword If ${type string} == list Get length ${bgp_nbrs}
... ELSE Set Variable 1
Should Be Equal As Numbers ${bgp_nbr_count} ${expected_bgp_nbr_count}
END
Test cases are constructed in the Test Cases sections. Keywords can be imported from test
libraries, resource files, or created in the keyword section of the test case file itself as you have done above for simplicity.
As you grow your own keyword repositories, then it would be best practice to explore creating your own libraries or resource files to import.
*** Test Cases ***
VERIFY ALL DEVICE'S EXPECTED LOCAL BGP ASN via NX-API CLI JSON-RPC
Verify BGP ASN For All Devices device_list=${DEVICE_LIST}
VERIFY SPINE DEVICE(S) EXPECTED NEIGHBOR COUNT via NX-API CLI JSON-RPC
Verify BGP Neighbor Count device_list=${DEVICE_LIST[:2]}
VERIFY LEAF DEVICE(S) EXPECTED NEIGHBOR COUNT via NX-API CLI JSON-RPC
Verify BGP Neighbor Count device_list=${DEVICE_LIST[2:5]}
The Robot script will be executed using the pyATS EasyPy execution method for additional functionality as noted in the previous section.
pyats run robot pyats.robot --testbed-file staging-testbed.yaml --archive-dir=${PWD}/results --no-archive-subdir --no-mail
You will have to scroll up on the Terminal some, but your Robot script execution should look like the below. Notice the test cases are toward the top and they should show as PASS. Additionally, there is the same EasyPy reporting to show a summary and detail view of the test execution steps.
2026-02-09T22:29:27: %EASYPY-INFO: --------------------------------------------------------------------------------
2026-02-09T22:29:27: %EASYPY-INFO: Job finished. Wrapping up...
2026-02-09T22:29:29: %EASYPY-INFO: Creating archive file: /home/pod01/workspace/nxapilab/tests/results/pyats_2026Feb09_22_29_08_950325.zip
2026-02-09T22:29:29: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-09T22:29:29: %EASYPY-INFO: | Easypy Report |
2026-02-09T22:29:29: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-09T22:29:29: %EASYPY-INFO: pyATS Instance : /home/pod01/.pyenv/versions/3.11.14/envs/nxapilab
2026-02-09T22:29:29: %EASYPY-INFO: Python Version : cpython-3.11.14 (64bit)
2026-02-09T22:29:29: %EASYPY-INFO: CLI Arguments : /home/pod01/.pyenv/versions/nxapilab/bin/pyats run robot pyats.robot --testbed-file staging-testbed.yaml --archive-dir=/home/pod01/workspace/nxapilab/tests/results --no-archive-subdir --no-mail
2026-02-09T22:29:29: %EASYPY-INFO: User : pod01
2026-02-09T22:29:29: %EASYPY-INFO: Host Server : ubuntu-code-server-template
2026-02-09T22:29:29: %EASYPY-INFO: Host OS Version : Ubuntu 22.04 jammy (x86_64)
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: Job Information
2026-02-09T22:29:29: %EASYPY-INFO: Name : pyats
2026-02-09T22:29:29: %EASYPY-INFO: Result : PASSED
2026-02-09T22:29:29: %EASYPY-INFO: Start time : 2026-02-09 22:29:19.028192+00:00
2026-02-09T22:29:29: %EASYPY-INFO: Stop time : 2026-02-09 22:29:27.772938+00:00
2026-02-09T22:29:29: %EASYPY-INFO: Elapsed time : 0:00:09
2026-02-09T22:29:29: %EASYPY-INFO: Archive : /home/pod01/workspace/nxapilab/tests/results/pyats_2026Feb09_22_29_08_950325.zip
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: Total Tasks : 1
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: Overall Stats
2026-02-09T22:29:29: %EASYPY-INFO: Passed : 3
2026-02-09T22:29:29: %EASYPY-INFO: Passx : 0
2026-02-09T22:29:29: %EASYPY-INFO: Failed : 0
2026-02-09T22:29:29: %EASYPY-INFO: Aborted : 0
2026-02-09T22:29:29: %EASYPY-INFO: Blocked : 0
2026-02-09T22:29:29: %EASYPY-INFO: Skipped : 0
2026-02-09T22:29:29: %EASYPY-INFO: Errored : 0
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: TOTAL : 3
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: Success Rate : 100.00 %
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: Section Stats
2026-02-09T22:29:29: %EASYPY-INFO: Passed : 3
2026-02-09T22:29:29: %EASYPY-INFO: Passx : 0
2026-02-09T22:29:29: %EASYPY-INFO: Failed : 0
2026-02-09T22:29:29: %EASYPY-INFO: Aborted : 0
2026-02-09T22:29:29: %EASYPY-INFO: Blocked : 0
2026-02-09T22:29:29: %EASYPY-INFO: Skipped : 0
2026-02-09T22:29:29: %EASYPY-INFO: Errored : 0
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: TOTAL : 3
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: Section Success Rate : 100.00 %
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-09T22:29:29: %EASYPY-INFO: | Task Result Summary |
2026-02-09T22:29:29: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-09T22:29:29: %EASYPY-INFO: Task-1: pyats PASSED
2026-02-09T22:29:29: %EASYPY-INFO: Task-1: pyats.VERIFY ALL DEVICE'S EXPECTED LOCAL BGP ASN via NX-API... PASSED
2026-02-09T22:29:29: %EASYPY-INFO: Task-1: pyats.VERIFY SPINE DEVICE(S) EXPECTED NEIGHBOR COUNT via NX... PASSED
2026-02-09T22:29:29: %EASYPY-INFO: Task-1: pyats.VERIFY LEAF DEVICE(S) EXPECTED NEIGHBOR COUNT via NX-... PASSED
2026-02-09T22:29:29: %EASYPY-INFO:
2026-02-09T22:29:29: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-09T22:29:29: %EASYPY-INFO: | Task Result Details |
2026-02-09T22:29:29: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-09T22:29:29: %EASYPY-INFO: Task-1: pyats PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- VERIFY ALL DEVICE'S EXPECTED LOCAL BGP ASN via NX-API CLI JSON-RPC PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | `-- 1_Verify BGP ASN For All Devices PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 2_${device} IN @{device_list} PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 3_${device} = staging-spine1 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 4_Get Expected BGP ASN PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 5_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 6_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 7_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 8_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 9_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 10_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 11_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 12_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 13_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 14_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 15_${device} = staging-spine2 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 16_Get Expected BGP ASN PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 17_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 18_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 19_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 20_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 21_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 22_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 23_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 24_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 25_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 26_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 27_${device} = staging-leaf1 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 28_Get Expected BGP ASN PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 29_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 30_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 31_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 32_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 33_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 34_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 35_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 36_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 37_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 38_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 39_${device} = staging-leaf2 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 40_Get Expected BGP ASN PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 41_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 42_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 43_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 44_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 45_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 46_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 47_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 48_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 49_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 50_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 51_${device} = staging-leaf3 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 52_Get Expected BGP ASN PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 53_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 54_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 55_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 56_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 57_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 58_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 59_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 60_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 61_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | `-- 62_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- VERIFY SPINE DEVICE(S) EXPECTED NEIGHBOR COUNT via NX-API CLI J... PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | `-- 1_Verify BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 2_${device} IN @{device_list} PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 3_${device} = staging-spine1 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 4_Get Expected BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 5_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 6_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 7_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 8_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 9_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 10_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 11_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 12_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 13_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 14_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 15_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 16_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 17_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 18_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 19_${device} = staging-spine2 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 20_Get Expected BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 21_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 22_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 23_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 24_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 25_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 26_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 27_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 28_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 29_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 30_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 31_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 32_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | |-- 33_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: | `-- 34_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: `-- VERIFY LEAF DEVICE(S) EXPECTED NEIGHBOR COUNT via NX-API CLI JS... PASSED
2026-02-09T22:29:29: %EASYPY-INFO: `-- 1_Verify BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 2_${device} IN @{device_list} PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 3_${device} = staging-leaf1 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 4_Get Expected BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 5_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 6_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 7_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 8_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 9_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 10_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 11_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 12_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 13_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 14_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 15_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 16_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 17_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 18_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 19_${device} = staging-leaf2 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 20_Get Expected BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 21_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 22_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 23_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 24_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 25_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 26_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 27_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 28_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 29_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 30_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 31_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 32_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 33_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 34_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 35_${device} = staging-leaf3 PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 36_Get Expected BGP Neighbor Count PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 37_Convert To Lower Case PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 38_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 39_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 40_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 41_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 42_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 43_Get BGP L2VPN Summary From Device PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 44_Nxapi Method Nxapi Cli PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 45_ PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 46_Set Variable PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 47_Evaluate PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 48_Run Keyword If PASSED
2026-02-09T22:29:29: %EASYPY-INFO: |-- 49_Get Length PASSED
2026-02-09T22:29:29: %EASYPY-INFO: `-- 50_Should Be Equal As Numbers PASSED
2026-02-09T22:29:29: %EASYPY-INFO: Done!
Navigate back to your VSCode application.
Once completed, continue to the next section to get started with NetDevOps. In the next section you will take everything you have been developing and deploying to your staging (development) fabric to Git for source control then to your prod fabric through a devops process and a CI/CD pipeline.