feat(smart-proxy): add hot-reloadable global ingress security policy across Rust and TypeScript proxy layers

This commit is contained in:
2026-04-26 15:11:10 +00:00
parent 8fa3a51b03
commit af4908b63f
53 changed files with 2350 additions and 1196 deletions
+17 -8
View File
@@ -1,6 +1,6 @@
use thiserror::Error;
use crate::route_types::{RouteConfig, RouteActionType};
use crate::route_types::{RouteActionType, RouteConfig};
/// Validation errors for route configurations.
#[derive(Debug, Error)]
@@ -30,9 +30,10 @@ pub enum ValidationError {
/// Validate a single route configuration.
pub fn validate_route(route: &RouteConfig) -> Result<(), Vec<ValidationError>> {
let mut errors = Vec::new();
let name = route.name.clone().unwrap_or_else(|| {
route.id.clone().unwrap_or_else(|| "unnamed".to_string())
});
let name = route
.name
.clone()
.unwrap_or_else(|| route.id.clone().unwrap_or_else(|| "unnamed".to_string()));
// Check ports
let ports = route.listening_ports();
@@ -160,7 +161,9 @@ mod tests {
let mut route = make_valid_route();
route.action.targets = None;
let errors = validate_route(&route).unwrap_err();
assert!(errors.iter().any(|e| matches!(e, ValidationError::MissingTargets { .. })));
assert!(errors
.iter()
.any(|e| matches!(e, ValidationError::MissingTargets { .. })));
}
#[test]
@@ -168,7 +171,9 @@ mod tests {
let mut route = make_valid_route();
route.action.targets = Some(vec![]);
let errors = validate_route(&route).unwrap_err();
assert!(errors.iter().any(|e| matches!(e, ValidationError::EmptyTargets { .. })));
assert!(errors
.iter()
.any(|e| matches!(e, ValidationError::EmptyTargets { .. })));
}
#[test]
@@ -176,7 +181,9 @@ mod tests {
let mut route = make_valid_route();
route.route_match.ports = PortRange::Single(0);
let errors = validate_route(&route).unwrap_err();
assert!(errors.iter().any(|e| matches!(e, ValidationError::InvalidPort { port: 0, .. })));
assert!(errors
.iter()
.any(|e| matches!(e, ValidationError::InvalidPort { port: 0, .. })));
}
#[test]
@@ -186,7 +193,9 @@ mod tests {
let mut r2 = make_valid_route();
r2.id = Some("route-1".to_string());
let errors = validate_routes(&[r1, r2]).unwrap_err();
assert!(errors.iter().any(|e| matches!(e, ValidationError::DuplicateId { .. })));
assert!(errors
.iter()
.any(|e| matches!(e, ValidationError::DuplicateId { .. })));
}
#[test]