srxmcp-v0.3.0 — Phase 3 cluster-health + JTAC support-bundle
srxmcp-v0.3.0 — Phase 3
Two new MCP tools (surface 8 → 10):
-
validate_chassis_cluster_health— runs 8 cluster-scoped RPCs, applies 7 ordered checks (red_led,disabled_secondary,control_link_failure,major_alarm,minor_alarm,recent_reboot,version_skew), rolls up to a singlepass | warn | failverdict. Standalone devices short-circuit toSrxState::NotConfigured. -
collect_jtac_support_bundle— per-router serialized via in-processSemaphorekeyed on(router, "support_bundle").problem_type=genericproduces an on-device tarball (BundleLocation::Device); per-type paths capture baseline + per-type RPCs (deduped) and tar them on LXC (BundleLocation::LxcStaging) with SHA-256.
Six new typed errors with the locked [code=<snake>] router=<name>: <detail> convention.
Live-lab smokes (LXC 601:30032)
- ✅
validate_chassis_cluster_healthagainstvSRX-test19-20→state=active,verdict=fail, surfaced real lab issues (Red LED, disabled RG members, control-link transitions). - ✅
validate_chassis_cluster_healthagainstvSRX-test10→state=not_configured(standalone short-circuit). - ✅
collect_jtac_support_bundleproblem_type=genericagainstvSRX-test10→BundleLocation::Devicewithnext_stephint. - ✅
collect_jtac_support_bundleproblem_type=[routing]againstvSRX-test10→BundleLocation::LxcStaging, 6.8 KB tarball, sha256 verified, baseline + routing RPCs captured.
Deploy footnote
/etc/systemd/system/rust-srxmcp.service ReadWritePaths= widened to include /var/lib/rust-srxmcp for the LXC staging dir (/var/lib/rust-srxmcp/staging/bundles/).
Known follow-ups (cosmetic / v0.3.1)
- Tarball filename double-prefixes
srxmcp-(request_id already has it):srxmcp-srxmcp-<uuid>.tgz. - Logs path stubbed in v0.3.0 (manifest records "not implemented in v0.3.0").
- v0.3.1 plan: consolidate per-type path onto on-device
request support informationonce per-RPC scoping is verified.
Verification
- 644 workspace tests green (cargo fmt / build / clippy
-D warnings/ test) - Fixture-based tests caught and fixed a real parser bug in
check_control_link_failure(<transition-reason>vs<redundancy-group-transition-reason>)