From 9564ecf850074e4efc022eb20f86cc93b15fbfc3 Mon Sep 17 00:00:00 2001 From: Eeshu-Yadav Date: Fri, 5 Sep 2025 14:11:01 +0530 Subject: [PATCH 1/3] Fix Envoy Go control plane adaptation issues - Add support for host_rewrite_specifier in RouteAction conversion - Handle missing name field in FilterChain by providing default name - Fix compilation errors and update tests Signed-off-by: Eeshu-Yadav --- orion-configuration/src/config/listener.rs | 2 +- .../http_connection_manager/route.rs | 53 ++++++++++++++++--- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/orion-configuration/src/config/listener.rs b/orion-configuration/src/config/listener.rs index b65e9252..4ff3db28 100644 --- a/orion-configuration/src/config/listener.rs +++ b/orion-configuration/src/config/listener.rs @@ -490,7 +490,7 @@ mod envoy_conversions { // transport_socket, transport_socket_connect_timeout // name, )?; - let name: CompactString = required!(name)?.into(); + let name: CompactString = if name.is_empty() { "default_filter_chain".into() } else { name.into() }; (|| -> Result<_, GenericError> { let name = name.clone(); let filter_chain_match = filter_chain_match diff --git a/orion-configuration/src/config/network_filters/http_connection_manager/route.rs b/orion-configuration/src/config/network_filters/http_connection_manager/route.rs index 16207461..ae061d45 100644 --- a/orion-configuration/src/config/network_filters/http_connection_manager/route.rs +++ b/orion-configuration/src/config/network_filters/http_connection_manager/route.rs @@ -82,6 +82,15 @@ pub enum PathRewriteSpecifier { Regex(RegexMatchAndSubstitute), } +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum AuthorityRewriteSpecifier { + Authority(#[serde(with = "http_serde_ext::authority")] Authority), + Header(CompactString), + Regex(RegexMatchAndSubstitute), + AutoHostRewrite, +} + impl PathRewriteSpecifier { /// will preserve the query part of the input if the replacement does not contain one #[allow(clippy::redundant_else)] @@ -232,6 +241,8 @@ pub struct RouteAction { #[serde(skip_serializing_if = "Option::is_none", default = "Default::default")] pub rewrite: Option, #[serde(skip_serializing_if = "Option::is_none", default = "Default::default")] + pub authority_rewrite: Option, + #[serde(skip_serializing_if = "Option::is_none", default = "Default::default")] pub retry_policy: Option, #[serde(skip_serializing_if = "Option::is_none", default = "Default::default")] pub upgrade_config: Option, @@ -644,10 +655,10 @@ mod tests { mod envoy_conversions { #![allow(deprecated)] use super::{ - Action, AuthorityRedirect, Connect, DirectResponseAction, DirectResponseBody, HashPolicy, PathMatcher, - PathRewriteSpecifier, PathSpecifier, PolicySpecifier, QueryParameterMatchSpecifier, QueryParameterMatcher, - RedirectAction, RedirectResponseCode, RegexMatchAndSubstitute, RouteAction, RouteMatch, UpgradeConfig, - Websocket, DEFAULT_TIMEOUT, + Action, AuthorityRedirect, AuthorityRewriteSpecifier, Connect, DirectResponseAction, DirectResponseBody, + HashPolicy, PathMatcher, PathRewriteSpecifier, PathSpecifier, PolicySpecifier, QueryParameterMatchSpecifier, + QueryParameterMatcher, RedirectAction, RedirectResponseCode, RegexMatchAndSubstitute, RouteAction, RouteMatch, + UpgradeConfig, Websocket, DEFAULT_TIMEOUT, }; use crate::config::{ common::*, @@ -672,7 +683,8 @@ mod envoy_conversions { ConnectionProperties as EnvoyConnectionProperties, Header as EnvoyHeader, PolicySpecifier as EnvoyPolicySpecifier, QueryParameter as EnvoyQueryParameter, }, - HashPolicy as EnvoyHashPolicy, UpgradeConfig as EnvoyUpgradeConfig, + HashPolicy as EnvoyHashPolicy, HostRewriteSpecifier as EnvoyHostRewriteSpecifier, + UpgradeConfig as EnvoyUpgradeConfig, }, route_match::PathSpecifier as EnvoyPathSpecifier, DirectResponseAction as EnvoyDirectResponseAction, QueryParameterMatcher as EnvoyQueryParameterMatcher, @@ -898,9 +910,8 @@ mod envoy_conversions { internal_redirect_action, max_internal_redirects, hedge_policy, - max_stream_duration, - // cluster_specifier, - host_rewrite_specifier + max_stream_duration // cluster_specifier, + // host_rewrite_specifier )?; let cluster_not_found_response_code = parse_cluster_not_found_response_code(cluster_not_found_response_code)?; @@ -924,11 +935,37 @@ mod envoy_conversions { let retry_policy = retry_policy.map(RetryPolicy::try_from).transpose().with_node("retry_policy")?; let upgrade_config = upgrade_configs.try_into().with_node("upgrade_configs").ok(); let hash_policy = convert_vec!(hash_policy)?; + let authority_rewrite = host_rewrite_specifier + .filter(|spec| if let EnvoyHostRewriteSpecifier::AutoHostRewrite(bv) = spec { bv.value } else { true }) + .map(|spec| match spec { + EnvoyHostRewriteSpecifier::HostRewriteLiteral(literal) => { + Authority::from_str(&literal).map(AuthorityRewriteSpecifier::Authority).map_err(|e| { + GenericError::from_msg_with_cause( + format!("failed to parse host rewrite literal '{literal}' as authority"), + e, + ) + }) + }, + EnvoyHostRewriteSpecifier::AutoHostRewrite(_) => Ok(AuthorityRewriteSpecifier::AutoHostRewrite), + EnvoyHostRewriteSpecifier::HostRewriteHeader(header) => match HeaderName::from_str(&header) { + Ok(_) => Ok(AuthorityRewriteSpecifier::Header(header.into())), + Err(e) => Err(GenericError::from_msg_with_cause( + format!("failed to parse host rewrite header '{header}' as header name"), + e, + )), + }, + EnvoyHostRewriteSpecifier::HostRewritePathRegex(regex) => { + regex.try_into().map(AuthorityRewriteSpecifier::Regex) + }, + }) + .transpose() + .with_node("host_rewrite_specifier")?; Ok(Self { cluster_not_found_response_code, timeout, cluster_specifier, rewrite, + authority_rewrite, retry_policy, upgrade_config, hash_policy, From bd20ca156dd6dcba95648172da8be1e37728dfbd Mon Sep 17 00:00:00 2001 From: Eeshu-Yadav Date: Wed, 10 Sep 2025 16:34:54 +0530 Subject: [PATCH 2/3] Address review comments: use empty string for default filter chain name and refactor authority_rewrite to use match Signed-off-by: Eeshu-Yadav --- orion-configuration/src/config/listener.rs | 2 +- .../http_connection_manager/route.rs | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/orion-configuration/src/config/listener.rs b/orion-configuration/src/config/listener.rs index 4ff3db28..0a62368c 100644 --- a/orion-configuration/src/config/listener.rs +++ b/orion-configuration/src/config/listener.rs @@ -490,7 +490,7 @@ mod envoy_conversions { // transport_socket, transport_socket_connect_timeout // name, )?; - let name: CompactString = if name.is_empty() { "default_filter_chain".into() } else { name.into() }; + let name: CompactString = if name.is_empty() { "".into() } else { name.into() }; (|| -> Result<_, GenericError> { let name = name.clone(); let filter_chain_match = filter_chain_match diff --git a/orion-configuration/src/config/network_filters/http_connection_manager/route.rs b/orion-configuration/src/config/network_filters/http_connection_manager/route.rs index ae061d45..3f530a76 100644 --- a/orion-configuration/src/config/network_filters/http_connection_manager/route.rs +++ b/orion-configuration/src/config/network_filters/http_connection_manager/route.rs @@ -935,9 +935,9 @@ mod envoy_conversions { let retry_policy = retry_policy.map(RetryPolicy::try_from).transpose().with_node("retry_policy")?; let upgrade_config = upgrade_configs.try_into().with_node("upgrade_configs").ok(); let hash_policy = convert_vec!(hash_policy)?; - let authority_rewrite = host_rewrite_specifier - .filter(|spec| if let EnvoyHostRewriteSpecifier::AutoHostRewrite(bv) = spec { bv.value } else { true }) - .map(|spec| match spec { + let authority_rewrite = match host_rewrite_specifier { + Some(EnvoyHostRewriteSpecifier::AutoHostRewrite(bv)) if !bv.value => Ok(None), + Some(spec) => match spec { EnvoyHostRewriteSpecifier::HostRewriteLiteral(literal) => { Authority::from_str(&literal).map(AuthorityRewriteSpecifier::Authority).map_err(|e| { GenericError::from_msg_with_cause( @@ -957,9 +957,11 @@ mod envoy_conversions { EnvoyHostRewriteSpecifier::HostRewritePathRegex(regex) => { regex.try_into().map(AuthorityRewriteSpecifier::Regex) }, - }) - .transpose() - .with_node("host_rewrite_specifier")?; + } + .map(Some), + None => Ok(None), + } + .with_node("host_rewrite_specifier")?; Ok(Self { cluster_not_found_response_code, timeout, From 780b3b8cbde8102b92a20921dca39185cc3b0f17 Mon Sep 17 00:00:00 2001 From: Eeshu-Yadav Date: Thu, 11 Sep 2025 11:24:30 +0530 Subject: [PATCH 3/3] Fix AutoHostRewrite boolean logic in route configuration Signed-off-by: Eeshu-Yadav --- .../network_filters/http_connection_manager/route.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/orion-configuration/src/config/network_filters/http_connection_manager/route.rs b/orion-configuration/src/config/network_filters/http_connection_manager/route.rs index 3f530a76..9537bd48 100644 --- a/orion-configuration/src/config/network_filters/http_connection_manager/route.rs +++ b/orion-configuration/src/config/network_filters/http_connection_manager/route.rs @@ -936,7 +936,13 @@ mod envoy_conversions { let upgrade_config = upgrade_configs.try_into().with_node("upgrade_configs").ok(); let hash_policy = convert_vec!(hash_policy)?; let authority_rewrite = match host_rewrite_specifier { - Some(EnvoyHostRewriteSpecifier::AutoHostRewrite(bv)) if !bv.value => Ok(None), + Some(EnvoyHostRewriteSpecifier::AutoHostRewrite(bv)) => { + if bv.value { + Ok(Some(AuthorityRewriteSpecifier::AutoHostRewrite)) + } else { + Ok(None) + } + }, Some(spec) => match spec { EnvoyHostRewriteSpecifier::HostRewriteLiteral(literal) => { Authority::from_str(&literal).map(AuthorityRewriteSpecifier::Authority).map_err(|e| { @@ -946,7 +952,6 @@ mod envoy_conversions { ) }) }, - EnvoyHostRewriteSpecifier::AutoHostRewrite(_) => Ok(AuthorityRewriteSpecifier::AutoHostRewrite), EnvoyHostRewriteSpecifier::HostRewriteHeader(header) => match HeaderName::from_str(&header) { Ok(_) => Ok(AuthorityRewriteSpecifier::Header(header.into())), Err(e) => Err(GenericError::from_msg_with_cause( @@ -957,6 +962,7 @@ mod envoy_conversions { EnvoyHostRewriteSpecifier::HostRewritePathRegex(regex) => { regex.try_into().map(AuthorityRewriteSpecifier::Regex) }, + EnvoyHostRewriteSpecifier::AutoHostRewrite(_) => unreachable!(), } .map(Some), None => Ok(None),