Run
pyATS

Step 1 - Create Python File for pyATS Easypy

Create the pyATS Easypy job file that will serve as the test orchestration script, coordinating the execution of all test cases and managing test parameters.


touch ~/workspace/ndlab/nac/tests/pyats_easypy.py
code-server -r ~/workspace/ndlab/nac/tests/pyats_easypy.py


Step 2 - Populate pyATS Easypy File

Implement the Easypy job file with argument parsing to accept the data model directory and a main function that executes the pyats_aetest.py script with the required parameters.


import os
import argparse
from pyats.easypy import run

# script path from this location
SCRIPT_PATH = os.path.dirname(__file__)


def main():
    '''job file entrypoint'''

    parser = argparse.ArgumentParser()
    parser.add_argument('--data_model_dir', type=str, default=None)
    args, _ = parser.parse_known_args()

    # run script
    run(testscript=os.path.join(SCRIPT_PATH, 'pyats_aetest.py'), data_model_dir=args.data_model_dir)


Step 3 - Run pyATS Tests

Execute the complete test suite using the pyats run job command, passing the testbed file, data model directory, and output archive settings to run all configured AEtest test cases.


pyats run job pyats_easypy.py --testbed-file testbed.yml --data_model_dir ../host_vars/msd-fabric-group/ --archive-dir=${PWD}/results --no-archive-subdir --no-mail


2026-02-07T15:08:49: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-07T15:08:49: %EASYPY-INFO: |                                Easypy Report                                 |
2026-02-07T15:08:49: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-07T15:08:49: %EASYPY-INFO: pyATS Instance   : /home/pod30/.pyenv/versions/3.11.14/envs/ndlab
2026-02-07T15:08:49: %EASYPY-INFO: Python Version   : cpython-3.11.14 (64bit)
2026-02-07T15:08:49: %EASYPY-INFO: CLI Arguments    : /home/pod30/.pyenv/versions/ndlab/bin/pyats run job pyats_easypy.py --testbed-file testbed.yml --data_model_dir ../host_vars/msd-fabric-group/ --archive-dir=/home/pod30/workspace/ndlab/nac/tests/results --no-archive-subdir --no-mail
2026-02-07T15:08:49: %EASYPY-INFO: User             : pod30
2026-02-07T15:08:49: %EASYPY-INFO: Host Server      : ubuntu-code-server-template
2026-02-07T15:08:49: %EASYPY-INFO: Host OS Version  : Ubuntu 22.04 jammy (x86_64)
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: Job Information
2026-02-07T15:08:49: %EASYPY-INFO:     Name         : pyats_easypy
2026-02-07T15:08:49: %EASYPY-INFO:     Result       : PASSED
2026-02-07T15:08:49: %EASYPY-INFO:     Start time   : 2026-02-07 15:08:26.036801+00:00
2026-02-07T15:08:49: %EASYPY-INFO:     Stop time    : 2026-02-07 15:08:48.561145+00:00
2026-02-07T15:08:49: %EASYPY-INFO:     Elapsed time : 0:00:23
2026-02-07T15:08:49: %EASYPY-INFO:     Archive      : /home/pod30/workspace/ndlab/nac/tests/results/pyats_easypy_2026Feb07_15_08_15_531738.zip
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: Total Tasks    : 1
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: Overall Stats
2026-02-07T15:08:49: %EASYPY-INFO:     Passed     : 4
2026-02-07T15:08:49: %EASYPY-INFO:     Passx      : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Failed     : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Aborted    : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Blocked    : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Skipped    : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Errored    : 0
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO:     TOTAL      : 4
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: Success Rate   : 100.00 %
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: Section Stats
2026-02-07T15:08:49: %EASYPY-INFO:     Passed     : 9
2026-02-07T15:08:49: %EASYPY-INFO:     Passx      : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Failed     : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Aborted    : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Blocked    : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Skipped    : 0
2026-02-07T15:08:49: %EASYPY-INFO:     Errored    : 0
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO:     TOTAL      : 9
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: Section Success Rate   : 100.00 %
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-07T15:08:49: %EASYPY-INFO: |                             Task Result Summary                              |
2026-02-07T15:08:49: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-07T15:08:49: %EASYPY-INFO: Task-1: pyats_aetest                                                      PASSED
2026-02-07T15:08:49: %EASYPY-INFO: Task-1: pyats_aetest.common_setup                                         PASSED
2026-02-07T15:08:49: %EASYPY-INFO: Task-1: pyats_aetest.VerifyBgwBgpL2vpnEvpnNeighbors                       PASSED
2026-02-07T15:08:49: %EASYPY-INFO: Task-1: pyats_aetest.VerifyNveVnis                                        PASSED
2026-02-07T15:08:49: %EASYPY-INFO: Task-1: pyats_aetest.common_cleanup                                       PASSED
2026-02-07T15:08:49: %EASYPY-INFO:
2026-02-07T15:08:49: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-07T15:08:49: %EASYPY-INFO: |                             Task Result Details                              |
2026-02-07T15:08:49: %EASYPY-INFO: +------------------------------------------------------------------------------+
2026-02-07T15:08:49: %EASYPY-INFO: Task-1: pyats_aetest                                                      PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |-- common_setup                                                          PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   |-- load_data_model_files                                             PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   |-- connect                                                           PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   |-- check_connection                                                  PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   |   `-- STEP 1: Test connection status for Device msd-fabric-group    PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   `-- get_nd_inventory                                                  PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |-- VerifyBgwBgpL2vpnEvpnNeighbors                                        PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   |-- setup                                                             PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   `-- test                                                              PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       |-- STEP 1: Verify BGP EVPN neighbors for BGW site1-bgw1          PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       `-- STEP 2: Verify BGP EVPN neighbors for BGW site2-bgw-s1        PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |-- VerifyNveVnis                                                         PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   |-- setup                                                             PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |   `-- test                                                              PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       |-- STEP 1: Verify NVE VNIs for site1-bgw1                        PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       |-- STEP 2: Verify NVE VNIs for site1-bl1                         PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       |-- STEP 3: Verify NVE VNIs for site1-l1                          PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       |-- STEP 4: Verify NVE VNIs for site1-l2                          PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       |-- STEP 5: Verify NVE VNIs for site2-bgw-s1                      PASSED
2026-02-07T15:08:49: %EASYPY-INFO: |       `-- STEP 6: Verify NVE VNIs for site2-l1                          PASSED
2026-02-07T15:08:49: %EASYPY-INFO: `-- common_cleanup                                                        PASSED
2026-02-07T15:08:49: %EASYPY-INFO:     `-- disconnect                                                        PASSED
2026-02-07T15:08:49: %EASYPY-INFO: Done!

Step 4 - Close All Open Tabs

Clean up the VSCode workspace by closing all open editor tabs to prepare for the next section of the lab.

  1. Right-Click on any open tab
  2. Select "Close All" from the drop-down menu


Continue to the next section to pull everything together, NaC and pyATS, to set up a NetDevOps pipeline and onboard a new overlay.