aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMendes <mendes.oulamara@pm.me>2022-10-05 16:04:19 +0200
committerMendes <mendes.oulamara@pm.me>2022-10-05 16:04:19 +0200
commita951b6c45273e59b98f974937aebb8ada8816ab8 (patch)
treeda8f89d774929082936a947ae8d7462568ab6c4f
parentceac3713d6639f9170fc3b4475fae4a30b34483c (diff)
downloadgarage-a951b6c45273e59b98f974937aebb8ada8816ab8.tar.gz
garage-a951b6c45273e59b98f974937aebb8ada8816ab8.zip
Added a CLI command to update the parameters for the layout computation (for now, only the zone redundancy)
-rw-r--r--src/garage/cli/layout.rs35
-rw-r--r--src/garage/cli/structs.rs14
2 files changed, 46 insertions, 3 deletions
diff --git a/src/garage/cli/layout.rs b/src/garage/cli/layout.rs
index a5b838e7..6b86e46d 100644
--- a/src/garage/cli/layout.rs
+++ b/src/garage/cli/layout.rs
@@ -14,8 +14,8 @@ pub async fn cli_layout_command_dispatch(
rpc_host: NodeID,
) -> Result<(), Error> {
match cmd {
- LayoutOperation::Assign(configure_opt) => {
- cmd_assign_role(system_rpc_endpoint, rpc_host, configure_opt).await
+ LayoutOperation::Assign(assign_opt) => {
+ cmd_assign_role(system_rpc_endpoint, rpc_host, assign_opt).await
}
LayoutOperation::Remove(remove_opt) => {
cmd_remove_role(system_rpc_endpoint, rpc_host, remove_opt).await
@@ -27,6 +27,9 @@ pub async fn cli_layout_command_dispatch(
LayoutOperation::Revert(revert_opt) => {
cmd_revert_layout(system_rpc_endpoint, rpc_host, revert_opt).await
}
+ LayoutOperation::Config(config_opt) => {
+ cmd_config_layout(system_rpc_endpoint, rpc_host, config_opt).await
+ }
}
}
@@ -245,6 +248,34 @@ pub async fn cmd_revert_layout(
Ok(())
}
+pub async fn cmd_config_layout(
+ rpc_cli: &Endpoint<SystemRpc, ()>,
+ rpc_host: NodeID,
+ config_opt: ConfigLayoutOpt,
+) -> Result<(), Error> {
+ let mut layout = fetch_layout(rpc_cli, rpc_host).await?;
+
+ match config_opt.redundancy {
+ None => (),
+ Some(r) => {
+ if r > layout.replication_factor {
+ println!("The zone redundancy must be smaller or equal to the \
+ replication factor ({}).", layout.replication_factor);
+ }
+ else if r < 1 {
+ println!("The zone redundancy must be at least 1.");
+ }
+ else {
+ layout.parameters.update(LayoutParameters{ zone_redundancy: r });
+ println!("The new zone redundancy has been staged.");
+ }
+ }
+ }
+
+ send_layout(rpc_cli, rpc_host, layout).await?;
+ Ok(())
+}
+
// --- utility ---
pub async fn fetch_layout(
diff --git a/src/garage/cli/structs.rs b/src/garage/cli/structs.rs
index 06548e89..896379bb 100644
--- a/src/garage/cli/structs.rs
+++ b/src/garage/cli/structs.rs
@@ -86,6 +86,10 @@ pub enum LayoutOperation {
/// Remove role from Garage cluster node
#[structopt(name = "remove", version = garage_version())]
Remove(RemoveRoleOpt),
+
+ /// Configure parameters value for the layout computation
+ #[structopt(name = "config", version = garage_version())]
+ Config(ConfigLayoutOpt),
/// Show roles currently assigned to nodes and changes staged for commit
#[structopt(name = "show", version = garage_version())]
@@ -100,6 +104,7 @@ pub enum LayoutOperation {
Revert(RevertLayoutOpt),
}
+
#[derive(StructOpt, Debug)]
pub struct AssignRoleOpt {
/// Node(s) to which to assign role (prefix of hexadecimal node id)
@@ -110,7 +115,7 @@ pub struct AssignRoleOpt {
#[structopt(short = "z", long = "zone")]
pub(crate) zone: Option<String>,
- /// Capacity (in relative terms, use 1 to represent your smallest server)
+ /// Capacity (in relative terms)
#[structopt(short = "c", long = "capacity")]
pub(crate) capacity: Option<u32>,
@@ -134,6 +139,13 @@ pub struct RemoveRoleOpt {
}
#[derive(StructOpt, Debug)]
+pub struct ConfigLayoutOpt {
+ /// Zone redundancy parameter
+ #[structopt(short = "r", long = "redundancy")]
+ pub(crate) redundancy: Option<usize>,
+}
+
+#[derive(StructOpt, Debug)]
pub struct ApplyLayoutOpt {
/// Version number of new configuration: this command will fail if
/// it is not exactly 1 + the previous configuration's version