diff --git a/rs/cli/src/cli.rs b/rs/cli/src/cli.rs index a16d6333..d9a2f145 100644 --- a/rs/cli/src/cli.rs +++ b/rs/cli/src/cli.rs @@ -339,6 +339,10 @@ pub(crate) mod nodes { #[clap(long)] no_auto: bool, + /// Remove also degraded nodes; by default only dead (offline) nodes are automatically removed + #[clap(long)] + remove_degraded: bool, + /// Specifies the filter used to remove extra nodes extra_nodes_filter: Vec, diff --git a/rs/cli/src/main.rs b/rs/cli/src/main.rs index 69d53999..30ee3139 100644 --- a/rs/cli/src/main.rs +++ b/rs/cli/src/main.rs @@ -243,7 +243,7 @@ async fn main() -> Result<(), anyhow::Error> { }, cli::Commands::Nodes(nodes) => { match &nodes.subcommand { - cli::nodes::Commands::Remove { extra_nodes_filter, no_auto, exclude, motivation } => { + cli::nodes::Commands::Remove { extra_nodes_filter, no_auto, remove_degraded, exclude, motivation } => { if motivation.is_none() && !extra_nodes_filter.is_empty() { cmd.error( ErrorKind::MissingRequiredArgument, @@ -255,6 +255,7 @@ async fn main() -> Result<(), anyhow::Error> { runner.remove_nodes(NodesRemoveRequest { extra_nodes_filter: extra_nodes_filter.clone(), no_auto: *no_auto, + remove_degraded: *remove_degraded, exclude: Some(exclude.clone()), motivation: motivation.clone().unwrap_or_default(), }, simulate).await diff --git a/rs/ic-management-backend/src/endpoints/nodes_ops.rs b/rs/ic-management-backend/src/endpoints/nodes_ops.rs index 5e51906c..493e9628 100644 --- a/rs/ic-management-backend/src/endpoints/nodes_ops.rs +++ b/rs/ic-management-backend/src/endpoints/nodes_ops.rs @@ -65,7 +65,13 @@ async fn remove( reason: NodeRemovalReason::Duplicates(principal), }); } - if !matches!(status, ic_management_types::Status::Healthy) { + let should_remove_node = if request.remove_degraded { + matches!(status, ic_management_types::Status::Dead) + || matches!(status, ic_management_types::Status::Degraded) + } else { + matches!(status, ic_management_types::Status::Dead) + }; + if should_remove_node { return Some(NodeRemoval { node: n, reason: NodeRemovalReason::Unhealthy(status), diff --git a/rs/ic-management-types/src/requests.rs b/rs/ic-management-types/src/requests.rs index 26f98e29..06e6cd66 100644 --- a/rs/ic-management-types/src/requests.rs +++ b/rs/ic-management-types/src/requests.rs @@ -130,6 +130,7 @@ impl Display for HostosRolloutReason { #[derive(Serialize, Deserialize)] pub struct NodesRemoveRequest { pub no_auto: bool, + pub remove_degraded: bool, pub extra_nodes_filter: Vec, pub exclude: Option>, pub motivation: String,