From 5a6d4145757452c77d67e238e7398815246fc4e4 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 16 Sep 2026 13:00:01 -0700 Subject: [PATCH] fix(sidecar): honor worker namespace suffix Signed-off-by: Biswa Panda --- lib/backend-common/src/args.rs | 66 ++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/lib/backend-common/src/args.rs b/lib/backend-common/src/args.rs index dc206810dfc5..1b57f49da0d5 100644 --- a/lib/backend-common/src/args.rs +++ b/lib/backend-common/src/args.rs @@ -28,8 +28,14 @@ use crate::disagg::DisaggregationMode; /// ``` #[derive(Args, Clone, Debug)] pub struct CommonArgs { - /// Dynamo namespace for discovery routing. - #[arg(long, default_value = "dynamo", env = "DYN_NAMESPACE")] + /// Dynamo namespace for discovery routing. `DYN_NAMESPACE_WORKER_SUFFIX` + /// is appended as `-{suffix}` unless it is empty or already present. + #[arg( + long, + default_value = "dynamo", + env = "DYN_NAMESPACE", + value_parser = parse_worker_namespace + )] pub namespace: String, /// Component name within the namespace. @@ -95,3 +101,59 @@ pub struct CommonArgs { #[arg(long, default_value_t = false, env = "DYN_ENABLE_RL")] pub enable_rl: bool, } + +fn parse_worker_namespace(namespace: &str) -> Result { + let Ok(suffix) = std::env::var("DYN_NAMESPACE_WORKER_SUFFIX") else { + return Ok(namespace.to_owned()); + }; + if suffix.is_empty() { + return Ok(namespace.to_owned()); + } + let suffix = format!("-{suffix}"); + if namespace.ends_with(&suffix) { + return Ok(namespace.to_owned()); + } + Ok(format!("{namespace}{suffix}")) +} + +#[cfg(test)] +mod tests { + use clap::Parser; + + use super::CommonArgs; + + #[derive(Parser)] + struct TestArgs { + #[command(flatten)] + common: CommonArgs, + } + + #[test] + #[serial_test::serial] + fn worker_suffix_is_applied_once_to_namespace() { + for (namespace, suffix, argv, expected) in [ + (Some("dynamo"), Some("qa1"), &["test"][..], "dynamo-qa1"), + (Some("dynamo-qa1"), Some("qa1"), &["test"][..], "dynamo-qa1"), + (Some("dynamo"), Some(""), &["test"][..], "dynamo"), + (Some("dynamo"), None, &["test"][..], "dynamo"), + (None, Some("qa1"), &["test"][..], "dynamo-qa1"), + ( + Some("ignored"), + Some("qa1"), + &["test", "--namespace", "cli"][..], + "cli-qa1", + ), + ] { + temp_env::with_vars( + [ + ("DYN_NAMESPACE", namespace), + ("DYN_NAMESPACE_WORKER_SUFFIX", suffix), + ], + || { + let args = TestArgs::try_parse_from(argv).unwrap(); + assert_eq!(args.common.namespace, expected); + }, + ); + } + } +}