Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
994c927
Merge v1.2-beta (main sync) into v1.1-beta (#440)
aitestino Jan 20, 2026
9e4348e
Add PyATS integration tests with quality improvements (#452)
aitestino Jan 21, 2026
de15c13
Add Catalyst Center integration tests (#456)
oboehmer Jan 27, 2026
7cf76d9
fix: update uv.lock for nac-test-pyats-common v0.2.0
aitestino Jan 27, 2026
6378c9c
bump up nac-test-pyats-common dependency in pyproject.toml
oboehmer Jan 28, 2026
1844835
docs: update README with PyATS integration and development installation
aitestino Jan 30, 2026
3678f2b
feat: add user-provided testbed YAML support (#458)
oboehmer Feb 1, 2026
96d6969
feat: add device hostname to d2d test reporting (#478)
oboehmer Feb 1, 2026
83968a8
fix: optimize PyATS testbed connection parameters (#471)
oboehmer Feb 1, 2026
ea83174
Fix ConnectionBroker Event Loop Issues and Connection Pooling (#467)
oboehmer Feb 1, 2026
ea58919
fix(macOS): resolve fork+SSL crashes causing auth failures and false …
aitestino Feb 4, 2026
06640b5
chore: bump version to 1.1.0b3
aitestino Feb 4, 2026
55716c4
add show sdwan software/show sdwan version command output to xe mock …
oboehmer Feb 3, 2026
0fe89ec
add diagnostic collection script for troubleshooting
aitestino Feb 4, 2026
02f7189
Revert "add diagnostic collection script for troubleshooting"
aitestino Feb 4, 2026
7e579e5
docs: update jobfile snippets to use pyats.easypy.run (#515)
oboehmer Feb 5, 2026
ff0b1c1
remove unused ORDERING_FILE constant
oboehmer Feb 16, 2026
05489f1
fix: prevent tests from leaving artifacts in repo root (#534)
oboehmer Feb 16, 2026
0267516
fix(testbed): add defensive error handling for user-provided testbed …
oboehmer Feb 16, 2026
ce72ad7
feat(discovery) relax path requirements for PyATS test discovery (#… …
oboehmer Feb 16, 2026
910acb2
fix: resolve pyats executable in multiple install locations (#521) (#…
oboehmer Feb 16, 2026
8ed849a
fix(pyats): reduce MEMORY_PER_WORKER_GB from 2.0 to 0.35 (#514)
oboehmer Feb 16, 2026
6ce6f5d
feat(support): add diagnostic collection script for troubleshooting (…
aitestino Feb 17, 2026
a7fe9fc
fix(macOS): disable PyATS git_info to prevent fork() crashes (#517)
aitestino Feb 17, 2026
39b1644
Feature: Combined Dashboard for Robot & PyATS Tests (#488)
oboehmer Feb 18, 2026
e1f68b2
feat: hard exit on macOS with Python < 3.12 (#552)
aitestino Feb 20, 2026
06c3ed7
fix: skip controller check when in --render-only mode (#509)
oboehmer Feb 22, 2026
94cc449
Add ACI defaults validation to CLI (#525)
aitestino Feb 23, 2026
11a912c
tests: add defaults.apic.version to e2e fixtures to make ACI defaults…
oboehmer Feb 23, 2026
c6b91e0
fix(html-reports): add UTF-8 charset declaration to prevent garbled c…
oboehmer Feb 23, 2026
c1184a8
test/add comment to e2e fixture data.yaml clarifying required structure
oboehmer Feb 24, 2026
a2b7938
fix(pyats): add disconnect/wait timeout configuration to testbed gene…
oboehmer Feb 26, 2026
54c97c9
test: Add automated tests for hostname display in D2D reporting (#543)
oboehmer Feb 26, 2026
fe16bcf
feat(exit-codes): implement Robot Framework-style exit codes (#469) (…
oboehmer Feb 26, 2026
adbcd7c
feat: merge Robot and PyATS xunit.xml files for CI/CD integration (#557)
oboehmer Feb 26, 2026
2cc691c
feat(robot): upgrade pabot to 5.2.2 and write outputs directly to rob…
oboehmer Feb 26, 2026
44c77dd
Refactor: Streamline nac-test CLI output (#540) (#566)
oboehmer Feb 26, 2026
5c46f57
feat: add standalone mock server management scripts (#563)
oboehmer Feb 26, 2026
b46baa9
fix(mock-server): fix fd leak in daemonize and reuse timeout constants
oboehmer Feb 26, 2026
75cb1da
refactor: replace hasattr() with class-level declarations (#481) (#601)
aitestino Mar 5, 2026
410367b
feat(dry-run): add PyATS dry-run support (#554)
oboehmer Mar 5, 2026
659235b
Adjust platform notes in README (#605)
oboehmer Mar 7, 2026
ffdab1b
fix(logging): use dynamic stream handler to prevent I/O errors in pyt…
oboehmer Mar 8, 2026
6edc7a6
feat(cli): add --verbose and --loglevel flags, align env vars to NAC_…
oboehmer Mar 9, 2026
1bad793
feat: implement fail-fast authentication (#531)
aitestino Mar 10, 2026
0e8536f
fix(tests): isolate temp file tests to prevent parallel race conditio…
oboehmer Mar 10, 2026
4c4edab
fix(pyats): clean up stale test artifacts before execution (#526) (#571)
oboehmer Mar 10, 2026
7e69426
chore: release v2.0.0a1 (#626)
oboehmer Mar 10, 2026
b4bb676
fix(robot): handle relative output paths in pabot (#634)
oboehmer Mar 11, 2026
23d0bfb
docs: remove obsolete REPORTING_PLAN_OPTION_D.md doc
oboehmer Mar 12, 2026
ec047e4
feat(pyats): add architecture-agnostic defaults resolution to NACTest…
aitestino Mar 19, 2026
8323d54
feat(pyats): add pyATS integration framework foundation
oboehmer Mar 19, 2026
600bb7c
feat: add skipped device reporting and infrastructure sync (#435)
aitestino Jan 20, 2026
2d44d3c
run CI on all branches, remove Makefile (feedback from Daniel)
oboehmer Mar 19, 2026
458bf77
fix: resolve merge conflict markers in test.yml and license-headers.sh
oboehmer Mar 19, 2026
993d61d
feat: enable Windows support for robot-only scenarios (#629)
oboehmer Mar 19, 2026
a63d17b
restore license-header-check in pre-commit
oboehmer Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 37 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ on:
workflow_dispatch:
pull_request:
push:
branches:
- main

jobs:
security:
Expand All @@ -24,7 +22,7 @@ jobs:
run: uv tool install bandit[toml]

- name: Run bandit security scan
run: bandit -r nac_test/ -ll -f json -o bandit-security-report.json
run: bandit -c pyproject.toml -r nac_test/ -ll -f json -o bandit-security-report.json

- name: Upload security report
uses: actions/upload-artifact@v7
Expand Down Expand Up @@ -77,7 +75,7 @@ jobs:
test:
name: Tests
runs-on: ubuntu-latest
timeout-minutes: 10
timeout-minutes: 15
strategy:
matrix:
python:
Expand All @@ -100,18 +98,50 @@ jobs:
- name: Test
run: |
uv sync --extra dev
uv run pytest
# Run tests in parallel (--dist loadscope keeps test classes together, this is critical for e2e tests)
uv run pytest -n auto --dist loadscope tests/

test-windows:
name: Tests (Windows)
runs-on: windows-latest
timeout-minutes: 15
strategy:
matrix:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true

- name: Set up Python ${{ matrix.python }}
run: uv python install ${{ matrix.python }}

- name: Test
run: |
uv sync --extra dev
# Explicit file list: Windows shell doesn't expand globs, and other integration
# tests import pyats which isn't available on Windows
uv run pytest -m windows -n auto --dist loadscope tests/e2e tests/integration/test_cli_basic.py tests/integration/test_cli_rendering.py tests/integration/test_cli_ordering.py tests/integration/test_cli_extra_args.py
uv run nac-test --version

notification:
name: Notification
if: always() && github.event_name != 'pull_request'
needs: [security, lint, test]
needs: [security, lint, test, test-windows]
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Check Job Success
run: |
if [ ${{ needs.security.result }} == 'success' ] && [ ${{ needs.lint.result }} == 'success' ] && [ ${{ needs.test.result }} == 'success' ]; then
if [ ${{ needs.security.result }} == 'success' ] && [ ${{ needs.lint.result }} == 'success' ] && [ ${{ needs.test.result }} == 'success' ] && [ ${{ needs.test-windows.result }} == 'success' ]; then
echo "All jobs succeeded"
echo "jobSuccess=success" >> $GITHUB_ENV
else
Expand Down
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -73,17 +73,32 @@ ENV/
.vscode

tmp/
__nac_tmp_*

.mypy_cache/
.ruff_cache/

# Application execution logs (including Claude Code logs)
logs/

# Robot artifacts
output.xml
log.html
report.html
pabot_results/

# Pabot
.pabotsuitenames

# Claude configuration
.claude/
CLAUDE.md
# Opencode/oh-my-opencode
.sisyphus/
AGENTS.md

# bandit security report, if generated
bandit-security-report.json

# workspace for local testing
/workspace
23 changes: 19 additions & 4 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,37 @@ repos:
entry: ./scripts/license-headers.sh
language: script
types: [python]

- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
# Kept: Checks not covered by Ruff
- id: check-json
- id: check-yaml
args: ['--unsafe']
- id: check-symlinks
- id: check-merge-conflict
- id: requirements-txt-fixer
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.12.12
hooks:
- id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
exclude: 'tests/fixtures/|tests/integration/fixtures/|tests/e2e/fixtures/'
- id: ruff-format

exclude: 'tests/fixtures/|tests/integration/fixtures/|tests/e2e/fixtures/'
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.17.1
hooks:
- id: mypy

exclude: 'tests/fixtures/|tests/integration/fixtures/|tests/e2e/fixtures/'
additional_dependencies:
- types-PyYAML>=6.0.12.20250822
- types-aiofiles>=24.1.0.20250822
- types-markdown>=3.8.0.20250809
- types-requests>=2.32.0.20250809
- repo: https://github.com/PyCQA/bandit
rev: 1.8.6
hooks:
- id: bandit
args: ['-r', 'nac_test/']
args: ['-c', 'pyproject.toml', '-r', 'nac_test/']
exclude: ^tests/
39 changes: 37 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,41 @@
# 1.2.3
# 2.0.0

- Exclude jsonpath-ng 1.8.0 due to upstream regression (#603)
_Note: This changelog covers all 2.0.0 alpha and beta releases._

## Major Features

- **pyATS Integration** (EXPERIMENTAL): Full support for pyATS operational test cases
- Initial support for ACI, SD-WAN, and Catalyst Center architectures
- IOS-XE Direct-to-Device (D2D) SSH tests for SD-WAN and Catalyst Center
- Experimental `--pyats` and `--robot` flags to limit test execution to one framework
- **Windows**: Robot tests only — PyATS libraries are not available on Windows. For PyATS tests, use WSL2 as an alternative.
- **macOS requires Python 3.12+**: Earlier Python versions have known fork/SSL incompatibilities causing crashes during pyATS execution.
- **Combined Dashboard**: New `combined_summary.html` report linking Robot and pyATS summaries
- **Merged xUnit Output**: Robot and pyATS results merged into single `xunit.xml` for CI/CD integration
- **Diagnostic Collection**: `--diagnostic` flag wraps execution to collect troubleshooting info (env, packages, logs)
- **Fail-Fast Authentication**: Controller authentication validated before pyATS test execution starts

## Breaking Changes

- **Robot artifacts moved**: Output files (`log.html`, `report.html`, etc.) now created in `robot_results/` subdirectory; links in root directory for backward compatibility
- **RESTinstance removed from core dependencies**: The `RESTinstance` Robot library has been removed. Users who still need RESTinstance can install it separately alongside nac-test.

## CLI Changes

- **Added `--verbose`**: Enables verbose output for nac-test, Robot Framework, and pyATS execution
- **Added `--loglevel`** (replaces `--verbosity`): Control log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
- **Deprecated `--verbosity`**: Hidden alias for `--loglevel`, will be removed in future version

## Environment Variable Changes

- **Renamed**: `NO_TESTLEVELSPLIT` → `NAC_TEST_DISABLE_TESTLEVELSPLIT` (now requires explicit `true`/`yes`/`1`)
- **Removed**: `NAC_VALIDATE_VERBOSITY` (was incorrectly named; use `NAC_TEST_LOGLEVEL`)

## Other Improvements

- Upgraded pabot to 5.2.2
- Streamlined CLI output with cleaner progress reporting
- `--minimal-reports` reduces pyATS HTML report size by 80-95% (only failed tests include full details)

# 1.2.2

Expand Down
Loading
Loading