Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
216 commits
Select commit Hold shift + click to select a range
74bf28c
feat: Add merged data model functionality to RobotWriter and CLI
aitestino Jun 24, 2025
83e0cb5
feat: Add short option for merged data filename in CLI
aitestino Jun 24, 2025
cb20420
chore: Update dependencies for pyATS & Genie ecosystem
aitestino Jun 28, 2025
4b0ee4f
feat: Introduce DataMerger class for YAML data handling in Robot and …
aitestino Jun 28, 2025
c810a8f
feat: Integrate PyATS support into nac-test CLI for enhanced testing …
aitestino Jun 29, 2025
e9bd532
feat: Enhance PyATS orchestration with real-time progress reporting a…
aitestino Jun 30, 2025
c4314f3
chore: Update dependencies and improve YAML handling in PyATS
aitestino Jun 30, 2025
eedbd95
feat: Add DATA_FILE environment variable to PyATS orchestrator
aitestino Jun 30, 2025
b22c833
feat: Implement environment validation and enhance terminal output in…
aitestino Jun 30, 2025
410dbe0
feat: Enhance PyATS orchestrator and progress reporter with improved …
aitestino Jun 30, 2025
e326261
feat: Enhance PyATS reporting with HTML generation and result collection
aitestino Jul 1, 2025
9e165b5
feat: Enhance NACTestBase with API tracking and test context management
aitestino Jul 1, 2025
82c57f3
feat: Introduce core components and constants for nac-test framework.…
aitestino Jul 16, 2025
bf7d513
feat: Enhance SSHTestBase and related components for improved device …
aitestino Jul 16, 2025
1882ed7
refactor: Restructure PyATS components and enhance constants for impr…
aitestino Aug 6, 2025
3fccba5
feat: Enhance subprocess output handling with configurable buffer limits
aitestino Aug 12, 2025
5bda653
feat: Enhance skip message formatting and reporting styles
aitestino Aug 12, 2025
322a79f
feat: Update concurrency limits in constants to support environment v…
aitestino Aug 26, 2025
8a37465
feat: Add multi-job execution constants and subprocess output handling
aitestino Aug 26, 2025
5d45412
feat: Implement cleanup procedures before test execution in PyATSOrch…
aitestino Aug 26, 2025
890b459
feat: Enhance NACTestBase with batching reporter and improved error h…
aitestino Aug 26, 2025
2c37b75
feat: Update subprocess command options in SubprocessRunner
aitestino Aug 26, 2025
a58ee19
feat: Implement batching reporter for PyATS to enhance message handling
aitestino Aug 26, 2025
40cf7bd
feat: Refactor TestResultCollector to use JSONL format for results st…
aitestino Aug 26, 2025
90ff213
feat: Update ReportGenerator to support JSONL format for test results
aitestino Aug 26, 2025
0f46185
feat: Implement Step Interceptor for PyATS message batching
aitestino Aug 26, 2025
961a22d
feat: Add cleanup utilities for PyATS runtime and old test outputs
aitestino Aug 26, 2025
1a5cd72
feat: Enhance retry logic for APIC/controller connections in NACTestBase
aitestino Aug 26, 2025
8f0e3b2
refactor: Clean up comments and enhance task ID generation in job gen…
aitestino Aug 26, 2025
d56ee5e
feat: Add Makefile for pre-push checks to ensure code quality
aitestino Aug 26, 2025
79a448d
feat: Update pre-commit configuration with new hooks and versions
aitestino Aug 26, 2025
e856046
feat: Remove pabot and robot_writer modules to streamline codebase, i…
aitestino Aug 26, 2025
40f3e10
chore: Update dependencies in poetry.lock and pyproject.toml
aitestino Aug 28, 2025
1481357
feat: Enhance API response tracking in NACTestBase
aitestino Aug 28, 2025
0781233
refactor: Clean up whitespace and improve code readability in NACTest…
aitestino Aug 28, 2025
9db5274
feat: Add optional test_context parameter to add_result method in Tes…
aitestino Aug 28, 2025
4af829e
feat: Enhance test case report template with nested command results a…
aitestino Aug 28, 2025
f56b6e4
feat: Add navigation button to test case report template for improved…
aitestino Aug 29, 2025
60bfe11
feat: Introduce CombinedOrchestrator for sequential PyATS and Robot F…
aitestino Aug 30, 2025
a7a0580
refactor: Clean up whitespace and improve code formatting in combined…
aitestino Aug 30, 2025
495fae6
refactor: Update environment variable handling and clean up debug cod…
aitestino Aug 30, 2025
bc1f764
refactor: Update DATA_MODEL_PATH environment variable and enhance com…
aitestino Aug 30, 2025
a1dc690
feat: Add logging configuration utilities to enhance framework loggin…
aitestino Aug 30, 2025
a953051
refactor: Update PyATS output directory handling in CombinedOrchestrator
aitestino Sep 1, 2025
e5ec73a
refactor: Streamline output directory management in CombinedOrchestra…
aitestino Sep 1, 2025
57df6c1
feat: Introduce RobotOrchestrator for managing Robot Framework test e…
aitestino Sep 1, 2025
d897b1d
feat: Add support for Robot Framework development mode in CombinedOrc…
aitestino Sep 2, 2025
b0cf8a5
feat: Enhance CLI with Robot Framework support and runtime tracking
aitestino Sep 2, 2025
c78cd41
fix: Clean up whitespace in CombinedOrchestrator and improve report d…
aitestino Sep 2, 2025
bb02dab
feat: Implement controller recovery tracking and logging enhancements
aitestino Sep 2, 2025
9589aa5
feat: Enhance output processing and logging in RobotOrchestrator
aitestino Sep 2, 2025
62d3621
feat: Update pre-commit and project metadata for improved development…
aitestino Sep 3, 2025
9f094e5
fix: Ensure absolute paths for test files and output directories in o…
aitestino Sep 3, 2025
78a218e
feat(reporting): eliminate server-side JSON processing bottleneck wit…
aitestino Sep 4, 2025
cc93947
chore: Update .gitignore to include application execution logs
ChristopherJHart Sep 21, 2025
e498c09
fix: resolve DEBUG verbosity level not working due to enum string con…
ChristopherJHart Sep 21, 2025
fd5cbdb
fix(logging): improve filepath display in data loading logs
ChristopherJHart Sep 21, 2025
f31eda2
fix(inventory): correct merged data model path in DeviceInventoryDisc…
ChristopherJHart Sep 21, 2025
fefe446
fix(pre-commit): resolve mypy hook failing during git commits
ChristopherJHart Sep 21, 2025
8e7d153
refactor(types): improve type hints in DeviceExecutor constructor
ChristopherJHart Sep 21, 2025
fe10426
fix(pyats): resolve duplicate setup methods causing MultiSectionError
ChristopherJHart Sep 21, 2025
1ead54e
fix(pyats): standardize merged data model environment variable across…
ChristopherJHart Sep 21, 2025
af009f8
fix: continued unification of output directory similar to f31eda2a3c8…
ChristopherJHart Sep 21, 2025
b951e3c
fix: another unification of output directory similar to f31eda2a3c8b2…
ChristopherJHart Sep 21, 2025
8eb5d11
fix(ssh): improve error handling specificity in test context loading
ChristopherJHart Sep 21, 2025
cb7277f
chore: comment out code block that loads data model; seems unnecessar…
ChristopherJHart Sep 21, 2025
a7e3d11
fix: correct exception exported by Unicon
ChristopherJHart Sep 21, 2025
63f0c75
fix: allow fallback to None platform value, which is valid in Unicon …
ChristopherJHart Sep 21, 2025
1d34dbe
fix: fall back to single RP chassis type, which Unicon relies upon du…
ChristopherJHart Sep 21, 2025
573d47e
fix(logging): enable full exception tracebacks for critical error han…
ChristopherJHart Sep 21, 2025
568c674
fix(ssh): resolve "list index out of range" error in Unicon Connectio…
ChristopherJHart Sep 22, 2025
1d9ad5f
fix(device_executor): serialize device info to JSON for environment v…
ChristopherJHart Sep 22, 2025
0d5cd6a
feat(broker): implement connection broker for SSH pooling and command…
ChristopherJHart Sep 23, 2025
8a25c2b
Merge broker implementation from experiments branch
ChristopherJHart Sep 23, 2025
c8d8e9e
chore: delete unnecessary file
ChristopherJHart Sep 23, 2025
f11ea85
feat(reporting): add debug logging for temp directory file count and …
ChristopherJHart Sep 23, 2025
ce3c686
fix(reporting): resolve HTML report generation failure by relocating …
ChristopherJHart Sep 24, 2025
621f502
feat(result-processing): add centralized format_verification_result m…
ChristopherJHart Sep 24, 2025
fab6193
feat(pyats): add technology-agnostic skip result processing to NACTes…
ChristopherJHart Sep 24, 2025
c2a145e
feat: implement Phase 4 Result Collector Integration for pyATS test f…
ChristopherJHart Sep 24, 2025
854201b
feat(base): add centralized categorize_results() method to NACTestBase
ChristopherJHart Sep 26, 2025
e59f122
feat: add result processing helper methods to NACTestBase
ChristopherJHart Sep 26, 2025
f3d0ac3
chore: delete errant file
ChristopherJHart Sep 26, 2025
e7e95a7
feat: add standardized abstract result formatting methods to NACTestBase
ChristopherJHart Sep 26, 2025
904af3c
refactor: swap from abstractmethods to explicitly raising NotImplemented
ChristopherJHart Sep 26, 2025
bccff30
chore: fix formatting
ChristopherJHart Sep 26, 2025
bbf9532
chore: remove random phase references that have no context
ChristopherJHart Sep 26, 2025
01d8836
refactor: abstract process_results_with_steps() to eliminate code dup…
ChristopherJHart Sep 26, 2025
a24c887
feat: add comprehensive type hinting system with dedicated types module
ChristopherJHart Sep 26, 2025
625b210
refactor: replace get_test_type_name() method with TEST_TYPE_NAME cla…
ChristopherJHart Sep 26, 2025
1501a49
fix: handle scenario where status could be a string or ResultStatus o…
ChristopherJHart Sep 29, 2025
477b1d3
refactor: don't pass reasons into results to cut down on needed resul…
ChristopherJHart Sep 29, 2025
1f6df24
chore: improve logic behind coercing strings to enum
ChristopherJHart Sep 29, 2025
7164779
refactor: don't pass result object into step description formatter fu…
ChristopherJHart Sep 29, 2025
f3c6f8d
Merge remote-tracking branch 'christopher/release/pyats-integration-v…
aitestino Sep 30, 2025
94cbf83
chore: comment out function that enforces TEST_TYPE_NAME class variable.
ChristopherJHart Sep 30, 2025
2b3b813
chore: expand .gitignore to exclude development artifacts
aitestino Sep 30, 2025
0428c85
fix(robot): restore Robot Framework output to root directory for back…
aitestino Sep 30, 2025
78576b4
chore: comment out function that enforces TEST_TYPE_NAME class variable.
ChristopherJHart Sep 30, 2025
4f4473e
Merge branch 'netascode:release/pyats-integration-v1.1-beta' into rel…
ChristopherJHart Sep 30, 2025
88a27c5
Merge remote-tracking branch 'christopher/release/pyats-integration-v…
aitestino Sep 30, 2025
b733ef2
refactor(reporting): add universal result message formatter
aitestino Oct 1, 2025
cdb853e
refactor(reporting): update HTML template to use universal formatter
aitestino Oct 1, 2025
c97ba3d
feat(cli): add --minimal-reports flag
aitestino Oct 1, 2025
4782f28
feat(orchestrator): thread minimal-reports parameter through architec…
aitestino Oct 1, 2025
30b772d
feat(reporting): implement minimal report filtering
aitestino Oct 1, 2025
167c26e
feat: prioritize failed tests in summary reports for faster triage
aitestino Oct 1, 2025
c3db8ef
feat(reporting): add millisecond precision to timestamp formatting
aitestino Oct 1, 2025
1b5b214
feat: add interactive filtering and sorting to PyATS test results sum…
aitestino Oct 1, 2025
5ad6714
style: enhance combined summary report template with interactive CSS
aitestino Oct 1, 2025
eb06496
fix: correct status priority ordering in test result summary
aitestino Oct 2, 2025
f8183b7
feat(reporting): add duration column to test results summary
aitestino Oct 15, 2025
54d30f1
refactor(base_test): replace skip result helper with configuration-dr…
aitestino Oct 15, 2025
6a9ffb3
docs: add team feedback and enhancement proposals
aitestino Oct 15, 2025
66b2f88
chore: update uv lockfile
aitestino Oct 15, 2025
fa53175
feat(docs): add comprehensive Product Requirements and Architecture d…
aitestino Dec 12, 2025
c56f0f8
ifeat(ssh): enhance SSHTestBase with async verification and testbed r…
aitestino Dec 12, 2025
5f8520f
feat(job_generator): enhance job file generation with logging and tes…
aitestino Dec 12, 2025
99dce6b
feat(orchestrator): update output directory handling in PyATSOrchestr…
aitestino Dec 12, 2025
b31ee35
refactor(terminal): make environment variable error messages architec…
aitestino Dec 14, 2025
4c1033d
feat: add generic auth data caching to AuthCache
aitestino Dec 15, 2025
39811c5
fix: resolve race condition with type-specific temp directories
aitestino Dec 15, 2025
31e7a84
feat: add API/D2D breakdown to test summary output
aitestino Dec 15, 2025
41d2526
style: add newline before PyATS command execution messages
aitestino Dec 15, 2025
e7dc493
chore: remove Team-Feedback.md file
aitestino Dec 15, 2025
3b00a5b
docs: update controller type example from DNAC to CC in docstring
aitestino Dec 15, 2025
1aaf7ce
docs: update controller type references from DNAC to CC
aitestino Dec 15, 2025
150876e
test(auth_cache): fix hash computation and update test standardization
aitestino Dec 15, 2025
dbaafa0
fix: add proper JSONL parsing for multi-archive combined summaries
aitestino Dec 17, 2025
c21a31c
refactor: update D2D terminology from Device-to-Device to Direct-to-D…
aitestino Dec 17, 2025
e5511de
refactor: update SD-WAN terminology (vManage→SDWAN Manager, etc)
aitestino Dec 23, 2025
112fe24
feat: add device validation utility for SSH/D2D architectures
aitestino Jan 5, 2026
d2525e3
feat: add file discovery utility for locating data files
aitestino Jan 5, 2026
bba15b8
feat: export device validation and file discovery utilities
aitestino Jan 5, 2026
23f0240
refactor: integrate device validation into SSHTestBase setup
aitestino Jan 5, 2026
613badf
test: add unit tests for SSHTestBase device validation
aitestino Jan 5, 2026
f017a2b
Merge feature/ssh-d2d-generic-architecture into release/pyats-integra…
aitestino Jan 5, 2026
ce18782
feat: auto-detect controller type from environment credentials
aitestino Jan 6, 2026
e37ea9a
feat: add AST-based test type resolver with base class mapping
aitestino Jan 6, 2026
86b01a4
refactor: integrate TestTypeResolver into test discovery
aitestino Jan 6, 2026
51fe80c
chore: configure pytest to exclude fixture directories
aitestino Jan 6, 2026
f7a94c3
chore: add type ignore comments for untyped library imports
aitestino Jan 6, 2026
1bd0b45
test: add complex API test fixtures for AST parsing validation
aitestino Jan 6, 2026
cb295bb
chore: add type annotations and assertions for broker client
aitestino Jan 6, 2026
d447bf2
test: add directory fallback fixtures for resolver testing
aitestino Jan 6, 2026
2676017
test: add edge case fixtures for robust AST parsing
aitestino Jan 6, 2026
c04d49a
test: add comprehensive unit tests for TestTypeResolver
aitestino Jan 6, 2026
9b08bd8
test: add integration tests for TestDiscovery with TestTypeResolver
aitestino Jan 6, 2026
b2b8570
docs: Update with latest changes
aitestino Jan 6, 2026
89a20c6
feat: add nac-test-pyats-common as direct dependency
aitestino Jan 6, 2026
49cfdaa
feat: add IOSXE architecture to controller detection
aitestino Jan 12, 2026
ffcec6a
refactor: make nac-test-pyats-common an optional dependency
aitestino Jan 13, 2026
cfcf7da
Revert "refactor: make nac-test-pyats-common an optional dependency"
aitestino Jan 13, 2026
3306174
refactor: migrate to hatchling and fix circular dependency
aitestino Jan 13, 2026
7a7fbe7
fix: add missing errorhandler dependency
aitestino Jan 13, 2026
e18ef38
fix: add Python 3.10 compatibility for TypedDict+Generic inheritance
aitestino Jan 13, 2026
903a1a2
chore: bump version to 1.1.0b2
aitestino Jan 13, 2026
484f238
feat: add skipped device reporting and infrastructure sync (#435)
aitestino Jan 20, 2026
876f95c
Merge v1.2-beta (main sync) into v1.1-beta (#440)
aitestino Jan 20, 2026
fed30fb
Add PyATS integration tests with quality improvements (#452)
aitestino Jan 21, 2026
041797d
Merge main into release/pyats-integration-v1.1-beta
aitestino Jan 21, 2026
baecae0
Add Catalyst Center integration tests (#456)
oboehmer Jan 27, 2026
c7dcd74
fix: update uv.lock for nac-test-pyats-common v0.2.0
aitestino Jan 27, 2026
d4ae67c
bump up nac-test-pyats-common dependency in pyproject.toml
oboehmer Jan 28, 2026
7f72d95
docs: update README with PyATS integration and development installation
aitestino Jan 30, 2026
70c77fd
feat: add user-provided testbed YAML support (#458)
oboehmer Feb 1, 2026
b63464d
feat: add device hostname to d2d test reporting (#478)
oboehmer Feb 1, 2026
00fee39
fix: optimize PyATS testbed connection parameters (#471)
oboehmer Feb 1, 2026
6b34445
Fix ConnectionBroker Event Loop Issues and Connection Pooling (#467)
oboehmer Feb 1, 2026
d1c3865
fix(macOS): resolve fork+SSL crashes causing auth failures and false …
aitestino Feb 4, 2026
e46d6d2
chore: bump version to 1.1.0b3
aitestino Feb 4, 2026
e91366a
add show sdwan software/show sdwan version command output to xe mock …
oboehmer Feb 3, 2026
fa8b7f1
add diagnostic collection script for troubleshooting
aitestino Feb 4, 2026
4d50914
Revert "add diagnostic collection script for troubleshooting"
aitestino Feb 4, 2026
f62d8f1
docs: update jobfile snippets to use pyats.easypy.run (#515)
oboehmer Feb 5, 2026
3d400ce
remove unused ORDERING_FILE constant
oboehmer Feb 16, 2026
993b2d8
fix: prevent tests from leaving artifacts in repo root (#534)
oboehmer Feb 16, 2026
0e75b10
fix(testbed): add defensive error handling for user-provided testbed …
oboehmer Feb 16, 2026
b274039
feat(discovery) relax path requirements for PyATS test discovery (#… …
oboehmer Feb 16, 2026
4bbb0bd
fix: resolve pyats executable in multiple install locations (#521) (#…
oboehmer Feb 16, 2026
f55a571
fix(pyats): reduce MEMORY_PER_WORKER_GB from 2.0 to 0.35 (#514)
oboehmer Feb 16, 2026
173366e
feat(support): add diagnostic collection script for troubleshooting (…
aitestino Feb 17, 2026
ae92478
fix(macOS): disable PyATS git_info to prevent fork() crashes (#517)
aitestino Feb 17, 2026
8f29828
Feature: Combined Dashboard for Robot & PyATS Tests (#488)
oboehmer Feb 18, 2026
5f7fd1e
feat: hard exit on macOS with Python < 3.12 (#552)
aitestino Feb 20, 2026
68e84a6
Merge remote-tracking branch 'origin/main' into release/pyats-integra…
oboehmer Feb 21, 2026
642c630
fix: skip controller check when in --render-only mode (#509)
oboehmer Feb 22, 2026
5381000
Add ACI defaults validation to CLI (#525)
aitestino Feb 23, 2026
a3b51be
tests: add defaults.apic.version to e2e fixtures to make ACI defaults…
oboehmer Feb 23, 2026
a5188be
fix(html-reports): add UTF-8 charset declaration to prevent garbled c…
oboehmer Feb 23, 2026
6f246e7
test/add comment to e2e fixture data.yaml clarifying required structure
oboehmer Feb 24, 2026
b9043f6
fix(pyats): add disconnect/wait timeout configuration to testbed gene…
oboehmer Feb 26, 2026
cfc1258
test: Add automated tests for hostname display in D2D reporting (#543)
oboehmer Feb 26, 2026
53b1447
feat(exit-codes): implement Robot Framework-style exit codes (#469) (…
oboehmer Feb 26, 2026
a434700
feat: merge Robot and PyATS xunit.xml files for CI/CD integration (#557)
oboehmer Feb 26, 2026
19e8130
feat(robot): upgrade pabot to 5.2.2 and write outputs directly to rob…
oboehmer Feb 26, 2026
30127f3
Refactor: Streamline nac-test CLI output (#540) (#566)
oboehmer Feb 26, 2026
c6319c0
feat: add standalone mock server management scripts (#563)
oboehmer Feb 26, 2026
1c914dd
fix(mock-server): fix fd leak in daemonize and reuse timeout constants
oboehmer Feb 26, 2026
ab0be5a
refactor: replace hasattr() with class-level declarations (#481) (#601)
aitestino Mar 5, 2026
9867a5e
feat(dry-run): add PyATS dry-run support (#554)
oboehmer Mar 5, 2026
13dc5ea
Adjust platform notes in README (#605)
oboehmer Mar 7, 2026
9f568a9
fix(logging): use dynamic stream handler to prevent I/O errors in pyt…
oboehmer Mar 8, 2026
b5b5935
feat(cli): add --verbose and --loglevel flags, align env vars to NAC_…
oboehmer Mar 9, 2026
7cc29b6
feat: implement fail-fast authentication (#531)
aitestino Mar 10, 2026
26879b7
fix(tests): isolate temp file tests to prevent parallel race conditio…
oboehmer Mar 10, 2026
0d2f56a
fix(pyats): clean up stale test artifacts before execution (#526) (#571)
oboehmer Mar 10, 2026
3d0d25b
Merge remote-tracking branch 'origin/main' into release/pyats-integra…
oboehmer Mar 10, 2026
39bfca6
chore: release v2.0.0a1 (#626)
oboehmer Mar 10, 2026
e1d6336
fix(robot): handle relative output paths in pabot (#634)
oboehmer Mar 11, 2026
6acd65c
docs: remove obsolete REPORTING_PLAN_OPTION_D.md doc
oboehmer Mar 12, 2026
a263781
feat(pyats): add architecture-agnostic defaults resolution to NACTest…
aitestino Mar 19, 2026
88e5699
feat: enable Windows support for robot-only scenarios (#629)
oboehmer Mar 19, 2026
50075da
run CI on all branches, remove Makefile (feedback from Daniel)
oboehmer Mar 19, 2026
446257c
feat(robot): consolidate Robot working files under robot_results (#635)
oboehmer Mar 21, 2026
72bafca
fix(pyats): continue Robot tests when PyATS pre-flight fails & follow…
oboehmer Mar 21, 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/
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,44 @@
# 2.0.0

_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
- **Robot suite names changed**: Top-level Robot suite names now start with `Robot Results` instead of the output directory name. Use Robot's `--name MyProject` argument to override the top-level suite name when needed.
- **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)
- Consolidated rendered Robot templates, pabot intermediate files, and Robot result files under `robot_results/` to avoid output-root namespace collisions

# 1.2.3

- Exclude jsonpath-ng 1.8.0 due to upstream regression (#603)
Expand Down
Loading
Loading