feat: return ip info
This commit is contained in:
parent
54acb09d0f
commit
fd4af065f6
@ -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(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>>;
|
||||||
|
@ -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)]
|
||||||
|
@ -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)
|
||||||
|
@ -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?;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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?;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user