feat: assign mac / gateway

This commit is contained in:
2024-11-29 11:18:02 +00:00
parent 1cc4d40082
commit 06d8339653
14 changed files with 238 additions and 16 deletions

View File

@ -1,4 +1,4 @@
use crate::{LNVpsDb, Vm, VmTemplate};
use crate::{LNVpsDb, Vm, VmIpAssignment, VmTemplate};
use anyhow::Result;
use async_trait::async_trait;
use std::ops::Deref;
@ -49,3 +49,15 @@ impl<D: Deref<Target = dyn LNVpsDb> + Sync> Hydrate<D> for VmTemplate {
todo!()
}
}
#[async_trait]
impl<D: Deref<Target = dyn LNVpsDb> + Sync> Hydrate<D> for VmIpAssignment {
async fn hydrate_up(&mut self, db: &D) -> Result<()> {
self.ip_range = Some(db.get_ip_range(self.ip_range_id).await?);
Ok(())
}
async fn hydrate_down(&mut self, db: &D) -> Result<()> {
todo!()
}
}

View File

@ -60,6 +60,9 @@ pub trait LNVpsDb: Sync + Send {
/// List available OS images
async fn list_os_image(&self) -> Result<Vec<VmOsImage>>;
/// List available IP Ranges
async fn get_ip_range(&self, id: u64) -> Result<IpRange>;
/// List available IP Ranges
async fn list_ip_range(&self) -> Result<Vec<IpRange>>;

View File

@ -149,6 +149,7 @@ impl VmOsImage {
pub struct IpRange {
pub id: u64,
pub cidr: String,
pub gateway: String,
pub enabled: bool,
pub region_id: u64,
}
@ -225,6 +226,8 @@ pub struct Vm {
pub disk_size: u64,
/// The [VmHostDisk] this VM is on
pub disk_id: u64,
/// Network MAC address
pub mac_address: String,
#[sqlx(skip)]
#[serde(skip_serializing_if = "Option::is_none")]
@ -244,12 +247,16 @@ pub struct Vm {
pub ip_assignments: Option<Vec<VmIpAssignment>>,
}
#[derive(Serialize, Deserialize, FromRow, Clone, Debug)]
#[derive(Serialize, Deserialize, FromRow, Clone, Debug, Default)]
pub struct VmIpAssignment {
pub id: u64,
pub vm_id: u64,
pub ip_range_id: u64,
pub ip: String,
#[sqlx(skip)]
#[serde(skip_serializing_if = "Option::is_none")]
pub ip_range: Option<IpRange>,
}
#[serde_as]

View File

@ -152,6 +152,14 @@ impl LNVpsDb for LNVpsDbMysql {
.map_err(Error::new)
}
async fn get_ip_range(&self, id: u64) -> Result<IpRange> {
sqlx::query_as("select * from ip_range where id=?")
.bind(id)
.fetch_one(&self.db)
.await
.map_err(Error::new)
}
async fn list_ip_range(&self) -> Result<Vec<IpRange>> {
sqlx::query_as("select * from ip_range")
.fetch_all(&self.db)
@ -206,7 +214,7 @@ impl LNVpsDb for LNVpsDbMysql {
}
async fn insert_vm(&self, vm: &Vm) -> Result<u64> {
Ok(sqlx::query("insert into vm(host_id,user_id,image_id,template_id,ssh_key_id,created,expires,cpu,memory,disk_size,disk_id) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) returning id")
Ok(sqlx::query("insert into vm(host_id,user_id,image_id,template_id,ssh_key_id,created,expires,cpu,memory,disk_size,disk_id,mac_address) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) returning id")
.bind(vm.host_id)
.bind(vm.user_id)
.bind(vm.image_id)
@ -218,6 +226,7 @@ impl LNVpsDb for LNVpsDbMysql {
.bind(vm.memory)
.bind(vm.disk_size)
.bind(vm.disk_id)
.bind(&vm.mac_address)
.fetch_one(&self.db)
.await
.map_err(Error::new)?