aboutsummaryrefslogtreecommitdiff
path: root/src/garage
diff options
context:
space:
mode:
Diffstat (limited to 'src/garage')
-rw-r--r--src/garage/admin.rs19
-rw-r--r--src/garage/cli/cmd.rs3
-rw-r--r--src/garage/cli/structs.rs22
3 files changed, 44 insertions, 0 deletions
diff --git a/src/garage/admin.rs b/src/garage/admin.rs
index 5599c53f..74b24584 100644
--- a/src/garage/admin.rs
+++ b/src/garage/admin.rs
@@ -19,6 +19,7 @@ use garage_model::bucket_alias_table::*;
use garage_model::bucket_table::*;
use garage_model::garage::Garage;
use garage_model::key_table::*;
+use garage_model::migrate::Migrate;
use garage_model::permission::*;
use crate::cli::*;
@@ -31,6 +32,7 @@ pub enum AdminRpc {
BucketOperation(BucketOperation),
KeyOperation(KeyOperation),
LaunchRepair(RepairOpt),
+ Migrate(MigrateOpt),
Stats(StatsOpt),
// Replies
@@ -650,6 +652,22 @@ impl AdminRpcHandler {
Ok(())
}
+ async fn handle_migrate(self: &Arc<Self>, opt: MigrateOpt) -> Result<AdminRpc, Error> {
+ if !opt.yes {
+ return Err(Error::BadRpc(
+ "Please provide the --yes flag to initiate migration operation.".to_string(),
+ ));
+ }
+
+ let m = Migrate {
+ garage: self.garage.clone(),
+ };
+ match opt.what {
+ MigrateWhat::Buckets050 => m.migrate_buckets050().await,
+ }?;
+ Ok(AdminRpc::Ok("Migration successfull.".into()))
+ }
+
async fn handle_launch_repair(self: &Arc<Self>, opt: RepairOpt) -> Result<AdminRpc, Error> {
if !opt.yes {
return Err(Error::BadRpc(
@@ -819,6 +837,7 @@ impl EndpointHandler<AdminRpc> for AdminRpcHandler {
match message {
AdminRpc::BucketOperation(bo) => self.handle_bucket_cmd(bo).await,
AdminRpc::KeyOperation(ko) => self.handle_key_cmd(ko).await,
+ AdminRpc::Migrate(opt) => self.handle_migrate(opt.clone()).await,
AdminRpc::LaunchRepair(opt) => self.handle_launch_repair(opt.clone()).await,
AdminRpc::Stats(opt) => self.handle_stats(opt.clone()).await,
_ => Err(Error::BadRpc("Invalid RPC".to_string())),
diff --git a/src/garage/cli/cmd.rs b/src/garage/cli/cmd.rs
index b7508e45..b65fea02 100644
--- a/src/garage/cli/cmd.rs
+++ b/src/garage/cli/cmd.rs
@@ -29,6 +29,9 @@ pub async fn cli_command_dispatch(
Command::Key(ko) => {
cmd_admin(admin_rpc_endpoint, rpc_host, AdminRpc::KeyOperation(ko)).await
}
+ Command::Migrate(mo) => {
+ cmd_admin(admin_rpc_endpoint, rpc_host, AdminRpc::Migrate(mo)).await
+ }
Command::Repair(ro) => {
cmd_admin(admin_rpc_endpoint, rpc_host, AdminRpc::LaunchRepair(ro)).await
}
diff --git a/src/garage/cli/structs.rs b/src/garage/cli/structs.rs
index 1905069e..bd7abc8e 100644
--- a/src/garage/cli/structs.rs
+++ b/src/garage/cli/structs.rs
@@ -28,6 +28,11 @@ pub enum Command {
#[structopt(name = "key")]
Key(KeyOperation),
+ /// Run migrations from previous Garage version
+ /// (DO NOT USE WITHOUT READING FULL DOCUMENTATION)
+ #[structopt(name = "migrate")]
+ Migrate(MigrateOpt),
+
/// Start repair of node data
#[structopt(name = "repair")]
Repair(RepairOpt),
@@ -320,6 +325,23 @@ pub struct KeyImportOpt {
}
#[derive(Serialize, Deserialize, StructOpt, Debug, Clone)]
+pub struct MigrateOpt {
+ /// Confirm the launch of the migrate operation
+ #[structopt(long = "yes")]
+ pub yes: bool,
+
+ #[structopt(subcommand)]
+ pub what: MigrateWhat,
+}
+
+#[derive(Serialize, Deserialize, StructOpt, Debug, Eq, PartialEq, Clone)]
+pub enum MigrateWhat {
+ /// Migrate buckets and permissions from v0.5.0
+ #[structopt(name = "buckets050")]
+ Buckets050,
+}
+
+#[derive(Serialize, Deserialize, StructOpt, Debug, Clone)]
pub struct RepairOpt {
/// Launch repair operation on all nodes
#[structopt(short = "a", long = "all-nodes")]