aboutsummaryrefslogtreecommitdiff
path: root/src/garage/cli/layout.rs
diff options
context:
space:
mode:
authorAlex <lx@deuxfleurs.fr>2025-01-30 16:18:38 +0000
committerAlex <lx@deuxfleurs.fr>2025-01-30 16:18:38 +0000
commit3192088aac0e1795401304a8dec715cd343538cf (patch)
treebfea9c13130481a3463f8bba2c2fe85fe3be6cd4 /src/garage/cli/layout.rs
parent6ed78abb5cd09f4e5ca5effe5d6137faf33133f8 (diff)
parent5a89350b382f9a24d4e81b056f88dc16a5daa080 (diff)
downloadgarage-3192088aac0e1795401304a8dec715cd343538cf.tar.gz
garage-3192088aac0e1795401304a8dec715cd343538cf.zip
Merge pull request 'admin refactoring: refactor CLI to use Admin API requests (step 2)' (#943) from refactor-admin into next-v2
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/943
Diffstat (limited to 'src/garage/cli/layout.rs')
-rw-r--r--src/garage/cli/layout.rs210
1 files changed, 0 insertions, 210 deletions
diff --git a/src/garage/cli/layout.rs b/src/garage/cli/layout.rs
index f053eef4..bb81d144 100644
--- a/src/garage/cli/layout.rs
+++ b/src/garage/cli/layout.rs
@@ -1,7 +1,6 @@
use bytesize::ByteSize;
use format_table::format_table;
-use garage_util::crdt::Crdt;
use garage_util::error::*;
use garage_rpc::layout::*;
@@ -10,174 +9,6 @@ use garage_rpc::*;
use crate::cli::*;
-pub async fn cli_layout_command_dispatch(
- cmd: LayoutOperation,
- system_rpc_endpoint: &Endpoint<SystemRpc, ()>,
- rpc_host: NodeID,
-) -> Result<(), Error> {
- match cmd {
- 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
- }
- LayoutOperation::Show => cmd_show_layout(system_rpc_endpoint, rpc_host).await,
- LayoutOperation::Apply(apply_opt) => {
- cmd_apply_layout(system_rpc_endpoint, rpc_host, apply_opt).await
- }
- 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
- }
- LayoutOperation::History => cmd_layout_history(system_rpc_endpoint, rpc_host).await,
- LayoutOperation::SkipDeadNodes(assume_sync_opt) => {
- cmd_layout_skip_dead_nodes(system_rpc_endpoint, rpc_host, assume_sync_opt).await
- }
- }
-}
-
-pub async fn cmd_assign_role(
- rpc_cli: &Endpoint<SystemRpc, ()>,
- rpc_host: NodeID,
- args: AssignRoleOpt,
-) -> Result<(), Error> {
- let status = match rpc_cli
- .call(&rpc_host, SystemRpc::GetKnownNodes, PRIO_NORMAL)
- .await??
- {
- SystemRpc::ReturnKnownNodes(nodes) => nodes,
- resp => return Err(Error::Message(format!("Invalid RPC response: {:?}", resp))),
- };
-
- let mut layout = fetch_layout(rpc_cli, rpc_host).await?;
- let all_nodes = layout.get_all_nodes();
-
- let added_nodes = args
- .node_ids
- .iter()
- .map(|node_id| {
- find_matching_node(
- status
- .iter()
- .map(|adv| adv.id)
- .chain(all_nodes.iter().cloned()),
- node_id,
- )
- })
- .collect::<Result<Vec<_>, _>>()?;
-
- let mut roles = layout.current().roles.clone();
- roles.merge(&layout.staging.get().roles);
-
- for replaced in args.replace.iter() {
- let replaced_node = find_matching_node(all_nodes.iter().cloned(), replaced)?;
- match roles.get(&replaced_node) {
- Some(NodeRoleV(Some(_))) => {
- layout
- .staging
- .get_mut()
- .roles
- .merge(&roles.update_mutator(replaced_node, NodeRoleV(None)));
- }
- _ => {
- return Err(Error::Message(format!(
- "Cannot replace node {:?} as it is not currently in planned layout",
- replaced_node
- )));
- }
- }
- }
-
- if args.capacity.is_some() && args.gateway {
- return Err(Error::Message(
- "-c and -g are mutually exclusive, please configure node either with c>0 to act as a storage node or with -g to act as a gateway node".into()));
- }
- if args.capacity == Some(ByteSize::b(0)) {
- return Err(Error::Message("Invalid capacity value: 0".into()));
- }
-
- for added_node in added_nodes {
- let new_entry = match roles.get(&added_node) {
- Some(NodeRoleV(Some(old))) => {
- let capacity = match args.capacity {
- Some(c) => Some(c.as_u64()),
- None if args.gateway => None,
- None => old.capacity,
- };
- let tags = if args.tags.is_empty() {
- old.tags.clone()
- } else {
- args.tags.clone()
- };
- NodeRole {
- zone: args.zone.clone().unwrap_or_else(|| old.zone.to_string()),
- capacity,
- tags,
- }
- }
- _ => {
- let capacity = match args.capacity {
- Some(c) => Some(c.as_u64()),
- None if args.gateway => None,
- None => return Err(Error::Message(
- "Please specify a capacity with the -c flag, or set node explicitly as gateway with -g".into())),
- };
- NodeRole {
- zone: args
- .zone
- .clone()
- .ok_or("Please specify a zone with the -z flag")?,
- capacity,
- tags: args.tags.clone(),
- }
- }
- };
-
- layout
- .staging
- .get_mut()
- .roles
- .merge(&roles.update_mutator(added_node, NodeRoleV(Some(new_entry))));
- }
-
- send_layout(rpc_cli, rpc_host, layout).await?;
-
- println!("Role changes are staged but not yet committed.");
- println!("Use `garage layout show` to view staged role changes,");
- println!("and `garage layout apply` to enact staged changes.");
- Ok(())
-}
-
-pub async fn cmd_remove_role(
- rpc_cli: &Endpoint<SystemRpc, ()>,
- rpc_host: NodeID,
- args: RemoveRoleOpt,
-) -> Result<(), Error> {
- let mut layout = fetch_layout(rpc_cli, rpc_host).await?;
-
- let mut roles = layout.current().roles.clone();
- roles.merge(&layout.staging.get().roles);
-
- let deleted_node =
- find_matching_node(roles.items().iter().map(|(id, _, _)| *id), &args.node_id)?;
-
- layout
- .staging
- .get_mut()
- .roles
- .merge(&roles.update_mutator(deleted_node, NodeRoleV(None)));
-
- send_layout(rpc_cli, rpc_host, layout).await?;
-
- println!("Role removal is staged but not yet committed.");
- println!("Use `garage layout show` to view staged role changes,");
- println!("and `garage layout apply` to enact staged changes.");
- Ok(())
-}
-
pub async fn cmd_show_layout(
rpc_cli: &Endpoint<SystemRpc, ()>,
rpc_host: NodeID,
@@ -226,47 +57,6 @@ pub async fn cmd_show_layout(
Ok(())
}
-pub async fn cmd_apply_layout(
- rpc_cli: &Endpoint<SystemRpc, ()>,
- rpc_host: NodeID,
- apply_opt: ApplyLayoutOpt,
-) -> Result<(), Error> {
- let layout = fetch_layout(rpc_cli, rpc_host).await?;
-
- let (layout, msg) = layout.apply_staged_changes(apply_opt.version)?;
- for line in msg.iter() {
- println!("{}", line);
- }
-
- send_layout(rpc_cli, rpc_host, layout).await?;
-
- println!("New cluster layout with updated role assignment has been applied in cluster.");
- println!("Data will now be moved around between nodes accordingly.");
-
- Ok(())
-}
-
-pub async fn cmd_revert_layout(
- rpc_cli: &Endpoint<SystemRpc, ()>,
- rpc_host: NodeID,
- revert_opt: RevertLayoutOpt,
-) -> Result<(), Error> {
- if !revert_opt.yes {
- return Err(Error::Message(
- "Please add the --yes flag to run the layout revert operation".into(),
- ));
- }
-
- let layout = fetch_layout(rpc_cli, rpc_host).await?;
-
- let layout = layout.revert_staged_changes()?;
-
- send_layout(rpc_cli, rpc_host, layout).await?;
-
- println!("All proposed role changes in cluster layout have been canceled.");
- Ok(())
-}
-
pub async fn cmd_config_layout(
rpc_cli: &Endpoint<SystemRpc, ()>,
rpc_host: NodeID,