aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex <alex@adnab.me>2022-05-09 11:14:55 +0200
committerAlex <alex@adnab.me>2022-05-09 11:14:55 +0200
commit277a20ec449011daab961e17b5c6bd7f48e3c291 (patch)
treed32e8c0e7712e4076bb2b218616d323dfd6e4227
parentc9ef3e461b54f36b7fb60e03959416339cd61a9f (diff)
downloadgarage-277a20ec449011daab961e17b5c6bd7f48e3c291.tar.gz
garage-277a20ec449011daab961e17b5c6bd7f48e3c291.zip
Fix `layout show` to not show changes when there are no changes (#297)
fixes #295, partially Co-authored-by: Alex Auvolat <alex@adnab.me> Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/297 Co-authored-by: Alex <alex@adnab.me> Co-committed-by: Alex <alex@adnab.me>
-rw-r--r--src/garage/cli/layout.rs25
-rw-r--r--src/garage/cli/util.rs2
2 files changed, 22 insertions, 5 deletions
diff --git a/src/garage/cli/layout.rs b/src/garage/cli/layout.rs
index e76f7737..88941d78 100644
--- a/src/garage/cli/layout.rs
+++ b/src/garage/cli/layout.rs
@@ -43,14 +43,22 @@ pub async fn cmd_assign_role(
resp => return Err(Error::Message(format!("Invalid RPC response: {:?}", resp))),
};
+ let mut layout = fetch_layout(rpc_cli, rpc_host).await?;
+
let added_nodes = args
.node_ids
.iter()
- .map(|node_id| find_matching_node(status.iter().map(|adv| adv.id), node_id))
+ .map(|node_id| {
+ find_matching_node(
+ status
+ .iter()
+ .map(|adv| adv.id)
+ .chain(layout.node_ids().iter().cloned()),
+ node_id,
+ )
+ })
.collect::<Result<Vec<_>, _>>()?;
- let mut layout = fetch_layout(rpc_cli, rpc_host).await?;
-
let mut roles = layout.roles.clone();
roles.merge(&layout.staging);
@@ -323,11 +331,20 @@ pub fn print_cluster_layout(layout: &ClusterLayout) -> bool {
}
pub fn print_staging_role_changes(layout: &ClusterLayout) -> bool {
- if !layout.staging.items().is_empty() {
+ let has_changes = layout
+ .staging
+ .items()
+ .iter()
+ .any(|(k, _, v)| layout.roles.get(k) != Some(v));
+
+ if has_changes {
println!();
println!("==== STAGED ROLE CHANGES ====");
let mut table = vec!["ID\tTags\tZone\tCapacity".to_string()];
for (id, _, role) in layout.staging.items().iter() {
+ if layout.roles.get(id) == Some(role) {
+ continue;
+ }
if let Some(role) = &role.0 {
let tags = role.tags.join(",");
table.push(format!(
diff --git a/src/garage/cli/util.rs b/src/garage/cli/util.rs
index 7d496507..fe11ad44 100644
--- a/src/garage/cli/util.rs
+++ b/src/garage/cli/util.rs
@@ -208,7 +208,7 @@ pub fn find_matching_node(
) -> Result<Uuid, Error> {
let mut candidates = vec![];
for c in cand {
- if hex::encode(&c).starts_with(&pattern) {
+ if hex::encode(&c).starts_with(&pattern) && !candidates.contains(&c) {
candidates.push(c);
}
}