Expose repo migrations

This commit is contained in:
asonix 2023-08-16 16:32:19 -05:00
parent ba27a1a223
commit f95e61e402
4 changed files with 101 additions and 5 deletions

View file

@ -346,6 +346,35 @@ impl Args {
} }
} }
} }
Command::MigrateRepo(MigrateRepo { repo }) => {
let server = Server::default();
let client = Client::default();
let media = Media::default();
let metrics = Metrics::default();
match repo {
MigrateRepoFrom::Sled(MigrateSledRepo { from, to }) => match to {
MigrateRepoTo::Sled(MigrateSledInner { to }) => Output {
config_format: ConfigFormat {
server,
client,
old_repo,
tracing,
metrics,
media,
repo: None,
store: None,
},
operation: Operation::MigrateRepo {
from: from.into(),
to: to.into(),
},
config_file,
save_to,
},
},
}
}
} }
} }
} }
@ -366,6 +395,10 @@ pub(crate) enum Operation {
from: crate::config::primitives::Store, from: crate::config::primitives::Store,
to: crate::config::primitives::Store, to: crate::config::primitives::Store,
}, },
MigrateRepo {
from: crate::config::file::Repo,
to: crate::config::file::Repo,
},
} }
#[derive(Debug, Default, serde::Serialize)] #[derive(Debug, Default, serde::Serialize)]
@ -750,6 +783,9 @@ enum Command {
/// Migrates from one provided media store to another /// Migrates from one provided media store to another
MigrateStore(MigrateStore), MigrateStore(MigrateStore),
/// Migrates from one provided repo to another
MigrateRepo(MigrateRepo),
} }
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
@ -1000,6 +1036,12 @@ struct MigrateStore {
store: MigrateStoreFrom, store: MigrateStoreFrom,
} }
#[derive(Debug, Parser)]
struct MigrateRepo {
#[command(subcommand)]
repo: MigrateRepoFrom,
}
/// Configure the pict-rs storage migration /// Configure the pict-rs storage migration
#[derive(Debug, Subcommand)] #[derive(Debug, Subcommand)]
// allow large enum variant - this is an instantiated-once config // allow large enum variant - this is an instantiated-once config
@ -1012,6 +1054,12 @@ enum MigrateStoreFrom {
ObjectStorage(MigrateObjectStorage), ObjectStorage(MigrateObjectStorage),
} }
/// Configure the pict-rs repo migration
#[derive(Debug, Subcommand)]
enum MigrateRepoFrom {
Sled(MigrateSledRepo),
}
/// Configure the destination storage for pict-rs storage migration /// Configure the destination storage for pict-rs storage migration
#[derive(Debug, Subcommand)] #[derive(Debug, Subcommand)]
// allow large enum variant - this is an instantiated-once config // allow large enum variant - this is an instantiated-once config
@ -1024,6 +1072,13 @@ enum MigrateStoreTo {
ObjectStorage(MigrateObjectStorageInner), ObjectStorage(MigrateObjectStorageInner),
} }
/// Configure the destination repo for pict-rs repo migration
#[derive(Debug, Subcommand)]
enum MigrateRepoTo {
/// Migrate to the provided sled storage
Sled(MigrateSledInner),
}
/// Migrate pict-rs' storage from the provided filesystem storage /// Migrate pict-rs' storage from the provided filesystem storage
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
struct MigrateFilesystem { struct MigrateFilesystem {
@ -1034,6 +1089,16 @@ struct MigrateFilesystem {
to: MigrateStoreTo, to: MigrateStoreTo,
} }
/// Migrate pict-rs' repo from the provided sled repo
#[derive(Debug, Parser)]
struct MigrateSledRepo {
#[command(flatten)]
from: Sled,
#[command(subcommand)]
to: MigrateRepoTo,
}
/// Migrate pict-rs' storage to the provided filesystem storage /// Migrate pict-rs' storage to the provided filesystem storage
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
struct MigrateFilesystemInner { struct MigrateFilesystemInner {
@ -1044,6 +1109,13 @@ struct MigrateFilesystemInner {
repo: Option<Repo>, repo: Option<Repo>,
} }
/// Migrate pict-rs' repo to the provided sled repo
#[derive(Debug, Parser)]
struct MigrateSledInner {
#[command(flatten)]
to: Sled,
}
/// Migrate pict-rs' storage from the provided object storage /// Migrate pict-rs' storage from the provided object storage
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
struct MigrateObjectStorage { struct MigrateObjectStorage {
@ -1166,20 +1238,20 @@ struct ObjectStorage {
/// Configuration for the sled-backed data repository /// Configuration for the sled-backed data repository
#[derive(Debug, Parser, serde::Serialize)] #[derive(Debug, Parser, serde::Serialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
struct Sled { pub(super) struct Sled {
/// The path to store the sled database /// The path to store the sled database
#[arg(short, long)] #[arg(short, long)]
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
path: Option<PathBuf>, pub(super) path: Option<PathBuf>,
/// The cache capacity, in bytes, allowed to sled for in-memory operations /// The cache capacity, in bytes, allowed to sled for in-memory operations
#[arg(short, long)] #[arg(short, long)]
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
cache_capacity: Option<u64>, pub(super) cache_capacity: Option<u64>,
#[arg(short, long)] #[arg(short, long)]
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
export_path: Option<PathBuf>, pub(super) export_path: Option<PathBuf>,
} }
#[derive(Debug, Parser, serde::Serialize)] #[derive(Debug, Parser, serde::Serialize)]

View file

@ -353,3 +353,21 @@ impl From<crate::config::commandline::Filesystem> for crate::config::primitives:
crate::config::primitives::Store::Filesystem(value.into()) crate::config::primitives::Store::Filesystem(value.into())
} }
} }
impl From<crate::config::commandline::Sled> for crate::config::file::Sled {
fn from(value: crate::config::commandline::Sled) -> Self {
let defaults = SledDefaults::default();
crate::config::file::Sled {
path: value.path.unwrap_or(defaults.path),
cache_capacity: value.cache_capacity.unwrap_or(defaults.cache_capacity),
export_path: defaults.export_path,
}
}
}
impl From<crate::config::commandline::Sled> for crate::config::file::Repo {
fn from(value: crate::config::commandline::Sled) -> Self {
crate::config::file::Repo::Sled(value.into())
}
}

View file

@ -1916,6 +1916,12 @@ impl PictRsConfiguration {
return Ok(()); return Ok(());
} }
Operation::MigrateRepo { from, to } => {
let from = Repo::open(from)?.to_arc();
let to = Repo::open(to)?.to_arc();
repo::migrate_repo(from, to).await?;
}
} }
if config.server.read_only { if config.server.read_only {

View file

@ -13,7 +13,7 @@ mod migrate;
pub(crate) mod sled; pub(crate) mod sled;
pub(crate) use hash::Hash; pub(crate) use hash::Hash;
pub(crate) use migrate::migrate_04; pub(crate) use migrate::{migrate_04, migrate_repo};
pub(crate) type ArcRepo = Arc<dyn FullRepo>; pub(crate) type ArcRepo = Arc<dyn FullRepo>;