feat/opnsense-codegen-type-safe #257
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/opnsense-codegen-type-safe"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Rewrite api_codegen to generate proper envelope-wrapping methods that accept model structs directly. Callers no longer need to manually construct RuleBody wrappers or extract UUIDs from raw JSON. Key changes: - Generated API clients wrap request bodies internally via serde rename (e.g., add_rule(&my_rule) serializes as {"rule": {...}}) - Add shared SearchRow type to response.rs with label() and is_enabled() helpers, eliminating per-module RuleSearchRow type conflicts - Extract body_key from PHP controller addBase/setBase calls - Rewrite dnat.rs and firewall.rs to use the typed API end-to-end: search returns SearchResponse<SearchRow>, add returns UuidResponse, set/del return StatusResponse — zero raw JSON in production code - Add EnsureApi trait in firewall.rs for generic find-or-create pattern The only remaining json!() calls in dnat.rs and firewall.rs are in test mock responses, which is expected.- Make UuidResponse.uuid default to empty string so validation failures ({"result": "failed", "validations": {...}}) don't cause deserialization errors. Add is_failed() helper method. - Fix HAProxy healthcheck construction: map check_type string to HealthcheckType enum (was sending empty string, OPNsense rejected it) - Fix HAProxy server construction: set mode (ServerMode) and type (ServerType) enum fields (were defaulting to empty, OPNsense rejected) Discovered by running E2E tests against real OPNsense VM — the typed structs with ..Default::default() sent empty strings for required enum fields, which OPNsense rejected as validation errors. Still needed: HAProxy backend mode/algorithm and frontend mode/ connectionBehaviour enums, and fixing search API pagination for filter/snat/vip verification counts.The E2E test revealed that OPNsense validation failures were being silently swallowed: add/set operations returned {"result": "failed", "validations": {...}} but the code treated them as success. Critical fixes: - add_item/set_item now return Error::Validation on failure instead of silently returning empty/failed responses - VLAN: set pcp (PriorityCodePoint) — required in OPNsense 26.1 - Firewall filter: set sequence and statetype (KeepState) - SNAT: set sequence - BINAT: set sequence and destination_net ("any") - DNAT: set sequence - VIP: default advbase=1 and advskew=0 (required even for IP aliases) - HAProxy backend: set mode, algorithm, persistence_cookiemode enums - HAProxy frontend: set mode, connectionBehaviour enums E2E test now passes: all 11 Scores run successfully against a real OPNsense VM, and the idempotency test (run twice, verify counts unchanged) confirms zero duplicates.