Files
api/lnvps_api/src/data_migration/ip6_init.rs
Kieran 9296e571ec
All checks were successful
continuous-integration/drone/push Build is passing
refactor: convert to workspace
2025-04-02 13:18:18 +01:00

54 lines
1.8 KiB
Rust

use crate::data_migration::DataMigration;
use crate::provisioner::{LNVpsProvisioner, NetworkProvisioner};
use ipnetwork::IpNetwork;
use lnvps_db::LNVpsDb;
use std::future::Future;
use std::pin::Pin;
use std::str::FromStr;
use std::sync::Arc;
use chrono::Utc;
use log::info;
pub struct Ip6InitDataMigration {
db: Arc<dyn LNVpsDb>,
provisioner: Arc<LNVpsProvisioner>,
}
impl Ip6InitDataMigration {
pub fn new(db: Arc<dyn LNVpsDb>, provisioner: Arc<LNVpsProvisioner>) -> Ip6InitDataMigration {
Self { db, provisioner }
}
}
impl DataMigration for Ip6InitDataMigration {
fn migrate(&self) -> Pin<Box<dyn Future<Output = anyhow::Result<()>> + Send>> {
let db = self.db.clone();
let provisioner = self.provisioner.clone();
Box::pin(async move {
let net = NetworkProvisioner::new(db.clone());
let vms = db.list_vms().await?;
for vm in vms {
if vm.expires < Utc::now() {
continue;
}
let host = db.get_host(vm.host_id).await?;
let ips = db.list_vm_ip_assignments(vm.id).await?;
// if no ipv6 address is picked already pick one
if ips.iter().all(|i| {
IpNetwork::from_str(&i.ip)
.map(|i| i.is_ipv4())
.unwrap_or(false)
})
{
let ips_pick = net.pick_ip_for_region(host.region_id).await?;
if let Some(mut v6) = ips_pick.ip6 {
info!("Assigning ip {} to vm {}", v6.ip, vm.id);
provisioner.assign_available_v6_to_vm(&vm, &mut v6).await?;
}
}
}
Ok(())
})
}
}