feat: return ip info

This commit is contained in:
kieran 2024-11-26 19:14:31 +00:00
parent 54acb09d0f
commit fd4af065f6
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
7 changed files with 17 additions and 9 deletions

View File

@ -25,9 +25,11 @@ impl Hydrate for Vm {
} }
async fn hydrate_down(&mut self, db: &Box<dyn LNVpsDb>) -> Result<()> { async fn hydrate_down(&mut self, db: &Box<dyn LNVpsDb>) -> Result<()> {
let payments = db.list_vm_payment(self.id).await?; //let payments = db.list_vm_payment(self.id).await?;
let ips = db.list_vm_ip_assignments(self.id).await?;
self.payments = Some(payments); //self.payments = Some(payments);
self.ip_assignments = Some(ips);
Ok(()) Ok(())
} }
} }

View File

@ -88,10 +88,10 @@ pub trait LNVpsDb: Sync + Send {
async fn insert_vm_ip_assignment(&self, ip_assignment: &VmIpAssignment) -> Result<u64>; async fn insert_vm_ip_assignment(&self, ip_assignment: &VmIpAssignment) -> Result<u64>;
/// List VM ip assignments /// List VM ip assignments
async fn get_vm_ip_assignments(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>>; async fn list_vm_ip_assignments(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>>;
/// List VM ip assignments by IP range /// List VM ip assignments by IP range
async fn get_vm_ip_assignments_in_range(&self, range_id: u64) -> Result<Vec<VmIpAssignment>>; async fn list_vm_ip_assignments_in_range(&self, range_id: u64) -> Result<Vec<VmIpAssignment>>;
/// List payments by VM id /// List payments by VM id
async fn list_vm_payment(&self, vm_id: u64) -> Result<Vec<VmPayment>>; async fn list_vm_payment(&self, vm_id: u64) -> Result<Vec<VmPayment>>;

View File

@ -217,9 +217,13 @@ pub struct Vm {
#[sqlx(skip)] #[sqlx(skip)]
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub ssh_key: Option<UserSshKey>, pub ssh_key: Option<UserSshKey>,
#[sqlx(skip)] #[sqlx(skip)]
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub payments: Option<Vec<VmPayment>>, pub payments: Option<Vec<VmPayment>>,
#[sqlx(skip)]
#[serde(skip_serializing_if = "Option::is_none")]
pub ip_assignments: Option<Vec<VmIpAssignment>>,
} }
#[derive(Serialize, Deserialize, FromRow, Clone, Debug)] #[derive(Serialize, Deserialize, FromRow, Clone, Debug)]

View File

@ -232,7 +232,7 @@ impl LNVpsDb for LNVpsDbMysql {
.try_get(0)?) .try_get(0)?)
} }
async fn get_vm_ip_assignments(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>> { async fn list_vm_ip_assignments(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>> {
sqlx::query_as("select * from vm_ip_assignment where vm_id = ?") sqlx::query_as("select * from vm_ip_assignment where vm_id = ?")
.bind(vm_id) .bind(vm_id)
.fetch_all(&self.db) .fetch_all(&self.db)
@ -240,7 +240,7 @@ impl LNVpsDb for LNVpsDbMysql {
.map_err(Error::new) .map_err(Error::new)
} }
async fn get_vm_ip_assignments_in_range(&self, range_id: u64) -> Result<Vec<VmIpAssignment>> { async fn list_vm_ip_assignments_in_range(&self, range_id: u64) -> Result<Vec<VmIpAssignment>> {
sqlx::query_as("select * from vm_ip_assignment where ip_range_id = ?") sqlx::query_as("select * from vm_ip_assignment where ip_range_id = ?")
.bind(range_id) .bind(range_id)
.fetch_all(&self.db) .fetch_all(&self.db)

View File

@ -80,6 +80,7 @@ async fn v1_list_vms(
let mut ret = vec![]; let mut ret = vec![];
for mut vm in vms { for mut vm in vms {
vm.hydrate_up(db).await?; vm.hydrate_up(db).await?;
vm.hydrate_down(db).await?;
if let Some(t) = &mut vm.template { if let Some(t) = &mut vm.template {
t.hydrate_up(db).await?; t.hydrate_up(db).await?;
} }
@ -105,6 +106,7 @@ async fn v1_get_vm(
return ApiData::err("VM doesnt belong to you"); return ApiData::err("VM doesnt belong to you");
} }
vm.hydrate_up(db).await?; vm.hydrate_up(db).await?;
vm.hydrate_down(db).await?;
if let Some(t) = &mut vm.template { if let Some(t) = &mut vm.template {
t.hydrate_up(db).await?; t.hydrate_up(db).await?;
} }

View File

@ -195,7 +195,7 @@ impl Provisioner for LNVpsProvisioner {
async fn allocate_ips(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>> { async fn allocate_ips(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>> {
let mut vm = self.db.get_vm(vm_id).await?; let mut vm = self.db.get_vm(vm_id).await?;
let ips = self.db.get_vm_ip_assignments(vm.id).await?; let ips = self.db.list_vm_ip_assignments(vm.id).await?;
if !ips.is_empty() { if !ips.is_empty() {
bail!("IP resources are already assigned"); bail!("IP resources are already assigned");
@ -217,7 +217,7 @@ impl Provisioner for LNVpsProvisioner {
// TODO: pick round-robin ranges // TODO: pick round-robin ranges
for range in ip_ranges { for range in ip_ranges {
let range_cidr: IpNetwork = range.cidr.parse()?; let range_cidr: IpNetwork = range.cidr.parse()?;
let ips = self.db.get_vm_ip_assignments_in_range(range.id).await?; let ips = self.db.list_vm_ip_assignments_in_range(range.id).await?;
let ips: HashSet<IpAddr> = ips.iter().map(|i| i.ip.parse().unwrap()).collect(); let ips: HashSet<IpAddr> = ips.iter().map(|i| i.ip.parse().unwrap()).collect();
// pick an IP at random // pick an IP at random

View File

@ -57,7 +57,7 @@ impl Worker {
if self.read_only { if self.read_only {
bail!("Cant spawn VM's in read-only mode"); bail!("Cant spawn VM's in read-only mode");
} }
let mut ips = self.db.get_vm_ip_assignments(vm.id).await?; let mut ips = self.db.list_vm_ip_assignments(vm.id).await?;
if ips.is_empty() { if ips.is_empty() {
ips = self.provisioner.allocate_ips(vm.id).await?; ips = self.provisioner.allocate_ips(vm.id).await?;
} }