From f4a1fe2c87bce69701f0727d1fcbe32cb37f4743 Mon Sep 17 00:00:00 2001 From: Daniel Wong Date: Thu, 23 Jul 2026 15:29:06 +0000 Subject: [PATCH 1/3] Added propose-to-update-standard-engine-replica-version to ic-admin. --- rs/registry/admin/bin/main.rs | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/rs/registry/admin/bin/main.rs b/rs/registry/admin/bin/main.rs index 5faa84564000..86740f5df944 100644 --- a/rs/registry/admin/bin/main.rs +++ b/rs/registry/admin/bin/main.rs @@ -419,6 +419,9 @@ enum SubCommand { /// Submits a proposal to bless an alternative GuestOS version for disaster recovery. ProposeToBlessAlternativeGuestOsVersion(ProposeToBlessAlternativeGuestOsVersionCmd), + /// Submits a proposal to change what replica version(s) are run by Cloud Engines. + ProposeToUpdateStandardEngineReplicaVersion(ProposeToUpdateStandardEngineReplicaVersionCmd), + /// Submits a proposal to change an existing canister on NNS. ProposeToChangeNnsCanister(ProposeToChangeNnsCanisterCmd), @@ -2183,6 +2186,60 @@ impl ProposalAction for ProposeToBlessAlternativeGuestOsVersionCmd { } } +/// Sub-command to submit a proposal to change what replica version(s) are run +/// by Cloud Engines. +#[derive_common_proposal_fields] +#[derive(Clone, Parser, ProposalMetadata)] +struct ProposeToUpdateStandardEngineReplicaVersionCmd { + /// The replica version that Cloud Engines should eventually upgrade to. + #[clap(long, required = true)] + new_replica_version_id: String, + + /// The replica version that Cloud Engines should upgrade from. + #[clap(long, required = true)] + old_replica_version_id: String, + + /// The (approximate) fraction of Cloud Engines that should be on new + /// replica version (the rest stay on the old one). Must be in the closed + /// interval [0.0, 1.0]. + #[clap(long, required = true)] + deployment_progress: f64, +} + +impl ProposalTitle for ProposeToUpdateStandardEngineReplicaVersionCmd { + fn title(&self) -> String { + if let Some(title) = &self.proposal_title { + return title.clone(); + } + + format!( + "Update {}% of Cloud Engines to {}", + self.deployment_progress * 100.0, + shortened_hash_string(&self.new_replica_version_id), + ) + } +} + +#[async_trait] +impl ProposalAction for ProposeToUpdateStandardEngineReplicaVersionCmd { + async fn action(&self, _: &Agent) -> ProposalActionRequest { + let Self { + new_replica_version_id, + old_replica_version_id, + deployment_progress, + .. + } = self.clone(); + + ProposalActionRequest::UpdateStandardEngineReplicaVersion( + ic_nns_governance_api::UpdateStandardEngineReplicaVersion { + new_replica_version_id: Some(new_replica_version_id), + old_replica_version_id: Some(old_replica_version_id), + deployment_progress: Some(deployment_progress), + }, + ) + } +} + /// Sub-command to submit a proposal to add a new NNS canister. #[derive_common_proposal_fields] #[derive(Parser, ProposalMetadata)] @@ -6037,6 +6094,16 @@ async fn main() { ); propose_action_from_command(cmd, canister_client, proposer).await; } + SubCommand::ProposeToUpdateStandardEngineReplicaVersion(cmd) => { + let (proposer, sender) = cmd.proposer_and_sender(sender); + let canister_client = make_canister_client( + reachable_nns_urls, + opts.verify_nns_responses, + opts.nns_public_key_pem_file, + sender, + ); + propose_action_from_command(cmd, canister_client, proposer).await; + } } } From b559f068ccd05c366650c79ea744a4ce26e24a53 Mon Sep 17 00:00:00 2001 From: Daniel Wong Date: Thu, 23 Jul 2026 18:57:39 +0000 Subject: [PATCH 2/3] Better formatting of floats in title of UpdateStandardEngineReplicaVersion. --- rs/registry/admin/bin/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rs/registry/admin/bin/main.rs b/rs/registry/admin/bin/main.rs index 86740f5df944..df84df25d69a 100644 --- a/rs/registry/admin/bin/main.rs +++ b/rs/registry/admin/bin/main.rs @@ -2213,7 +2213,7 @@ impl ProposalTitle for ProposeToUpdateStandardEngineReplicaVersionCmd { } format!( - "Update {}% of Cloud Engines to {}", + "Update {:.1}% of Cloud Engines to {}", self.deployment_progress * 100.0, shortened_hash_string(&self.new_replica_version_id), ) From a5149850e85bc42070c7d48990869d4514cf55cd Mon Sep 17 00:00:00 2001 From: Daniel Wong Date: Thu, 23 Jul 2026 19:03:01 +0000 Subject: [PATCH 3/3] small fix. --- rs/registry/admin/bin/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rs/registry/admin/bin/main.rs b/rs/registry/admin/bin/main.rs index df84df25d69a..bf3a84af84f9 100644 --- a/rs/registry/admin/bin/main.rs +++ b/rs/registry/admin/bin/main.rs @@ -4706,6 +4706,7 @@ async fn main() { SubCommand::ProposeToUpdateSnsDeployWhitelist(_) => (), SubCommand::ProposeToUpdateSnsSubnetIdsInSnsWasm(_) => (), SubCommand::ProposeToUpdateSshReadonlyAccessForAllUnassignedNodes(_) => (), + SubCommand::ProposeToUpdateStandardEngineReplicaVersion(_) => (), SubCommand::ProposeToUpdateSubnet(_) => (), SubCommand::ProposeToUpdateSubnetType(_) => (), SubCommand::ProposeToUpdateXdrIcpConversionRate(_) => (),