migrate 1.6 to 1.7

This commit is contained in:
mbecker20
2024-06-09 22:46:21 -07:00
parent e7891f7870
commit 4382ad0b3b
5 changed files with 126 additions and 6 deletions

View File

@@ -1,9 +1,33 @@
use mungos::{init::MongoBuilder, mongodb::Collection};
use serde::{Deserialize, Serialize};
pub mod build;
pub mod deployment;
pub mod resource;
pub struct DbClient {
pub deployments: Collection<deployment::Deployment>,
pub builds: Collection<build::Build>,
}
impl DbClient {
pub async fn new(
legacy_uri: &str,
legacy_db_name: &str,
) -> DbClient {
let client = MongoBuilder::default()
.uri(legacy_uri)
.build()
.await
.expect("failed to init legacy mongo client");
let db = client.database(legacy_db_name);
DbClient {
deployments: db.collection("Deployment"),
builds: db.collection("Build"),
}
}
}
#[derive(
Serialize, Deserialize, Debug, Clone, Default, PartialEq,
)]

View File

@@ -11,8 +11,15 @@ use serde::Deserialize;
mod legacy;
mod migrate;
#[derive(Deserialize)]
enum AppMode {
V0,
V1_6,
}
#[derive(Deserialize)]
struct Env {
app_mode: AppMode,
legacy_uri: String,
legacy_db_name: String,
target_uri: String,
@@ -28,13 +35,26 @@ async fn main() -> anyhow::Result<()> {
let env: Env = envy::from_env()?;
let legacy_db =
legacy::v0::DbClient::new(&env.legacy_uri, &env.legacy_db_name)
match env.app_mode {
AppMode::V0 => {
let legacy_db = legacy::v0::DbClient::new(
&env.legacy_uri,
&env.legacy_db_name,
)
.await;
let target_db =
DbClient::new(&env.target_uri, &env.target_db_name).await?;
migrate::migrate_all(&legacy_db, &target_db).await?;
let target_db =
DbClient::new(&env.target_uri, &env.target_db_name).await?;
migrate::v0::migrate_all(&legacy_db, &target_db).await?
}
AppMode::V1_6 => {
let db = legacy::v1_6::DbClient::new(
&env.legacy_uri,
&env.legacy_db_name,
)
.await;
migrate::v1_6::migrate_all_in_place(&db).await?
}
}
info!("finished!");

View File

@@ -0,0 +1,2 @@
pub mod v0;
pub mod v1_6;

View File

@@ -0,0 +1,74 @@
use anyhow::Context;
use monitor_client::entities::{
build::Build, deployment::Deployment,
};
use mungos::{
find::find_collect,
mongodb::bson::{doc, to_document},
};
use crate::legacy::v1_6;
pub async fn migrate_all_in_place(
db: &v1_6::DbClient,
) -> anyhow::Result<()> {
migrate_deployments_in_place(db).await?;
migrate_builds_in_place(db).await?;
Ok(())
}
pub async fn migrate_deployments_in_place(
db: &v1_6::DbClient,
) -> anyhow::Result<()> {
let deployments = find_collect(&db.deployments, None, None)
.await
.context("failed to get deployments")?
.into_iter()
.map(Into::into)
.collect::<Vec<Deployment>>();
info!("migrating {} deployments...", deployments.len());
for deployment in deployments {
db.deployments
.update_one(
doc! { "name": &deployment.name },
doc! { "$set": to_document(&deployment)? },
None,
)
.await
.context("failed to insert deployments on target")?;
}
info!("deployments have been migrated\n");
Ok(())
}
pub async fn migrate_builds_in_place(
db: &v1_6::DbClient,
) -> anyhow::Result<()> {
let builds = find_collect(&db.builds, None, None)
.await
.context("failed to get builds")?
.into_iter()
.map(Into::into)
.collect::<Vec<Build>>();
info!("migrating {} builds...", builds.len());
for build in builds {
db.builds
.update_one(
doc! { "name": &build.name },
doc! { "$set": to_document(&build)? },
None,
)
.await
.context("failed to insert builds on target")?;
}
info!("builds have been migrated\n");
Ok(())
}