From 7c5a2312e2bbb55b273cb00b1cb785c349f1a421 Mon Sep 17 00:00:00 2001 From: Pavel Agafonov Date: Thu, 16 Oct 2025 10:06:00 +0300 Subject: [PATCH] changes: add allow_update to ScaleComponent Signed-off-by: Pavel Agafonov --- crates/wadm/src/commands/mod.rs | 3 +++ crates/wadm/src/scaler/daemonscaler/mod.rs | 6 ++++++ crates/wadm/src/scaler/spreadscaler/mod.rs | 18 +++++++++++++----- crates/wadm/src/workers/command.rs | 1 + tests/command_consumer_integration.rs | 2 ++ tests/command_worker_integration.rs | 13 ++++++++++++- 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/crates/wadm/src/commands/mod.rs b/crates/wadm/src/commands/mod.rs index e8a4ac21..261cfb61 100644 --- a/crates/wadm/src/commands/mod.rs +++ b/crates/wadm/src/commands/mod.rs @@ -131,6 +131,9 @@ pub struct ScaleComponent { /// Named configuration to pass to the component. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub config: Vec, + /// Whether to perform allow updates to the component (triggering a separate update) + #[serde(default)] + pub allow_update: bool, } from_impl!(ScaleComponent); diff --git a/crates/wadm/src/scaler/daemonscaler/mod.rs b/crates/wadm/src/scaler/daemonscaler/mod.rs index 0536c5a8..e70c4422 100644 --- a/crates/wadm/src/scaler/daemonscaler/mod.rs +++ b/crates/wadm/src/scaler/daemonscaler/mod.rs @@ -159,6 +159,7 @@ impl Scaler for ComponentDaemonScaler { model_name: self.spread_config.model_name.to_owned(), annotations: BTreeMap::new(), config: self.config.clone(), + allow_update: false, })) } else { None @@ -242,6 +243,7 @@ impl Scaler for ComponentDaemonScaler { self.id(), ), config: self.config.clone(), + allow_update: true, })) } } @@ -453,6 +455,7 @@ mod test { model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("ComplexOne", daemonscaler.id()), config: vec![], + allow_update: false, }))); assert!(cmds.contains(&Command::ScaleComponent(ScaleComponent { component_id: component_id.to_string(), @@ -462,6 +465,7 @@ mod test { model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("ComplexTwo", daemonscaler.id()), config: vec![], + allow_update: false, }))); assert!(cmds.contains(&Command::ScaleComponent(ScaleComponent { component_id: component_id.to_string(), @@ -471,6 +475,7 @@ mod test { model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("ComplexThree", daemonscaler.id()), config: vec![], + allow_update: false, }))); assert!(cmds.contains(&Command::ScaleComponent(ScaleComponent { component_id: component_id.to_string(), @@ -480,6 +485,7 @@ mod test { model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("ComplexFour", daemonscaler.id()), config: vec![], + allow_update: false, }))); Ok(()) diff --git a/crates/wadm/src/scaler/spreadscaler/mod.rs b/crates/wadm/src/scaler/spreadscaler/mod.rs index b43b2fad..015cf23a 100644 --- a/crates/wadm/src/scaler/spreadscaler/mod.rs +++ b/crates/wadm/src/scaler/spreadscaler/mod.rs @@ -156,6 +156,7 @@ impl Scaler for ComponentSpreadScaler { model_name: self.spread_config.model_name.to_owned(), annotations: BTreeMap::new(), config: self.config.clone(), + allow_update: false, })) } else { None @@ -237,6 +238,7 @@ impl Scaler for ComponentSpreadScaler { model_name: self.spread_config.model_name.to_owned(), annotations: spreadscaler_annotations(&spread.name, self.id()), config: self.config.clone(), + allow_update: true, })]) } // Stop components to reach desired instances @@ -261,6 +263,7 @@ impl Scaler for ComponentSpreadScaler { model_name: self.spread_config.model_name.to_owned(), annotations: spreadscaler_annotations(&spread.name, self.id()), config: self.config.clone(), + allow_update: false, })); } (current_stopped, commands) @@ -869,7 +872,8 @@ mod test { count: 53, model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("EastZone", spreadscaler.id()), - config: vec![] + config: vec![], + allow_update: false, }))); assert!(cmds.contains(&Command::ScaleComponent(ScaleComponent { @@ -879,7 +883,8 @@ mod test { count: 3, model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("WestZone", spreadscaler.id()), - config: vec![] + config: vec![], + allow_update: false, }))); assert!(cmds.contains(&Command::ScaleComponent(ScaleComponent { @@ -889,7 +894,8 @@ mod test { count: 47, model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("CentralZone", spreadscaler.id()), - config: vec![] + config: vec![], + allow_update: false, }))); Ok(()) @@ -1322,7 +1328,8 @@ mod test { count: 0, model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("default", spreadscaler.id()), - config: vec![] + config: vec![], + allow_update: false, }))); assert!(cmds.contains(&Command::ScaleComponent(ScaleComponent { component_id: component_id.clone(), @@ -1331,7 +1338,8 @@ mod test { count: 0, model_name: MODEL_NAME.to_string(), annotations: spreadscaler_annotations("default", spreadscaler.id()), - config: vec![] + config: vec![], + allow_update: false, }))); Ok(()) } diff --git a/crates/wadm/src/workers/command.rs b/crates/wadm/src/workers/command.rs index d89aaaa8..94a59c96 100644 --- a/crates/wadm/src/workers/command.rs +++ b/crates/wadm/src/workers/command.rs @@ -43,6 +43,7 @@ impl Worker for CommandWorker { component.count, Some(annotations.into_iter().collect()), component.config.clone(), + // TODO: component.allow_update ) .await } diff --git a/tests/command_consumer_integration.rs b/tests/command_consumer_integration.rs index 548b97a1..0a2835c3 100644 --- a/tests/command_consumer_integration.rs +++ b/tests/command_consumer_integration.rs @@ -29,6 +29,7 @@ async fn test_consumer_stream() { model_name: "fake".into(), annotations: BTreeMap::new(), config: vec![], + allow_update: false, }) .await; wrapper @@ -166,6 +167,7 @@ async fn test_nack_and_rereceive() { model_name: "fake".into(), annotations: BTreeMap::new(), config: vec![], + allow_update: false, }) .await; diff --git a/tests/command_worker_integration.rs b/tests/command_worker_integration.rs index b62e2d93..f4209cf3 100644 --- a/tests/command_worker_integration.rs +++ b/tests/command_worker_integration.rs @@ -53,6 +53,7 @@ async fn test_commands() { model_name: "fake".into(), annotations: BTreeMap::new(), config: vec![], + allow_update: false, }) .await; @@ -295,6 +296,7 @@ async fn test_commands() { model_name: "fake".into(), annotations: BTreeMap::new(), config: vec![], + allow_update: false, }) .await; @@ -353,7 +355,15 @@ async fn test_annotation_stop() { // acts on _everything_. We could technically move this back down after the initial scale up of // the managed components after https://github.com/wasmCloud/wasmCloud/issues/746 is resolved ctl_client - .scale_component(host_id, HELLO_IMAGE_REF, "unmanaged-hello", 1, None, vec![]) + .scale_component( + host_id, + HELLO_IMAGE_REF, + "unmanaged-hello", + 1, + None, + vec![], + /* false */ + ) .await .unwrap(); @@ -433,6 +443,7 @@ async fn test_annotation_stop() { model_name: "fake".into(), annotations: BTreeMap::from_iter([("fake".to_string(), "wake".to_string())]), config: vec![], + allow_update: false, }) .await;