Added a CLI command to update the parameters for the layout computation (for now, only the zone redundancy)

This commit is contained in:
Mendes 2022-10-05 16:04:19 +02:00
parent ceac3713d6
commit a951b6c452
2 changed files with 46 additions and 3 deletions

View file

@ -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(

View file

@ -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>,
@ -133,6 +138,13 @@ pub struct RemoveRoleOpt {
pub(crate) node_id: String,
}
#[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