feat(automation): lab config push/verify/report pipeline - #1
Merged
Conversation
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
…_scenario Co-Authored-By: Claude <noreply@anthropic.com>
…imports in reporter
…/all) Co-Authored-By: Claude <noreply@anthropic.com>
…nario, exit code Co-Authored-By: Claude <noreply@anthropic.com>
…narios Co-Authored-By: Claude <noreply@anthropic.com>
…scenario templates Co-Authored-By: Claude <noreply@anthropic.com>
…holders in templates Replace vacuous test body with a direct _deep_merge assertion that validates scenario vars override global vars while preserving non-overridden keys. Parameterize hardcoded RADIUS-SECRET, TACACS-SECRET, IPSEC-SECRET, L2TP-SECRET, and SNMP PUBLIC strings in scenario-01 and scenario-09 templates via a new secrets section in global.yaml, so operators cannot accidentally deploy unsubstituted placeholder values. Co-Authored-By: Claude <noreply@anthropic.com>
…ct compiler errors Regexes with the `g` flag are stateful (lastIndex). Resetting lastIndex inside useMemo violates the React compiler's immutability rules. Dropping `g` makes each .test() call stateless, eliminating both the mutation and the need to reset. Co-Authored-By: Claude <noreply@anthropic.com>
- PlatformComplianceSection: move setState calls out of synchronous effect body by chaining through Promise.resolve(); add AbortController cleanup; derive displayedContent from state instead of setting null inside the effect - ConfigViewer: move keywords lookup inside useMemo to fix exhaustive-deps warning (testCaseName is now the direct dependency) - print/route.ts: remove unused notFound import Co-Authored-By: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
automation/Python project (uv-managed, no venv) that renders Jinja2 config templates, pushes them to OCNOS and Juniper MX204 devices over SSH, captures show-command output to disk, and pre-populates the compliance tracker SQLite database withN/ATestResult rows for human review.drivers/base.py→OcnosDriver,JunosDriver) means adding a new NOS requires only one new file + two lines in the registry — no changes to the pipeline or CLI.hosts.yaml/groups.yaml) readable by both Nornir and Ansible.templates/vars/global.yaml; secret placeholders parameterized viasecrets.*vars.uv run lab-push render|push|verify|report|all --scenario <N|all> [--device X] [--workers N]ThreadPoolExecutor; failed hosts skipped in verify/report without aborting other hosts.Test plan
cd automation && uv sync && uv run pytest -v→ 18/18 passinguv run lab-push render --scenario all→ 36.cfgfiles inrendered/, no Jinja2 errorsuv run lab-push --help→ shows all 5 subcommands with correct optionsLAB_USERNAME,LAB_PASSWORD,DATABASE_URLand runuv run lab-push all --scenario 1against real devicesN/ATestResult rows appear in the compliance tracker web UI afterreportphase🤖 Generated with Claude Code